10

PHP スクリプトから ejabberd ユーザーを作成する必要があります。また、事前定義された共有名簿に新しいユーザーを追加できるようにする必要もあります。

ejabberdctl使用して電話するだけexec()ですか、それとももっと良い方法がありますか?

4

7 に答える 7

10

これが私の最終的な解決策です:

最も簡単な解決策となるjldupontのアドバイスのおかげでejabberdctl、私は遭遇した障害を乗り越え、実用的な解決策を手に入れました。

デフォルトでは、apacheのユーザーは正常に実行するための適切な特権を持っていませんejabberdctl(そして正当な理由があります)。したがって、それが機能するためには、で呼び出す必要がありますsudo。しかし...sudoパスワードが必要です。これには2つの問題があります。

  1. apacheユーザーはパスワードを持っていません。
  2. たとえそうだったとしても、PHPから入力する方法はありません。

解決策(Ubuntuの場合)-この行を最後に追加します/etc/sudoers

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

sudoersファイルとejabberdctlへのパスは、他のLinuxディストリビューションでは異なる場合があります。これにより、apacheのユーザー(www-data)はejabberdctl、昇格された特権でのみ、パスワードを必要とせずに実行できます。

残っているのはPHPコードだけです。

<?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>';
    }
?>

安全

によって実行できるコマンドは1つだけですが、これには重大なセキュリティリスクがあることに注意してくださいwww-data。このアプローチを使用する場合は、PHPコードを何らかの認証の背後で保護して、だれでも実行できるようにする必要があります。明らかなセキュリティリスクを超えて、サーバーがサービス拒否攻撃にさらされる可能性があります。

于 2009-10-27T20:52:47.183 に答える
7

私は2016年にこの質問に出くわしました。これを実装するには、受け入れられた回答と最も投票数の多い回答よりもはるかに簡単な方法があります。

  1. XMPP PHP ライブラリを使用します。最も一般的なものは次のとおりです。

https://github.com/fabiang/xmpp

  1. このライブラリはすぐに使用できるユーザーの追加をサポートしていませんが、非常に簡単に拡張できます

ユーザーを追加するために私が書いたクラスは次のとおりです。

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. デフォルトでは拒否されているため、ejabberd.cfg ファイルで帯域内登録を有効にする必要があります。

{アクセス、登録、[{許可、すべて}]}。

最後に、このクラスを使用するためのサンプル コードを次に示します。

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();
    }

サーバーに有効な SSL 証明書がない場合、ライブラリ呼び出しは失敗します。有効な証明書を配置するか、SocketClient.php のこの部分を以下のスニペットに置き換えます。

// 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
);
于 2016-01-29T18:35:59.323 に答える
4

この特定のケースでは、ejabberdctl が最も簡単です。その他のオプションは次のとおりです。

  • PHP で完全なクライアント XMPP を実装する (!)

  • リクエストをプロキシする Erlang でモジュールを実装します。PHP<-->Erlang 通信はソケットを介する必要があり、多くのマーシャリングが必要になります (!)

于 2009-10-26T19:42:32.787 に答える
1

XMPP プロトコル内で PHP を使用してこれを行うクリーンで安全な方法が必要な場合は、このサンプル スクリプトregister_user.phpを使用することをお勧めします。これは、 Jaxl PHP ライブラリ内にある例です。

Jaxl ライブラリをダウンロードして、次のように使用します。

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 $
于 2012-10-02T19:37:01.603 に答える
0

mod_register_web [ 1 , 2 ]で問題を解決しました。大量のコードを必要とせず、十分に安全だと思います。mod_register_web は、新しいユーザーを登録するためのシンプルな POST フォームを備えた html ページを提供します。

別の http リスナー (私の場合はポート 5281) でモジュールを有効にします。「ip」パラメーターを使用して、このポートをローカル リクエストでのみ使用できるようにします。

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: {}

リクエスト例:

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

リクエストは、適切なライブラリを使用してphpコードから実行できます(これはすでに私のフレームワークにありました)。

于 2016-02-27T12:53:23.190 に答える