diff options
author | Evan Prodromou <evan@controlezvous.ca> | 2008-06-26 02:46:46 -0400 |
---|---|---|
committer | Evan Prodromou <evan@controlezvous.ca> | 2008-06-26 02:46:46 -0400 |
commit | b560759df1700f95795bb7880b081cfe7913cc12 (patch) | |
tree | 04a276249a83dcb3282d7b4196a6769fbecd01da | |
parent | 9fe45d41580d8f7076dec5fd8cd71d3d3019b5e1 (diff) |
subscribe before sending confirmation message
darcs-hash:20080626064646-34904-d9b9bba1994626cc242e1ed7222762e8e3a90543.gz
-rw-r--r-- | lib/jabber.php | 53 | ||||
-rw-r--r-- | xmppdaemon.php | 69 |
2 files changed, 91 insertions, 31 deletions
diff --git a/lib/jabber.php b/lib/jabber.php index 97d02544d..2a557bfbe 100644 --- a/lib/jabber.php +++ b/lib/jabber.php @@ -44,9 +44,9 @@ function jabber_connect($resource=NULL) { common_config('xmpp', 'port'), common_config('xmpp', 'user'), common_config('xmpp', 'password'), - ($resource) ? $resource : + ($resource) ? $resource : common_config('xmpp', 'resource')); - + if (!$conn) { return false; } @@ -79,29 +79,34 @@ function jabber_send_presence($status=Null, $show='available', $to=Null) { function jabber_confirm_address($code, $nickname, $address) { - # FIXME: do we have to request presence first? - - $body = "Hey, $nickname."; - $body .= "\n\n"; - $body .= 'Someone just entered this IM address on '; - $body .= common_config('site', 'name') . '.'; - $body .= "\n\n"; - $body .= 'If it was you, and you want to confirm your entry, '; - $body .= 'use the URL below:'; - $body .= "\n\n"; - $body .= "\t".common_local_url('confirmaddress', - array('code' => $code)); - $body .= "\n\n"; - $body .= 'If not, just ignore this message.'; - $body .= "\n\n"; - $body .= 'Thanks for your time, '; - $body .= "\n"; - $body .= common_config('site', 'name'); - $body .= "\n"; - - jabber_send_message($address, $body); + # FIXME: above arguments are unused, we start the process with a + # subscription + # XXX: no idea what we do if the update daemon is already subscribed. + + jabber_special_presence('subscribe', $address); + } - + + +function jabber_special_presence($type, $to=NULL, $show=NULL, $status=NULL) { + $conn = jabber_connect(); + + $to = htmlspecialchars($to); + $status = htmlspecialchars($status); + $out = "<presence"; + if($to) $out .= " to='$to'"; + if($type) $out .= " type='$type'"; + if($show == 'available' and !$status) { + $out .= "/>"; + } else { + $out .= ">"; + if($show && ($show != 'available')) $out .= "<show>$show</show>"; + if($status) $out .= "<status>$status</status>"; + $out .= "</presence>"; + } + $conn->send($out); +} + function jabber_broadcast_notice($notice) { # First, get users subscribed to this profile # XXX: use a join here rather than looping through results diff --git a/xmppdaemon.php b/xmppdaemon.php index b71c93dc8..0906a869a 100644 --- a/xmppdaemon.php +++ b/xmppdaemon.php @@ -155,13 +155,35 @@ class XMPPDaemon { function handle_presence(&$pl) { $from = jabber_normalize_jid($pl['from']); - $user = User::staticGet('jabber', $from); - if (!$user) { - $this->log(LOG_WARNING, 'Message from unknown user ' . $from); - return; - } - if ($user->updatefrompresence) { - $this->add_notice($user, $pl); + switch ($pl['type']) { + case 'subscribe': + # We let anyone subscribe + $this->subscribed($from); + break; + case 'subscribed': + # Are we trying to confirm this address? + $confirm = Confirm_address::staticGet('address', $from); + if ($confirm) { + $this->send_confirmation_code($from, $confirm); + } + # Otherwise, silently ignore + break; + case 'unsubscribe': + case 'unsubscribed': + # XXX: do we care? + break; + default: + if (!$pl['type']) { + $user = User::staticGet('jabber', $from); + if (!$user) { + $this->log(LOG_WARNING, 'Message from unknown user ' . $from); + return; + } + if ($user->updatefrompresence) { + $this->add_notice($user, $pl); + } + } + break; } } @@ -172,6 +194,39 @@ class XMPPDaemon { function log($level, $msg) { common_log($level, 'XMPPDaemon('.$this->resource.'): '.$msg); } + + function subscribed($to) { + $this->special_presence('subscribed', $to); + } + + function special_presence($type, $to=NULL, $show=NULL, $status=NULL) { + $to = htmlspecialchars($to); + $status = htmlspecialchars($status); + $out = "<presence"; + if($to) $out .= " to='$to'"; + if($type) $out .= " type='$type'"; + if($show == 'available' and !$status) { + $out .= "/>"; + } else { + $out .= ">"; + if($show && ($show != 'available')) $out .= "<show>$show</show>"; + if($status) $out .= "<status>$status</status>"; + $out .= "</presence>"; + } + $this->conn->send($out); + } + + function send_confirmation_code($to, &$confirm) { + $body = 'Someone has asked to add this Jabber ID to their ' . + 'account on ' . common_config('site', 'name') . '. ' . + 'If it was you, you can confirm by clicking on this URL: ' . + common_local_url('confirmaddress', array('code' => $confirm->code)) . + ' . (If you cannot click it, copy-and-paste it into the ' . + 'address bar of your browser). If it wasn\'t you, ' . + 'just ignore this message.'; + + $this->conn->message($to, $body); + } } $daemon = new XMPPDaemon(); |