Пример #1
0
 public function handle($stanza, $parent = false)
 {
     $mec = (array) $stanza->mechanism;
     /*
      * Weird behaviour on old eJabberd servers, fixed on the new versions
      * see https://github.com/processone/ejabberd/commit/2d748115
      */
     if (isset($parent->starttls) && isset($parent->starttls->required)) {
         return;
     }
     $session = \Session::start();
     $user = $session->get('username');
     if ($user) {
         if (!is_array($mec)) {
             $mec = array($mec);
         }
         $mecchoice = str_replace('-', '', \Moxl\Auth::mechanismChoice($mec));
         $session->set('mecchoice', $mecchoice);
         \Moxl\Utils::log("/// MECANISM CHOICE " . $mecchoice);
         if (method_exists('\\Moxl\\Auth', 'mechanism' . $mecchoice)) {
             call_user_func('Moxl\\Auth::mechanism' . $mecchoice);
         } else {
             \Moxl\Utils::log("/// MECANISM CHOICE NOT FOUND");
         }
     } else {
         $g = new Get();
         $g->setTo($session->get('host'))->request();
     }
 }
Пример #2
0
 static function maker($to = false, $status = false, $show = false, $priority = 0, $type = false)
 {
     $session = \Sessionx::start();
     $dom = new \DOMDocument('1.0', 'UTF-8');
     $root = $dom->createElementNS('jabber:client', 'presence');
     $dom->appendChild($root);
     $root->setAttribute('from', $session->user . '@' . $session->host . '/' . $session->resource);
     $root->setAttribute('id', $session->id);
     if ($to != false) {
         $root->setAttribute('to', $to);
     }
     if ($type != false) {
         $root->setAttribute('type', $type);
     }
     if ($status != false) {
         $status = $dom->createElement('status', $status);
         $root->appendChild($status);
     }
     if ($show != false) {
         $show = $dom->createElement('show', $show);
         $root->appendChild($show);
     }
     if ($priority != 0) {
         $priority = $dom->createElement('priority', $priority);
         $root->appendChild($priority);
     }
     $c = $dom->createElementNS('http://jabber.org/protocol/caps', 'c');
     $c->setAttribute('hash', 'sha-1');
     $c->setAttribute('node', 'http://moxl.movim.eu/');
     $c->setAttribute('ext', 'pmuc-v1 share-v1 voice-v1 video-v1 camera-v1');
     $c->setAttribute('ver', \Moxl\Utils::generateCaps());
     $root->appendChild($c);
     return $dom->saveXML($dom->documentElement);
 }
Пример #3
0
 function ajaxGetForm($host)
 {
     $domain = \Moxl\Utils::getDomain($host);
     // We create a new session or clear the old one
     $s = Sessionx::start();
     $s->init(null, null, $host, $domain);
     \Moxl\Stanza\Stream::init($host);
 }
Пример #4
0
 public function handle($stanza, $parent = false)
 {
     $session = \Sessionx::start();
     Utils::log("/// AUTH SUCCESSFULL");
     $session->active = true;
     $session->password = '******';
     $this->pack($session);
     $this->deliver();
 }
Пример #5
0
 private function clean($instances)
 {
     $t = time();
     foreach ($instances as $key => $i) {
         if ($i['time'] < (int) $t - 30) {
             Utils::log('Action : Clean this request after 30 sec of no feedback ' . $i['type']);
             unset($instances[$key]);
         }
     }
     return $instances;
 }
Пример #6
0
 public function handle($stanza, $parent = false)
 {
     $session = \Session::start();
     $session->remove('password');
     $session->set('active', true);
     $session = \Sessionx::start();
     Utils::log("/// AUTH SUCCESSFULL");
     // And we tell the daemon that the session is started !
     fwrite(STDERR, 'started');
     $session->active = true;
     $this->pack($session);
     $this->deliver();
 }
Пример #7
0
 static function mechanismSCRAMSHA1()
 {
     $s = new SASL2();
     $fa = $s->factory('SCRAM-SHA1');
     $session = \Session::start();
     Utils::log("/// INITIAL MESSAGE");
     $response = base64_encode($fa->getResponse($session->get('username'), $session->get('password')));
     $session->set('saslfa', $fa);
     $dom = new \DOMDocument('1.0', 'UTF-8');
     $auth = $dom->createElementNS('urn:ietf:params:xml:ns:xmpp-sasl', 'auth', $response);
     $auth->setAttribute('mechanism', 'SCRAM-SHA-1');
     $dom->appendChild($auth);
     API::request($dom->saveXML($dom->documentElement));
 }
Пример #8
0
 static function mechanismSCRAMSHA1()
 {
     $s = new SASL2();
     $fa = $s->factory('SCRAM-SHA1');
     $session = \Sessionx::start();
     Utils::log("/// INITIAL MESSAGE");
     $response = base64_encode($fa->getResponse($session->user, $session->password));
     $sess = \Session::start();
     $sess->set('saslfa', $fa);
     $xml = '<auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="SCRAM-SHA-1">
                 ' . $response . '
             </auth>';
     API::request($xml);
 }
Пример #9
0
 /**
  * Deliver the packet
  *
  * @return void
  */
 public final function deliver()
 {
     $action_ns = 'Moxl\\Xec\\Action';
     if (get_parent_class($this) == $action_ns || get_parent_class(get_parent_class($this)) == $action_ns) {
         $class = str_replace(array($action_ns, '\\'), array('', '_'), get_class($this));
         $key = strtolower(substr($class, 1));
     } else {
         $class = strtolower(get_class($this));
         $pos = strrpos($class, '\\');
         $key = substr($class, $pos + 1);
     }
     if ($this->method) {
         $key = $key . '_' . $this->method;
     }
     Utils::log('Package : Event "' . $key . '" from "' . $this->packet->from . '" fired');
     $evt = new \Event();
     $evt->runEvent($key, $this->packet);
 }
Пример #10
0
 static function answer($to, $id)
 {
     $dom = new \DOMDocument('1.0', 'UTF-8');
     $query = $dom->createElementNS('http://jabber.org/protocol/disco#info', 'query');
     $query->setAttribute('node', 'http://moxl.movim.eu/#' . Utils::generateCaps());
     $identity = $dom->createElement('identity');
     $identity->setAttribute('category', 'client');
     $identity->setAttribute('type', 'web');
     $identity->setAttribute('name', 'Movim');
     $query->appendChild($identity);
     foreach (Utils::getSupportedServices() as $service) {
         $feature = $dom->createElement('feature');
         $feature->setAttribute('var', $service);
         $query->appendChild($feature);
     }
     $xml = \Moxl\API::iqWrapper($query, $to, 'result', $id);
     \Moxl\API::request($xml);
 }
Пример #11
0
 public function handle($stanza, $parent = false)
 {
     $sess = \Session::start();
     $session = \Sessionx::start();
     $s = new SASL2();
     switch ($sess->get('mecchoice')) {
         case 'SCRAMSHA1':
             $fa = $sess->get('saslfa');
             $sess->remove('saslfa');
             $challenge = base64_decode((string) $stanza);
             \Moxl\Utils::log("/// SECOND MESSAGE - PROOF");
             $response = base64_encode($fa->getResponse($session->user, $session->password, $challenge));
             $xml = '<response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">' . $response . '</response>';
             \Moxl\API::request($xml);
             break;
         case 'DIGESTMD5':
             $decoded = base64_decode((string) $stanza);
             $s = new SASL2();
             $d = $s->factory('digest-md5');
             if (!$sess->get('saslfirst')) {
                 \Moxl\Utils::log("/// CHALLENGE");
                 $response = $d->getResponse($session->user, $session->password, $decoded, $session->host, 'xmpp');
                 $response = base64_encode($response);
                 $xml = '<response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">' . $response . '</response>';
                 $sess->set('saslfirst', 1);
             } else {
                 $xml = '<response xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>';
             }
             \Moxl\API::request($xml);
             break;
         case 'CRAMMD5':
             $decoded = base64_decode((string) $stanza);
             $s = new SASL2();
             $c = $s->factory('cram-md5');
             $session = \Sessionx::start();
             $response = $c->getResponse($session->user, $session->pass, $decoded);
             $response = base64_encode($response);
             \Moxl\Utils::log("/// CHALLENGE");
             $xml = '<response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">' . $response . '</response>';
             \Moxl\API::request($xml);
             break;
     }
 }
Пример #12
0
 /**
  * Deliver the packet
  *
  * @return void
  */
 public final function deliver()
 {
     $action_ns = 'Moxl\\Xec\\Action';
     if (get_parent_class($this) == $action_ns || get_parent_class(get_parent_class($this)) == $action_ns) {
         $class = str_replace([$action_ns, '\\'], ['', '_'], get_class($this));
         $key = strtolower(substr($class, 1));
     } else {
         $class = strtolower(get_class($this));
         $pos = strrpos($class, '\\');
         $key = substr($class, $pos + 1);
     }
     if ($this->method) {
         $key = $key . '_' . $this->method;
     }
     if (!empty($this->packet->from)) {
         Utils::log('Package : Event "' . $key . '" from "' . $this->packet->from . '" fired');
     } else {
         Utils::log('Package : Event "' . $key);
     }
     $this->event($key, $this->packet);
 }
Пример #13
0
 function ajaxLogin($username)
 {
     $validate_user = Validator::string()->length(4, 40);
     if (!$validate_user->validate($username)) {
         Notification::append(null, $this->__('login_anonymous.bad_username'));
         return;
     }
     // We get the Server Configuration
     $cd = new \Modl\ConfigDAO();
     $config = $cd->get();
     $host = 'anonymous.jappix.com';
     $password = '******';
     // We try to get the domain
     $domain = \Moxl\Utils::getDomain($host);
     // We launch the XMPP socket
     RPC::call('register', $host);
     // We set the username in the session
     $s = Session::start();
     $s->set('username', $username);
     // We create a new session or clear the old one
     $s = Sessionx::start();
     $s->init($username, $password, $host, $domain);
     \Moxl\Stanza\Stream::init($host);
 }
Пример #14
0
$stdin_behaviour = function ($data) use(&$conn, $loop, &$buffer, &$connector, &$xmpp_behaviour, &$parser) {
    if (substr($data, -1) == "") {
        $messages = explode("", $buffer . substr($data, 0, -1));
        $buffer = '';
        foreach ($messages as $message) {
            #fwrite(STDERR, colorize($message, 'yellow')." : ".colorize('received from the browser', 'green')."\n");
            $msg = json_decode($message);
            if (isset($msg)) {
                if ($msg->func == 'message' && $msg->body != '') {
                    $msg = $msg->body;
                } elseif ($msg->func == 'unregister') {
                    \Moxl\Stanza\Stream::end();
                } elseif ($msg->func == 'register') {
                    $cd = new \Modl\ConfigDAO();
                    $config = $cd->get();
                    $domain = \Moxl\Utils::getDomain($msg->host);
                    #fwrite(STDERR, colorize('open a socket to '.$domain, 'yellow')." : ".colorize('sent to XMPP', 'green')."\n");
                    $connector->create($domain, 5222)->then($xmpp_behaviour);
                }
            } else {
                return;
            }
            $rpc = new \RPC();
            $rpc->handle_json($msg);
            $msg = json_encode(\RPC::commit());
            \RPC::clear();
            if (!empty($msg)) {
                echo base64_encode(gzcompress($msg, 9)) . "";
                #fwrite(STDERR, colorize($msg, 'yellow')." : ".colorize('sent to the browser', 'green')."\n");
            }
            $xml = \Moxl\API::commit();
Пример #15
0
 if (substr($data, -1) == "") {
     $messages = explode("", $buffer . substr($data, 0, -1));
     $buffer = '';
     foreach ($messages as $message) {
         #fwrite(STDERR, colorize($message, 'yellow')." : ".colorize('received from the browser', 'green')."\n");
         $msg = json_decode($message);
         if (isset($msg)) {
             if ($msg->func == 'message' && $msg->body != '') {
                 $msg = $msg->body;
             } elseif ($msg->func == 'unregister') {
                 \Moxl\Stanza\Stream::end();
             } elseif ($msg->func == 'register') {
                 $cd = new \Modl\ConfigDAO();
                 $config = $cd->get();
                 $port = 5222;
                 $dns = \Moxl\Utils::resolveHost($msg->host);
                 if (isset($dns->target) && $dns->target != null) {
                     $msg->host = $dns->target;
                 }
                 if (isset($dns->port) && $dns->port != null) {
                     $port = $dns->port;
                 }
                 #fwrite(STDERR, colorize('open a socket to '.$domain, 'yellow')." : ".colorize('sent to XMPP', 'green')."\n");
                 $connector->create($msg->host, $port)->then($xmpp_behaviour);
             }
         } else {
             return;
         }
         $rpc = new \RPC();
         $rpc->handle_json($msg);
         $msg = \RPC::commit();
Пример #16
0
 public static function generateCaps()
 {
     $s = '';
     $s .= 'client/web//Movim<';
     $support = Utils::getSupportedServices();
     asort($support);
     foreach ($support as $sup) {
         $s = $s . $sup . '<';
     }
     return base64_encode(sha1(utf8_encode($s), true));
 }
Пример #17
0
         case 'register':
             if (isset($conn) && is_resource($conn->stream)) {
                 $conn->stream->close();
             }
             $cd = new \Modl\ConfigDAO();
             $config = $cd->get();
             $port = 5222;
             $dns = \Moxl\Utils::resolveHost($msg->host);
             if (isset($dns->target) && $dns->target != null) {
                 $msg->host = $dns->target;
             }
             if (isset($dns->port) && $dns->port != null) {
                 $port = $dns->port;
             }
             #fwrite(STDERR, colorize('open a socket to '.$domain, 'yellow')." : ".colorize('sent to XMPP', 'green')."\n");
             $ip = \Moxl\Utils::resolveIp($msg->host);
             $ip = !$ip || !isset($ip->address) ? gethostbyname($msg->host) : $ip->address;
             fwrite(STDERR, colorize(getenv('sid'), 'yellow') . " : " . colorize('Connection to ' . $msg->host . ' (' . $ip . ')', 'blue') . "\n");
             $connector->create($ip, $port)->then($xmpp_behaviour);
             break;
     }
 } else {
     return;
 }
 $rpc = new \RPC();
 $rpc->handle_json($msg);
 $msg = \RPC::commit();
 \RPC::clear();
 if (!empty($msg)) {
     echo base64_encode(gzcompress(json_encode($msg), 9)) . "";
     //fwrite(STDERR, colorize(json_encode($msg), 'yellow')." : ".colorize('sent to the browser', 'green')."\n");
Пример #18
0
 function ajaxLogin($form)
 {
     // We get the Server Configuration
     $cd = new \Modl\ConfigDAO();
     $config = $cd->get();
     // First we check the form
     $validate_login = Validator::email()->length(6, 40);
     $validate_password = Validator::string()->length(4, 40);
     $login = $form->login->value;
     $password = $form->pass->value;
     if (!$validate_login->validate($login)) {
         $this->showErrorBlock('login_format');
         return;
     }
     if (!$validate_password->validate($password)) {
         $this->showErrorBlock('password_format');
         return;
     }
     list($username, $host) = explode('@', $login);
     // Check whitelisted server
     if ($config->xmppwhitelist != '' && !in_array($host, explode(',', $config->xmppwhitelist))) {
         $this->showErrorBlock('unauthorized');
         return;
     }
     // We check if we already have an open session
     $sd = new \Modl\SessionxDAO();
     $here = $sd->getHash(sha1($username . $password . $host));
     if ($here) {
         RPC::call('Login.setCookie', $here->session);
         RPC::call('movim_redirect', Route::urlize('main'));
         $this->showErrorBlock('conflict');
         return;
     }
     // We try to get the domain
     $domain = \Moxl\Utils::getDomain($host);
     // We launch the XMPP socket
     RPC::call('register', $host);
     // We create a new session or clear the old one
     $s = Sessionx::start();
     $s->init($username, $password, $host, $domain);
     \Moxl\Stanza\Stream::init($host);
 }
Пример #19
0
 public static function searchPayload($hash, $s, $sparent = false)
 {
     $hashToClass = array('9a534a8b4d6324e23f4187123e406729' => 'Message', '78e731027d8fd50ed642340b7c9a63b3' => 'Message', 'f9e18585fd0e0873c52e880c800f267a' => 'Receipt', '0977b7387b95f69007332a3e9b386f93' => 'MAMResult', '1040105fc01bfac8a5ab81324875e382' => 'Presence', '362b908ec9432a506f86bed0bae7bbb6' => 'Presence', 'a0e8e987b067b6b0470606f4f90d5362' => 'Roster', 'b5e3374e43f6544852f7751dfc529100' => 'Subject', 'fa9d41e26f664d9056618a4afe213861' => 'Post', '9952d726429340d482ecac82c1496191' => 'BOB', '4c9681f0e9aca8a5b65f86b8b80d490f' => 'DiscoInfo', '37ff18f136d5826c4426af5a23729e48' => 'Mood', '6b38ed328fb77617c6e4a5ac9dda0ad2' => 'Tune', '0981a46bbfa88b3500c4bccda18ccb89' => 'Location', '9c8ed44d4528a66484b0fbd44b0a9070' => 'Nickname', 'd8ea912a151202700bb399c9e04d205f' => 'Caps', '40ed26a65a25ab8bf809dd998d541d95' => 'PingPong', 'cb52f989717d25441018703ea1bc9819' => 'Attention', '54c22c37d17c78ee657ea3d40547a970' => 'Version', '1cb493832467273efa384bbffa6dc35a' => 'Avatar', '0f59aa7fb0492a008df1b807e91dda3b' => 'AvatarMetadata', '36fe2745bdc72b1682be2c008d547e3d' => 'Vcard4', 'd84d4b89d43e88a244197ccf499de8d8' => 'Jingle', '09ef1b34cf40fdd954f10d6e5075ee5c' => 'Carbons', '201fa54dd93e3403611830213f5f9fbc' => 'Carbons', 'b95746de5ddc3fa5fbf28906c017d9d8' => 'STARTTLS', 'f728271d924a04b0355379b28c3183a1' => 'SASL', '5e291b72f7160dabd1aa28f90cbde769' => 'SASLChallenge', 'abae1d63bb4295636badcce1bee02290' => 'SASLChallenge', 'a5af6a9efd75060b5aca9b473f1ef756' => 'SASLSuccess', '53936dd4e1d64e1eeec6dfc95c431964' => 'SASLSuccess', 'de175adc9063997df5b79817576ff659' => 'SASLFailure', '0bc0f510b2b6ac432e8605267ebdc812' => 'SessionBind', '128477f50347d98ee1213d71f27e8886' => 'SessionBind');
     if (isset($hashToClass[$hash])) {
         //if(file_exists($base.'Payload/'.$hashToClass[$hash].'.php')) {
         //    require_once($base.'Payload/'.$hashToClass[$hash].'.php');
         $classname = '\\Moxl\\Xec\\Payload\\' . $hashToClass[$hash];
         //if(class_exists($classname)) {
         //Utils::log('Handler : Call class "'.$hashToClass[$hash].'"');
         $payload_class = new $classname();
         $payload_class->prepare($s, $sparent);
         $payload_class->handle($s, $sparent);
         /*} else {
              Utils::log('Handler : Payload class "'.$hashToClass[$hash].'" not found');
           }*/
         /*} else {
               Utils::log('Handler : Payload file "'.$hashToClass[$hash].'" not found');
           }*/
     } else {
         Utils::log('Handler : This event is not listed');
         return true;
     }
 }