Search code examples
phpmysqlejabberd

ejabberd External Auth (PHP & MySQL)


When I start the server, it loops with the following error message:

C(<0.1211.0>:extauth:146) : extauth script has exitted abruptly with reason 'normal'

I'm using a PHP script I found on ejabberd's site. https://www.ejabberd.im/files/efiles/check_mysql.php.txt

Permissions should be correct and that error is the only one I get. Is the script outdated? Any idea on what might help?

I can provide more log files if you can tell me which would be more helpful.


Solution

  • The given script is outdated. I have slightly change it as follows. This is working for me. Give a try

    #!/usr/bin/php
    <?php
    
    error_reporting(0);
    
    
    $auth = new JabberAuth();
    $auth->dbhost = "localhost";
    $auth->dbuser = "root";
    $auth->dbpass = "123456";
    $auth->dbbase = "ejabberd";
    $auth->play(); // We simply start process !
    
    class JabberAuth {
        var $dbhost; /* MySQL server */
        var $dbuser; /* MySQL user */
        var $dbpass; /* MySQL password */
        var $dbbase; /* MySQL database where users are stored */
    
        var $jabber_user;   /* This is the jabber user passed to the script. filled by $this->command() */
        var $jabber_pass;   /* This is the jabber user password passed to the script. filled by $this->command() */
        var $jabber_server; /* This is the jabber server passed to the script. filled by $this->command(). Useful for VirtualHosts */
        var $jid;           /* Simply the JID, if you need it, you have to fill. */
        var $data;          /* This is what SM component send to us. */
    
        var $dateformat = "M d H:i:s"; /* Check date() for string format. */
        var $command; /* This is the command sent ... */
        var $mysock;  /* MySQL connection ressource */
        var $stdin;   /* stdin file pointer */
        var $stdout;  /* stdout file pointer */
    
        function JabberAuth()
        {
    
            $this->openstd();
        }
    
        function stop()
        {
    
            closelog();
            $this->closestd(); // Simply close files
            exit(0); // and exit cleanly
        }
    
        function openstd()
        {
            $this->stdout = @fopen("php://stdout", "w"); // We open STDOUT so we can read
            $this->stdin  = @fopen("php://stdin", "r"); // and STDIN so we can talk !
        }
    
        function readstdin()
        {
            $l      = @fgets($this->stdin, 3); // We take the length of string
            $length = @unpack("n", $l); // ejabberd give us something to play with ...
            $len    = $length["1"]; // and we now know how long to read.
            if($len > 0) { // if not, we'll fill logfile ... and disk full is just funny once
                $data   = @fgets($this->stdin, $len+1);
                $this->data = $data; // We set what we got.
    
            }
        }
    
        function closestd()
        {
            @fclose($this->stdin); // We close everything ...
            @fclose($this->stdout);
        }
    
        function out($message)
        {
            @fwrite($this->stdout, $message); // We reply ...
            $dump = @unpack("nn", $message);
            $dump = $dump["n"];
        }
    
        function myalive()
        {
            if(!is_resource($this->mysock) || !@mysql_ping($this->mysock)) { // check if we have a MySQL connection and if it's valid.
                $this->mysql(); // We try to reconnect if MySQL gone away ...
                return @mysqli_ping($this->mysock); // we simply try again, to be sure ...
            } else {
                return true; // so good !
            }
        }
    
        function play()
        {
            do {
                $this->readstdin(); // get data
                $length = strlen($this->data); // compute data length
                $ret = $this->command(); // play with data !
                $this->out($ret); // send what we reply.
                $this->data = NULL; // more clean. ...
            } while (true);
        }
    
        function command()
        {
    
    
            $data = $this->splitcomm(); // This is an array, where each node is part of what SM sent to us :
            // 0 => the command,
            // and the others are arguments .. e.g. : user, server, password ...
    
            if($this->myalive()) { // Check we can play with MySQL
    
                switch($data[0]) {
                    case "isuser": // this is the "isuser" command, used to check for user existance
                            $this->jabber_user = $data[1];
                            $return = $this->checkuser();
                        break;
    
                    case "auth": // check login, password
                            $this->jabber_user = $data[1];
                            $this->jabber_pass = $data[3];
                            $return = $this->checkpass();
    
                        break;
    
                    case "setpass":
                            $return = false; // We do not want jabber to be able to change password
                        break;
    
                    default:
                            $this->stop(); // if it's not something known, we have to leave.
                            // never had a problem with this using ejabberd, but might lead to problem ?
                        break;
                }
    
    
    
                return @pack("nn", 2, $return);
            } else {
    
                return @pack("nn", 2, 0); // it's so bad.
            }
        }
    
        function checkpass()
        {
            /*
             * Put here your code to check password
             * $this->jabber_user
             * $this->jabber_pass
             * $this->jabber_server
             */
            if(1) { // You need to modify this
                return true;
            } else {
                return false;
            }
        }
    
        function checkuser()
        {
            /*
             * Put here your code to check user
             * $this->jabber_user
             * $this->jabber_pass
             * $this->jabber_server
             */
            if(1) { // You need to modify this
                return true;
            } else {
                return false;
            }
        }
    
        function splitcomm() // simply split command and arugments into an array.
        {
            return explode(":", $this->data);
        }
    
        function mysql() // "MySQL abstraction", this opens a permanent MySQL connection, and fill the ressource
        {
    
            $this->mysock = mysqli_connect($this->dbhost,$this->dbuser,$this->dbpass,$this->dbbase);
    
        }
    }
    
    ?>