diff --git a/actions/imsettings.php b/actions/imsettings.php index 4ad63e1ccf..bad0bc18a4 100644 --- a/actions/imsettings.php +++ b/actions/imsettings.php @@ -185,12 +185,12 @@ class ImsettingsAction extends SettingsAction { return; } - # XXX: queue for offline sending - - jabber_confirm_address($confirm->code, - $user->nickname, - $jabber); - + if (!common_config('queue', 'enabled')) { + jabber_confirm_address($confirm->code, + $user->nickname, + $jabber); + } + # XXX: I18N $msg = 'A confirmation code was sent to the IM address you added. ' . @@ -246,9 +246,7 @@ class ImsettingsAction extends SettingsAction { } $user->query('COMMIT'); - # Unsubscribe to the old address - - jabber_special_presence('unsubscribe', $jabber); + # XXX: unsubscribe to the old address $this->show_form(_t('The address was removed.'), TRUE); } diff --git a/lib/jabber.php b/lib/jabber.php index 9b6d1c71a6..0b5aae4ea8 100644 --- a/lib/jabber.php +++ b/lib/jabber.php @@ -93,7 +93,7 @@ function jabber_confirm_address($code, $nickname, $address) { 'address bar of your browser). If that user isn\'t you, ' . 'or if you didn\'t request this confirmation, just ignore this message.'; - jabber_send_message($address, $body); + return jabber_send_message($address, $body); } function jabber_special_presence($type, $to=NULL, $show=NULL, $status=NULL) { diff --git a/xmppdaemon.php b/xmppdaemon.php index b07f44cffa..772e99d3dd 100755 --- a/xmppdaemon.php +++ b/xmppdaemon.php @@ -93,6 +93,7 @@ class XMPPDaemon { } $this->broadcast_queue(); + $this->confirmation_queue(); } } @@ -312,7 +313,6 @@ class XMPPDaemon { function clear_old_claims() { $qi = new Queue_item(); - $qi->claimed = NULL; $qi->whereAdd('now() - claimed > '.CLAIM_TIMEOUT); $qi->update(DB_DATAOBJECT_WHEREADD_ONLY); } @@ -321,6 +321,71 @@ class XMPPDaemon { $user = User::staticGet($notice->profile_id); return !$user; } + + function confirmation_queue() { + $this->clear_old_confirm_claims(); + $this->log(LOG_INFO, 'checking for queued confirmations'); + do { + $confirm = $this->next_confirm(); + if ($confirm) { + $this->log(LOG_INFO, 'Sending confirmation for ' . $confirm->address); + $user = User::staticGet($confirm->user_id); + if (!$user) { + $this->log(LOG_WARNING, 'Confirmation for unknown user ' . $confirm->user_id); + continue; + } + + $success = jabber_confirm_address($confirm->code, + $user->nickname, + $jabber); + if (!$success) { + $this->log(LOG_ERROR, 'Confirmation failed for ' . $confirm->address); + # Just let the claim age out; hopefully things work then + continue; + } else { + $this->log(LOG_INFO, 'Confirmation sent for ' . $confirm->address); + # Mark confirmation sent + $original = clone($confirm); + $confirm->sent = DB_DataObject_Cast::dateTime(); + $result = $confirm->update($original); + if (!$result) { + $this->log(LOG_ERROR, 'Cannot mark sent for ' . $confirm->address); + # Just let the claim age out; hopefully things work then + continue; + } + } + } + } while ($confirm); + } + + function next_confirm() { + $confirm = new Confirm_address(); + $confirm->sent = NULL; + $confirm->claimed = NULL; + $confirm->orderBy('modified DESC'); + $confirm->limit(1); + if ($confirm->find(TRUE)) { + $this->log(LOG_INFO, 'Claiming confirmation for ' . $confirm->address); + $original = clone($confirm); + $confirm->claimed = DB_DataObject_Cast::dateTime(); + $result = $confirm->update($original); + if ($result) { + $this->log(LOG_INFO, 'Succeeded in claim!'); + return $confirm; + } else { + $this->log(LOG_INFO, 'Failed in claim!'); + return false; + } + } + return NULL; + } + + function clear_old_confirm_claims() { + $confirm = new Confirm(); + $confirm->whereAdd('now() - claimed > '.CLAIM_TIMEOUT); + $confirm->update(DB_DATAOBJECT_WHEREADD_ONLY); + } + } $resource = ($argc > 1) ? $argv[1] : NULL;