diff --git a/scripts/xmppdaemon.php b/scripts/xmppdaemon.php index ed523cd814..b1cdb914c1 100755 --- a/scripts/xmppdaemon.php +++ b/scripts/xmppdaemon.php @@ -73,7 +73,7 @@ class XMPPDaemon { function handle() { $this->conn->addEventHandler('message', 'handle_message', $this); $this->conn->addEventHandler('presence', 'handle_presence', $this); - + $this->conn->process(); } @@ -91,6 +91,17 @@ class XMPPDaemon { } $from = jabber_normalize_jid($pl['from']); + + # Forwarded from another daemon (probably a broadcaster) for + # us to handle + + if (preg_match('/^'.jabber_daemon_address().'/', $from)) { + $from = $this->get_ofrom($pl); + if (is_null($from)) { + return; + } + } + $user = $this->get_user($from); if (!$user) { @@ -118,6 +129,26 @@ class XMPPDaemon { } } + function get_ofrom($pl) { + $xml = $pl['raw']; + $addresses = $xml->sub('adddresses'); + if (!$addresses) { + $this->log(LOG_WARNING, 'Forwarded message without addresses'); + return NULL; + } + $address = $xml->sub('address'); + if (!$address) { + $this->log(LOG_WARNING, 'Forwarded message without address'); + return NULL; + } + $type = $address->attr('type'); + if ($type != 'ofrom') { + $this->log(LOG_WARNING, 'Type of forwarded message is not ofrom'); + return NULL; + } + return $address->attr('jid'); + } + function is_autoreply($txt) { if (preg_match('/[\[\(]?[Aa]uto-?[Rr]eply[\]\)]/', $txt)) { return true; diff --git a/scripts/xmppqueuehandler.php b/scripts/xmppqueuehandler.php index 83928982bf..a82f5b9445 100755 --- a/scripts/xmppqueuehandler.php +++ b/scripts/xmppqueuehandler.php @@ -36,11 +36,11 @@ set_error_handler('common_error_handler'); class XmppQueueHandler extends QueueHandler { var $conn = NULL; - + function transport() { return 'jabber'; } - + function start() { # Low priority; we don't want to receive messages $this->conn = jabber_connect($this->_id, NULL, -1); @@ -56,11 +56,29 @@ class XmppQueueHandler extends QueueHandler { # Process the queue for a second $this->conn->processTime(1); } - + function finish() { } - + function forward_message(&$pl) { + $listener = $this->listener(); + $this->log(LOG_INFO, 'Forwarding message from ' . $pl['from'] . ' to ' . $listener); + $this->conn->message($this->listener(), $pl['body'], 'chat', NULL, $this->ofrom($pl['from'])); + } + + function ofrom($from) { + $address = "\n"; + $address .= "
\n"; + $address .= "\n"; + return $address; + } + + function listener() { + if (common_config('xmpp', 'listener')) { + return common_config('xmpp', 'listener'); + } else { + return jabber_daemon_address() . '/' . common_config('xmpp','resource') . '-listener'; + } } }