From b560759df1700f95795bb7880b081cfe7913cc12 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 26 Jun 2008 02:46:46 -0400 Subject: [PATCH] subscribe before sending confirmation message darcs-hash:20080626064646-34904-d9b9bba1994626cc242e1ed7222762e8e3a90543.gz --- lib/jabber.php | 51 ++++++++++++++++++++----------------- xmppdaemon.php | 69 +++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 90 insertions(+), 30 deletions(-) diff --git a/lib/jabber.php b/lib/jabber.php index 97d02544d6..2a557bfbe5 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"; + # 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); - jabber_send_message($address, $body); } - + + +function jabber_special_presence($type, $to=NULL, $show=NULL, $status=NULL) { + $conn = jabber_connect(); + + $to = htmlspecialchars($to); + $status = htmlspecialchars($status); + $out = "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 b71c93dc81..0906a869aa 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 = "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();