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(); } }
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); }
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); }
public function handle($stanza, $parent = false) { $session = \Sessionx::start(); Utils::log("/// AUTH SUCCESSFULL"); $session->active = true; $session->password = '******'; $this->pack($session); $this->deliver(); }
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; }
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(); }
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)); }
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); }
/** * 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); }
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); }
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; } }
/** * 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); }
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); }
$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();
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();
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)); }
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");
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); }
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; } }