سؤال

أنا بحاجة إلى إنشاء ejabberd المستخدم من البرنامج النصي PHP.أنا أيضا بحاجة إلى أن تكون قادرا على إضافة مستخدم جديد إلى مجموعة محددة مسبقا المشتركة القائمة.

يجب أن أتصل ejabberdctl باستخدام exec() أم أن هناك طريقة أفضل ؟

هل كانت مفيدة؟

المحلول

ejabberdctl هو إلى حد بعيد أسهل في هذه الحالة المحددة.الخيارات الأخرى هي:

  • تنفيذ كامل العميل XMPP في PHP (!)

  • تنفيذ وحدة في إرلانج أن وكلاء الطلبات:PHP<-->إرلانج الاتصالات سوف تحتاج إلى أن تكون من خلال مأخذ والكثير من تنظيم مشاركة (!)

نصائح أخرى

هنا هو بلدي الحل النهائي:

شكرا jldupont نصيحة أن ejabberdctl سيكون الحل الأسهل ، ضغطت على طريق العقبات التي صادفت ولها حل العاملة.

بشكل افتراضي ، أباتشي لم يكن لدى المستخدم الامتيازات الصحيحة لتشغيل بنجاح ejabberdctl (لسبب وجيه).وذلك من أجل العمل ، يجب أن تتصل مع sudo.ولكن... sudo يتطلب كلمة مرور ، الذي يعرض المشاكل 2:

  1. أباتشي المستخدم لا يملك كلمة السر.
  2. حتى لو كان هل يوجد طريقة للدخول إليها من PHP.

الحل (أوبونتو) - إضافة هذا السطر في نهاية /etc/sudoers:

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

المسار إلى sudoers الملف ejabberdctl قد تختلف عن غيرها من توزيعات لينكس.هذا يسمح أباتشي المستخدم (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>';
    }
?>

الأمن

من المهم أن نلاحظ أن هذا لا يشكل مخاطر أمنية كبيرة على الرغم من أنك السماح فقط أمر واحد ليتم تشغيلها من قبل www-data.إذا كنت تستخدم هذا النهج ، تحتاج إلى تأكد من حماية رمز PHP خلف نوعا من التوثيق بحيث لا مجرد أي شخص يمكن أن تجعل تنفيذ.أبعد من مخاطر أمنية واضحة ، فإنه يمكن فتح الخادم الخاص بك تصل إلى الحرمان من الخدمة الهجوم.

جئت على هذا السؤال في عام 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
);

إذا كنت تريد طريقة نظيفة وآمنة للقيام بذلك PHP باستخدام ضمن بروتوكول XMPP، وسوف ننصح بالعمل مع هذا المثال النصي <لأ href = "https://github.com/abhinavsingh/JAXL/blob/v3.x /examples/register_user.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 $

وأسهل طريقة للقيام بذلك هو استخدام mod_xmlrpc - والذي يسمح لك لتشغيل الأوامر ejabberdctl باستخدام XMLRPC. هذا سهلة الاستخدام مع مكتبة مثل:

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

لقد حللت المشكلة mod_register_web [1, 2].أنها لا تتطلب طن من الكود و هو آمن بما فيه الكفاية.mod_register_web توفر صفحة 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 المناسبة مكتبة (الذي كان بالفعل في الإطار).

وحليقة -XPOST 127.0.0.1:5281/api/register -d '{ "المستعمل": "محظوظ"، "المضيف": "data.com"، "كلمة السر": "اختبار"}

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top