Frage

Ich brauche einen ejabberd Benutzer von einem PHP-Skript zu erstellen. Ich muß auch in der Lage sein, den neuen Benutzer auf einen vordefinierten gemeinsamen Dienstplan hinzuzufügen.

Soll ich einfach anrufen ejabberdctl mit exec() oder gibt es einen besseren Weg?

War es hilfreich?

Lösung

ejabberdctl ist bei weitem der einfachste in diesem speziellen Fall. Die anderen Optionen sind:

  • Implementieren Sie eine vollständige Client XMPP in PHP (!)

  • ein Modul in Erlang implementieren, der die Anfragen Proxies: - (!) Die PHP <> Erlang Kommunikation über eine Buchse und eine Menge Marshalling sein, müssten würde beteiligt

Andere Tipps

Hier ist meine endgültige Lösung:

Danke href="https://stackoverflow.com/questions/1626897/create-ejabberd-user-from-php/1626921#1626921"> jldupont Rat an dass ejabberdctl die einfachste Lösung wäre, drückte ich durch die Hindernisse auf ich lief in und haben eine funktionierende Lösung.

In der Standardeinstellung Apache Benutzer nicht über die richtigen Berechtigungen erfolgreich ejabberdctl (aus gutem Grund) laufen. Also, um für sie zu arbeiten, müssen Sie es mit sudo nennen. Aber ... sudo ein Passwort benötigt, die 2 Probleme präsentiert:

  1. Der Apache-Benutzer nicht über ein Passwort.
  2. Selbst wenn es so wäre, gibt es keine Möglichkeit, es von PHP zu geben.

Solution (für Ubuntu) - fügen Sie diese Zeile am Ende /etc/sudoers:

www-data ALL= (ejabberd) NOPASSWD: /usr/sbin/ejabberdctl

Der Pfad zur Datei sudoers und ejabberdctl für andere Linux-Distributionen kann variieren. Auf diese Weise kann die Apache-Benutzer (www-data) nur ejabberdctl mit erweiterten Rechten ausführen und ohne ein Passwort erforderlich ist.

Alles bleibt, ist der PHP-Code:

<?php
    $username = 'tester';
    $password = 'testerspassword';
    $node = 'myserver.com';
    exec('sudo -u ejabberd /usr/sbin/ejabberdctl register '.$username.' '.$node.' '.$password.' 2>&1',$output,$status);
    if($output == 0)
    {
        // Success!
    }
    else
    {
        // Failure, $output has the details
        echo '<pre>';
        foreach($output as $o)
        {
            echo $o."\n";
        }
        echo '</pre>';
    }
?>

Sicherheit

Es ist wichtig zu beachten, dass dies ein erhebliches Sicherheitsrisiko, jedoch ist, auch wenn Sie nur sind damit ein Befehl von www-data ausgeführt werden. Wenn Sie diesen Ansatz verwenden, müssen Sie Ihnen den PHP-Code hinter einer Art von Authentifizierung stellen Sie sicher, zu schützen, so dass nicht jeder kann es ausführen machen. Neben den offensichtlichen Sicherheitsrisiken, es den Server bis zu einem Denial-of-Service-Angriff öffnen konnte.

ich auf dieser Frage kam im Jahr 2016, gibt es viel einfache Möglichkeiten, dies als die akzeptierten Antwort zu implementieren und die höchsten gestimmt ein.

  1. Verwenden Sie eine XMPP-PHP-Bibliothek, die am häufigsten ein Wesen:

https://github.com/fabiang/xmpp

  1. Während diese Bibliothek nicht einen Benutzer aus der Box unterstützt leider hinzufügen, können Sie sehr leicht erweitern es

Hier ist die Klasse, die ich für das Hinzufügen eines Benutzers schrieb:

use Fabiang\Xmpp\Util\XML;

/**
 * Register new user
 * @param string $username
 * @param string $password
 * @param string $email
 * @package XMPP\Protocol
 * @category XMPP
 */
class Register implements ProtocolImplementationInterface
{  
    protected $username;
    protected $password;
    protected $email;

    /**
     * Constructor.
     *
     * @param string $username
     * @param string $password
     * @param string $email
     */
    public function __construct($username, $password, $email)
    {
        $this->username = $username;
        $this->password = $password;
        $this->email = $email;
    }

    /**
     * Build XML message
     * @return type
     */
    public function toString()
    {
        $query = "<iq type='set' id='%s'><query xmlns='jabber:iq:register'><username>%s</username><password>%s</password><email>%s</email></query></iq>";        
        return XML::quoteMessage($query, XML::generateId(), (string) $this->username, (string) $this->password, (string) $this->email);
    }
}
  1. Sie müssen in-Band-Registrierung in der ejabberd.cfg Datei aktivieren, da es standardmäßig verweigert hat:
  

{Zugang, registrieren [{erlauben, all}]}.

hier Schließlich ist ein Beispielcode für die Verwendung dieser Klasse:

private function registerChatUser($name, $password, $email)
    {       
        $address = 'tcp://yourserverip:5222';
        $adminUsername = 'youradmin';
        $adminPassword = 'youradminpassword';

        $options = new Options($address);
        $options->setUsername($adminUsername)->setPassword($adminPassword);

        $client = new Client($options);         
        $client->connect();             

        $register = new Register($name, $password, $email);                 
        $client->send($register);   

        $client->disconnect();
    }

Die Bibliothek Aufruf schlägt fehl, wenn der Server nicht über ein gültiges SSL-Zertifikat. Entweder ein gültiges Zertifikat vergeben, oder diesen Teil in SocketClient.php ersetzen mit dem unter Schnipsel

// call stream_socket_client with custom error handler enabled
$handler = new ErrorHandler(
    function ($address, $timeout, $flags) {
        $options = [
            'ssl' => [
                'allow_self_signed' => true,
                'verify_peer_name' => false,
            ],
        ];
        $context = stream_context_create($options);
        return stream_socket_client($address, $errno, $errstr, $timeout, $flags, $context);
    },
    $this->address,
    $timeout,
    $flags
);

Wenn Sie eine saubere und sichere Art und Weise, dies zu tun mit PHP innerhalb XMPP-Protokolls wollen, werde ich mit diesem Beispielskript empfehlen Arbeits register_user.php . Dies ist ein Beispiel, das in Jaxl PHP-Bibliothek gefunden werden kann.

Herunterladen Jaxl Bibliothek und verwenden Sie wie folgt vor:

JAXL $ php examples/register_user.php localhost
Choose a username and password to register with this server
username:test_user
password:test_pass
registration successful
shutting down...
JAXL $

Der einfachste Weg, dies zu tun, wird mit mod_xmlrpc - mit dem Sie die ejabberdctl Befehlen xmlrpc laufen zu lassen. Das ist einfach, mit einer Bibliothek zu verwenden, wie zum Beispiel:

https://github.com/gamenet/php-jabber-rpc

/* Add user to Jabber */
use \GameNet\Jabber\RpcClient;
use \GameNet\Jabber\Mixins\UserTrait;
$rpc = new RpcClient([
        'server' => 'jabber.org:4560',
        'host' => 'myhost.org',
        'debug' => false,
    ]);

$result=$rpc->createUser( $username, $password );

Ich habe das Problem mit gelöst mod_register_web [ 1 , 2 ]. Es erfordert nicht Tonnen von Code und, glaube ich, sicher genug ist. mod_register_web bietet HTML-Seite mit einfacher POST Form neue Benutzer zu registrieren.

Aktivieren Modul unter separaten http Hörer (in meinem Fall Port 5281). Machen Sie diesen Anschluss nur für lokale Anfragen mit "ip" Parameter.

listen:
  port: 5280
  module: ejabberd_http
  web_admin: true
  http_bind: true
  ## register: true

ip: "127.0.0.1"   # Only local requests allowed for user registration
  port: 5281
  module: ejabberd_http
  register: true

modules:
  mod_register_web: {}

Anfrage Beispiel:

curl -XPOST 127.0.0.1:5281/register/new -d 'username=lucky&host=vHost&password=test&password2=test'

Die Anforderung kann von PHP-Code mit entsprechender Bibliothek ausgeführt werden (die bereits in meinem Rahmen war).

curl -XPOST 127.0.0.1:5281/api/register -d '{ "user": "Glück", "host": "data.com", "Passwort": "test"}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top