/** * @TODO DESCR */ public function createXMLStream() { $this->xml = new XMLStream(); $this->xml->setDefaultNS('jabber:client'); $this->xml->addXPathHandler('{http://etherx.jabber.org/streams}features', function ($xml) { /** @var XMLStream $xml */ if ($xml->hasSub('starttls') and $this->use_encryption) { $this->sendXML("<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'><required /></starttls>"); } elseif ($xml->hasSub('bind') and $this->authorized) { $id = $this->getId(); $this->iqSet('<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>' . $this->path . '</resource></bind>', function ($xml) { if ($xml->attrs['type'] === 'result') { $this->fulljid = $xml->sub('bind')->sub('jid')->data; $jidarray = explode('/', $this->fulljid); $this->jid = $jidarray[0]; } $this->iqSet('<session xmlns="urn:ietf:params:xml:ns:xmpp-session" />', function ($xml) { $this->roster = new XMPPRoster($this); if ($this->onConnected) { $this->connected = true; $this->onConnected->executeAll($this); $this->onConnected = null; } $this->event('connected'); }); }); } else { if (strlen($this->password)) { $this->sendXML("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>" . base64_encode("" . $this->user . "" . $this->password) . "</auth>"); } else { $this->sendXML("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='ANONYMOUS'/>"); } } }); $this->xml->addXPathHandler('{urn:ietf:params:xml:ns:xmpp-sasl}success', function ($xml) { $this->authorized = true; $this->xml->finish(); $this->createXMLStream(); $this->startXMLStream(); }); $this->xml->addXPathHandler('{urn:ietf:params:xml:ns:xmpp-sasl}failure', function ($xml) { if ($this->onConnected) { $this->connected = false; call_user_func($this->onConnected, $this); $this->onConnected = null; } $this->finish(); }); $this->xml->addXPathHandler('{urn:ietf:params:xml:ns:xmpp-tls}proceed', function ($xml) { Daemon::log("XMPPClient: TLS not supported."); }); $this->xml->addXPathHandler('{jabber:client}message', function ($xml) { if (isset($xml->attrs['type'])) { $payload['type'] = $xml->attrs['type']; } else { $payload['type'] = 'chat'; } $payload['xml'] = $xml; $payload['from'] = $xml->attrs['from']; if ($xml->hasSub('body')) { $payload['body'] = $xml->sub('body')->data; $this->event('message', $payload); } }); }