]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
replace all tabs with four spaces
authorEvan Prodromou <evan@prodromou.name>
Tue, 23 Dec 2008 19:19:07 +0000 (14:19 -0500)
committerEvan Prodromou <evan@prodromou.name>
Tue, 23 Dec 2008 19:19:07 +0000 (14:19 -0500)
The PEAR coding standards decree: no tabs, but indent by four spaces.
I've done a global search-and-replace on all tabs, replacing them by
four spaces. This is a huge change, but it will go a long way to
getting us towards phpcs-compliance. And that means better code
readability, and that means more participation.

darcs-hash:20081223191907-84dde-21e8efe210e6d5d54e935a22d0cee5c7bbfc007d.gz

273 files changed:
_darcs/inventory
_darcs/patches/20081223191907-84dde-21e8efe210e6d5d54e935a22d0cee5c7bbfc007d.gz [new file with mode: 0644]
_darcs/pristine/actions/accesstoken.php
_darcs/pristine/actions/all.php
_darcs/pristine/actions/allrss.php
_darcs/pristine/actions/api.php
_darcs/pristine/actions/avatarbynickname.php
_darcs/pristine/actions/block.php
_darcs/pristine/actions/confirmaddress.php
_darcs/pristine/actions/deletenotice.php
_darcs/pristine/actions/deleteprofile.php
_darcs/pristine/actions/disfavor.php
_darcs/pristine/actions/doc.php
_darcs/pristine/actions/emailsettings.php
_darcs/pristine/actions/facebookhome.php
_darcs/pristine/actions/facebookinvite.php
_darcs/pristine/actions/facebookremove.php
_darcs/pristine/actions/facebooksettings.php
_darcs/pristine/actions/favor.php
_darcs/pristine/actions/favorited.php
_darcs/pristine/actions/favoritesrss.php
_darcs/pristine/actions/featured.php
_darcs/pristine/actions/finishaddopenid.php
_darcs/pristine/actions/finishimmediate.php
_darcs/pristine/actions/finishopenidlogin.php
_darcs/pristine/actions/finishremotesubscribe.php
_darcs/pristine/actions/foaf.php
_darcs/pristine/actions/imsettings.php
_darcs/pristine/actions/invite.php
_darcs/pristine/actions/login.php
_darcs/pristine/actions/logout.php
_darcs/pristine/actions/microsummary.php
_darcs/pristine/actions/newmessage.php
_darcs/pristine/actions/newnotice.php
_darcs/pristine/actions/noticesearch.php
_darcs/pristine/actions/noticesearchrss.php
_darcs/pristine/actions/nudge.php
_darcs/pristine/actions/openidlogin.php
_darcs/pristine/actions/openidsettings.php
_darcs/pristine/actions/opensearch.php
_darcs/pristine/actions/othersettings.php
_darcs/pristine/actions/peoplesearch.php
_darcs/pristine/actions/peopletag.php
_darcs/pristine/actions/postnotice.php
_darcs/pristine/actions/profilesettings.php
_darcs/pristine/actions/public.php
_darcs/pristine/actions/publicrss.php
_darcs/pristine/actions/publicxrds.php
_darcs/pristine/actions/recoverpassword.php
_darcs/pristine/actions/register.php
_darcs/pristine/actions/remotesubscribe.php
_darcs/pristine/actions/replies.php
_darcs/pristine/actions/repliesrss.php
_darcs/pristine/actions/requesttoken.php
_darcs/pristine/actions/showfavorites.php
_darcs/pristine/actions/showmessage.php
_darcs/pristine/actions/shownotice.php
_darcs/pristine/actions/showstream.php
_darcs/pristine/actions/smssettings.php
_darcs/pristine/actions/subedit.php
_darcs/pristine/actions/subscribe.php
_darcs/pristine/actions/subscribers.php
_darcs/pristine/actions/subscriptions.php
_darcs/pristine/actions/sup.php
_darcs/pristine/actions/tag.php
_darcs/pristine/actions/tagother.php
_darcs/pristine/actions/tagrss.php
_darcs/pristine/actions/twitapiaccount.php
_darcs/pristine/actions/twitapiblocks.php
_darcs/pristine/actions/twitapidirect_messages.php
_darcs/pristine/actions/twitapifavorites.php
_darcs/pristine/actions/twitapifriendships.php
_darcs/pristine/actions/twitapihelp.php
_darcs/pristine/actions/twitapinotifications.php
_darcs/pristine/actions/twitapistatuses.php
_darcs/pristine/actions/twitapiusers.php
_darcs/pristine/actions/twittersettings.php
_darcs/pristine/actions/unblock.php
_darcs/pristine/actions/unsubscribe.php
_darcs/pristine/actions/updateprofile.php
_darcs/pristine/actions/userauthorization.php
_darcs/pristine/actions/userbyid.php
_darcs/pristine/actions/userrss.php
_darcs/pristine/actions/xrds.php
_darcs/pristine/classes/Avatar.php
_darcs/pristine/classes/Channel.php
_darcs/pristine/classes/Command.php
_darcs/pristine/classes/CommandInterpreter.php
_darcs/pristine/classes/Fave.php
_darcs/pristine/classes/Foreign_link.php
_darcs/pristine/classes/Foreign_user.php
_darcs/pristine/classes/Memcached_DataObject.php
_darcs/pristine/classes/Message.php
_darcs/pristine/classes/Notice.php
_darcs/pristine/classes/NoticeWrapper.php
_darcs/pristine/classes/Notice_tag.php
_darcs/pristine/classes/Profile.php
_darcs/pristine/classes/Profile_tag.php
_darcs/pristine/classes/Queue_item.php
_darcs/pristine/classes/Sms_carrier.php
_darcs/pristine/classes/Subscription.php
_darcs/pristine/classes/User.php
_darcs/pristine/lib/common.php
_darcs/pristine/lib/deleteaction.php
_darcs/pristine/lib/facebookaction.php
_darcs/pristine/lib/oauthstore.php
_darcs/pristine/lib/omb.php
_darcs/pristine/lib/openid.php
_darcs/pristine/lib/personal.php
_darcs/pristine/lib/profilelist.php
_darcs/pristine/lib/queuehandler.php
_darcs/pristine/lib/rssaction.php
_darcs/pristine/lib/search_engines.php
_darcs/pristine/lib/searchaction.php
_darcs/pristine/lib/settingsaction.php
_darcs/pristine/lib/stream.php
_darcs/pristine/lib/subs.php
_darcs/pristine/lib/theme.php
_darcs/pristine/lib/twitter.php
_darcs/pristine/lib/twitterapi.php
_darcs/pristine/lib/xmppqueuehandler.php
_darcs/pristine/scripts/enjitqueuehandler.php
_darcs/pristine/scripts/fixup_hashtags.php
_darcs/pristine/scripts/fixup_inboxes.php
_darcs/pristine/scripts/fixup_notices_rendered.php
_darcs/pristine/scripts/getpiddir.php
_darcs/pristine/scripts/inbox_users.php
_darcs/pristine/scripts/jabberqueuehandler.php
_darcs/pristine/scripts/maildaemon.php
_darcs/pristine/scripts/ombqueuehandler.php
_darcs/pristine/scripts/publicqueuehandler.php
_darcs/pristine/scripts/sitemap.php
_darcs/pristine/scripts/smsqueuehandler.php
_darcs/pristine/scripts/synctwitterfriends.php
_darcs/pristine/scripts/update_translations.php
_darcs/pristine/scripts/xmppconfirmhandler.php
_darcs/pristine/scripts/xmppdaemon.php
_darcs/tentative_pristine
actions/accesstoken.php
actions/all.php
actions/allrss.php
actions/api.php
actions/avatarbynickname.php
actions/block.php
actions/confirmaddress.php
actions/deletenotice.php
actions/deleteprofile.php
actions/disfavor.php
actions/doc.php
actions/emailsettings.php
actions/facebookhome.php
actions/facebookinvite.php
actions/facebookremove.php
actions/facebooksettings.php
actions/favor.php
actions/favorited.php
actions/favoritesrss.php
actions/featured.php
actions/finishaddopenid.php
actions/finishimmediate.php
actions/finishopenidlogin.php
actions/finishremotesubscribe.php
actions/foaf.php
actions/imsettings.php
actions/invite.php
actions/login.php
actions/logout.php
actions/microsummary.php
actions/newmessage.php
actions/newnotice.php
actions/noticesearch.php
actions/noticesearchrss.php
actions/nudge.php
actions/openidlogin.php
actions/openidsettings.php
actions/opensearch.php
actions/othersettings.php
actions/peoplesearch.php
actions/peopletag.php
actions/postnotice.php
actions/profilesettings.php
actions/public.php
actions/publicrss.php
actions/publicxrds.php
actions/recoverpassword.php
actions/register.php
actions/remotesubscribe.php
actions/replies.php
actions/repliesrss.php
actions/requesttoken.php
actions/showfavorites.php
actions/showmessage.php
actions/shownotice.php
actions/showstream.php
actions/smssettings.php
actions/subedit.php
actions/subscribe.php
actions/subscribers.php
actions/subscriptions.php
actions/sup.php
actions/tag.php
actions/tagother.php
actions/tagrss.php
actions/twitapiaccount.php
actions/twitapiblocks.php
actions/twitapidirect_messages.php
actions/twitapifavorites.php
actions/twitapifriendships.php
actions/twitapihelp.php
actions/twitapinotifications.php
actions/twitapistatuses.php
actions/twitapiusers.php
actions/twittersettings.php
actions/unblock.php
actions/unsubscribe.php
actions/updateprofile.php
actions/userauthorization.php
actions/userbyid.php
actions/userrss.php
actions/xrds.php
classes/Avatar.php
classes/Channel.php
classes/Command.php
classes/CommandInterpreter.php
classes/Fave.php
classes/Foreign_link.php
classes/Foreign_user.php
classes/Memcached_DataObject.php
classes/Message.php
classes/Notice.php
classes/NoticeWrapper.php
classes/Notice_tag.php
classes/Profile.php
classes/Profile_tag.php
classes/Queue_item.php
classes/Sms_carrier.php
classes/Subscription.php
classes/User.php
lib/common.php
lib/deleteaction.php
lib/facebookaction.php
lib/oauthstore.php
lib/omb.php
lib/openid.php
lib/personal.php
lib/profilelist.php
lib/queuehandler.php
lib/rssaction.php
lib/search_engines.php
lib/searchaction.php
lib/settingsaction.php
lib/stream.php
lib/subs.php
lib/theme.php
lib/twitter.php
lib/twitterapi.php
lib/xmppqueuehandler.php
scripts/enjitqueuehandler.php
scripts/fixup_hashtags.php
scripts/fixup_inboxes.php
scripts/fixup_notices_rendered.php
scripts/getpiddir.php
scripts/inbox_users.php
scripts/jabberqueuehandler.php
scripts/maildaemon.php
scripts/ombqueuehandler.php
scripts/publicqueuehandler.php
scripts/sitemap.php
scripts/smsqueuehandler.php
scripts/synctwitterfriends.php
scripts/update_translations.php
scripts/xmppconfirmhandler.php
scripts/xmppdaemon.php

index c66eff2b7095d77dfaa3ed6bac1242a0f372bf90..f49b758abf8b42a5ee115c6566b83c0f2cb361c2 100644 (file)
@@ -49,4 +49,14 @@ Evan Prodromou <evan@prodromou.name>**20081223173330]
 [bring lib/noticelist.php into line with PEAR code standards
 Evan Prodromou <evan@prodromou.name>**20081223190851] 
 [incorrect label on notice list file comment
-Evan Prodromou <evan@prodromou.name>**20081223191430] 
\ No newline at end of file
+Evan Prodromou <evan@prodromou.name>**20081223191430] 
+[replace all tabs with four spaces
+Evan Prodromou <evan@prodromou.name>**20081223191907
+ The PEAR coding standards decree: no tabs, but indent by four spaces.
+ I've done a global search-and-replace on all tabs, replacing them by
+ four spaces. This is a huge change, but it will go a long way to
+ getting us towards phpcs-compliance. And that means better code
+ readability, and that means more participation.
+] 
\ No newline at end of file
diff --git a/_darcs/patches/20081223191907-84dde-21e8efe210e6d5d54e935a22d0cee5c7bbfc007d.gz b/_darcs/patches/20081223191907-84dde-21e8efe210e6d5d54e935a22d0cee5c7bbfc007d.gz
new file mode 100644 (file)
index 0000000..0ce0012
Binary files /dev/null and b/_darcs/patches/20081223191907-84dde-21e8efe210e6d5d54e935a22d0cee5c7bbfc007d.gz differ
index 4907749ce0519dda5a8a6f1f8a38f9e6280caee0..a468c33a69bf8bfb1e0f6ca90cd24d949cd55619 100644 (file)
@@ -22,21 +22,21 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/lib/omb.php');
 
 class AccesstokenAction extends Action {
-       function handle($args) {
-               parent::handle($args);
-               try {
-                       common_debug('getting request from env variables', __FILE__);
-                       common_remove_magic_from_request();
-                       $req = OAuthRequest::from_request();
-                       common_debug('getting a server', __FILE__);
-                       $server = omb_oauth_server();
-                       common_debug('fetching the access token', __FILE__);
-                       $token = $server->fetch_access_token($req);
-                       common_debug('got this token: "'.print_r($token,TRUE).'"', __FILE__);
-                       common_debug('printing the access token', __FILE__);
-                       print $token;
-               } catch (OAuthException $e) {
-                       common_server_error($e->getMessage());
-               }
-       }
+    function handle($args) {
+        parent::handle($args);
+        try {
+            common_debug('getting request from env variables', __FILE__);
+            common_remove_magic_from_request();
+            $req = OAuthRequest::from_request();
+            common_debug('getting a server', __FILE__);
+            $server = omb_oauth_server();
+            common_debug('fetching the access token', __FILE__);
+            $token = $server->fetch_access_token($req);
+            common_debug('got this token: "'.print_r($token,TRUE).'"', __FILE__);
+            common_debug('printing the access token', __FILE__);
+            print $token;
+        } catch (OAuthException $e) {
+            common_server_error($e->getMessage());
+        }
+    }
 }
index 2a26e48d4d3c36543be776a53e93af20beddda42..066ee77bff11f03e26b5b546eb4b1e8da3997611 100644 (file)
@@ -23,71 +23,71 @@ require_once(INSTALLDIR.'/actions/showstream.php');
 
 class AllAction extends StreamAction {
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               $nickname = common_canonical_nickname($this->arg('nickname'));
-               $user = User::staticGet('nickname', $nickname);
+        $nickname = common_canonical_nickname($this->arg('nickname'));
+        $user = User::staticGet('nickname', $nickname);
 
-               if (!$user) {
-                       $this->client_error(_('No such user.'));
-                       return;
-               }
+        if (!$user) {
+            $this->client_error(_('No such user.'));
+            return;
+        }
 
-               $profile = $user->getProfile();
+        $profile = $user->getProfile();
 
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
 
-               # Looks like we're good; show the header
+        # Looks like we're good; show the header
 
-               common_show_header(sprintf(_("%s and friends"), $profile->nickname),
-                                                  array($this, 'show_header'), $user,
-                                                  array($this, 'show_top'));
+        common_show_header(sprintf(_("%s and friends"), $profile->nickname),
+                           array($this, 'show_header'), $user,
+                           array($this, 'show_top'));
 
-               $this->show_notices($user);
+        $this->show_notices($user);
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function show_header($user) {
-               common_element('link', array('rel' => 'alternate',
-                                                                        'href' => common_local_url('allrss', array('nickname' =>
-                                                                                                                                                          $user->nickname)),
-                                                                        'type' => 'application/rss+xml',
-                                                                        'title' => sprintf(_('Feed for friends of %s'), $user->nickname)));
-       }
+    function show_header($user) {
+        common_element('link', array('rel' => 'alternate',
+                                     'href' => common_local_url('allrss', array('nickname' =>
+                                                                               $user->nickname)),
+                                     'type' => 'application/rss+xml',
+                                     'title' => sprintf(_('Feed for friends of %s'), $user->nickname)));
+    }
 
-       function show_top($user) {
-               $cur = common_current_user();
+    function show_top($user) {
+        $cur = common_current_user();
 
-               if ($cur && $cur->id == $user->id) {
-                       common_notice_form('all');
-               }
+        if ($cur && $cur->id == $user->id) {
+            common_notice_form('all');
+        }
 
-               $this->views_menu();
+        $this->views_menu();
 
-               $this->show_feeds_list(array(0=>array('href'=>common_local_url('allrss', array('nickname' => $user->nickname)),
-                                                                                         'type' => 'rss',
-                                                                                         'version' => 'RSS 1.0',
-                                                                                         'item' => 'allrss')));
-       }
+        $this->show_feeds_list(array(0=>array('href'=>common_local_url('allrss', array('nickname' => $user->nickname)),
+                                              'type' => 'rss',
+                                              'version' => 'RSS 1.0',
+                                              'item' => 'allrss')));
+    }
 
-       function show_notices($user) {
+    function show_notices($user) {
 
-               $page = $this->trimmed('page');
-               if (!$page) {
-                       $page = 1;
-               }
+        $page = $this->trimmed('page');
+        if (!$page) {
+            $page = 1;
+        }
 
-               $notice = $user->noticesWithFriends(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+        $notice = $user->noticesWithFriends(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
 
         $cnt = $this->show_notice_list($notice);
 
-               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'all', array('nickname' => $user->nickname));
-       }
+        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'all', array('nickname' => $user->nickname));
+    }
 }
index e49ac55401435d9cd0d4d7e262e0eaac9e58adc2..d28fcea49db62d806a786549c84ef639f77da7f7 100644 (file)
@@ -25,53 +25,53 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class AllrssAction extends Rss10Action {
 
-       var $user = NULL;
+    var $user = NULL;
 
-       function init() {
-               $nickname = $this->trimmed('nickname');
-               $this->user = User::staticGet('nickname', $nickname);
+    function init() {
+        $nickname = $this->trimmed('nickname');
+        $this->user = User::staticGet('nickname', $nickname);
 
-               if (!$this->user) {
-                       common_user_error(_('No such user.'));
-                       return false;
-               } else {
-                       return true;
-               }
-       }
+        if (!$this->user) {
+            common_user_error(_('No such user.'));
+            return false;
+        } else {
+            return true;
+        }
+    }
 
-       function get_notices($limit=0) {
+    function get_notices($limit=0) {
 
-               $user = $this->user;
-               
-               $notice = $user->noticesWithFriends(0, $limit);
-                                                                                       
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
+        $user = $this->user;
+        
+        $notice = $user->noticesWithFriends(0, $limit);
+                                            
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
 
-               return $notices;
-       }
+        return $notices;
+    }
 
-       function get_channel() {
-               $user = $this->user;
-               $c = array('url' => common_local_url('allrss',
-                                                                                        array('nickname' =>
-                                                                                                  $user->nickname)),
-                                  'title' => sprintf(_('%s and friends'), $user->nickname),
-                                  'link' => common_local_url('all',
-                                                                                        array('nickname' =>
-                                                                                                  $user->nickname)),
-                                  'description' => sprintf(_('Feed for friends of %s'), $user->nickname));
-               return $c;
-       }
+    function get_channel() {
+        $user = $this->user;
+        $c = array('url' => common_local_url('allrss',
+                                             array('nickname' =>
+                                                   $user->nickname)),
+                   'title' => sprintf(_('%s and friends'), $user->nickname),
+                   'link' => common_local_url('all',
+                                             array('nickname' =>
+                                                   $user->nickname)),
+                   'description' => sprintf(_('Feed for friends of %s'), $user->nickname));
+        return $c;
+    }
 
-       function get_image() {
-               $user = $this->user;
-               $profile = $user->getProfile();
-               if (!$profile) {
-                       return NULL;
-               }
-               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-               return ($avatar) ? $avatar->url : NULL;
-       }
+    function get_image() {
+        $user = $this->user;
+        $profile = $user->getProfile();
+        if (!$profile) {
+            return NULL;
+        }
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+        return ($avatar) ? $avatar->url : NULL;
+    }
 }
\ No newline at end of file
index 919a515ce9a4f3a359ad9f2d1cd070ae77ce81e0..e03961e21fcc52683c3c0250239020b42cec02d7 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
 
 class ApiAction extends Action {
 
-       var $user;
-       var $content_type;
-       var $api_arg;
-       var $api_method;
-       var $api_action;
-
-       function handle($args) {
-               parent::handle($args);
-
-               $this->api_action = $this->arg('apiaction');
-               $method = $this->arg('method');
-               $argument = $this->arg('argument');
-
-               if (isset($argument)) {
-                       $cmdext = explode('.', $argument);
-                       $this->api_arg =  $cmdext[0];
-                       $this->api_method = $method;
-                       $this->content_type = strtolower($cmdext[1]);
-               } else {
-
-                       # Requested format / content-type will be an extension on the method
-                       $cmdext = explode('.', $method);
-                       $this->api_method = $cmdext[0];
-                       $this->content_type = strtolower($cmdext[1]);
-               }
-
-               if ($this->requires_auth()) {
-                       if (!isset($_SERVER['PHP_AUTH_USER'])) {
-
-                               # This header makes basic auth go
-                               header('WWW-Authenticate: Basic realm="Laconica API"');
-
-                               # If the user hits cancel -- bam!
-                               $this->show_basic_auth_error();
-                       } else {
-                               $nickname = $_SERVER['PHP_AUTH_USER'];
-                               $password = $_SERVER['PHP_AUTH_PW'];
-                               $user = common_check_user($nickname, $password);
-
-                               if ($user) {
-                                       $this->user = $user;
-                                       $this->process_command();
-                               } else {
-                                       # basic authentication failed
-                                       $this->show_basic_auth_error();
-                               }
-                       }
-               } else {
-
-                       # Look for the user in the session
-                       if (common_logged_in()) {
-                               $this->user = common_current_user();
-                       }
-
-                       $this->process_command();
-               }
-       }
-
-       function process_command() {
-               $action = "twitapi$this->api_action";
-               $actionfile = INSTALLDIR."/actions/$action.php";
-
-               if (file_exists($actionfile)) {
-                       require_once($actionfile);
-                       $action_class = ucfirst($action)."Action";
-                       $action_obj = new $action_class();
+    var $user;
+    var $content_type;
+    var $api_arg;
+    var $api_method;
+    var $api_action;
+
+    function handle($args) {
+        parent::handle($args);
+
+        $this->api_action = $this->arg('apiaction');
+        $method = $this->arg('method');
+        $argument = $this->arg('argument');
+
+        if (isset($argument)) {
+            $cmdext = explode('.', $argument);
+            $this->api_arg =  $cmdext[0];
+            $this->api_method = $method;
+            $this->content_type = strtolower($cmdext[1]);
+        } else {
+
+            # Requested format / content-type will be an extension on the method
+            $cmdext = explode('.', $method);
+            $this->api_method = $cmdext[0];
+            $this->content_type = strtolower($cmdext[1]);
+        }
+
+        if ($this->requires_auth()) {
+            if (!isset($_SERVER['PHP_AUTH_USER'])) {
+
+                # This header makes basic auth go
+                header('WWW-Authenticate: Basic realm="Laconica API"');
+
+                # If the user hits cancel -- bam!
+                $this->show_basic_auth_error();
+            } else {
+                $nickname = $_SERVER['PHP_AUTH_USER'];
+                $password = $_SERVER['PHP_AUTH_PW'];
+                $user = common_check_user($nickname, $password);
+
+                if ($user) {
+                    $this->user = $user;
+                    $this->process_command();
+                } else {
+                    # basic authentication failed
+                    $this->show_basic_auth_error();
+                }
+            }
+        } else {
+
+            # Look for the user in the session
+            if (common_logged_in()) {
+                 $this->user = common_current_user();
+            }
+
+            $this->process_command();
+        }
+    }
+
+    function process_command() {
+        $action = "twitapi$this->api_action";
+        $actionfile = INSTALLDIR."/actions/$action.php";
+
+        if (file_exists($actionfile)) {
+            require_once($actionfile);
+            $action_class = ucfirst($action)."Action";
+            $action_obj = new $action_class();
 
             if (!$action_obj->prepare($this->args)) {
                 return;
             }
 
-                       if (method_exists($action_obj, $this->api_method)) {
-                               $apidata = array(       'content-type' => $this->content_type,
-                                                                       'api_method' => $this->api_method,
-                                                                       'api_arg' => $this->api_arg,
-                                                                       'user' => $this->user);
-
-                               call_user_func(array($action_obj, $this->api_method), $_REQUEST, $apidata);
-                       } else {
-                               common_user_error("API method not found!", $code=404);
-                       }
-               } else {
-                       common_user_error("API method not found!", $code=404);
-               }
-       }
-
-       # Whitelist of API methods that don't need authentication
-       function requires_auth() {
-               static $noauth = array( 'statuses/public_timeline',
-                                                               'statuses/show',
-                                                               'users/show',
-                                                               'help/test',
-                                                               'help/downtime_schedule');
-
-               static $bareauth = array('statuses/user_timeline',
-                                                                'statuses/friends',
-                                                                'statuses/followers',
-                                                                'favorites/favorites');
+            if (method_exists($action_obj, $this->api_method)) {
+                $apidata = array(    'content-type' => $this->content_type,
+                                    'api_method' => $this->api_method,
+                                    'api_arg' => $this->api_arg,
+                                    'user' => $this->user);
+
+                call_user_func(array($action_obj, $this->api_method), $_REQUEST, $apidata);
+            } else {
+                common_user_error("API method not found!", $code=404);
+            }
+        } else {
+            common_user_error("API method not found!", $code=404);
+        }
+    }
+
+    # Whitelist of API methods that don't need authentication
+    function requires_auth() {
+        static $noauth = array( 'statuses/public_timeline',
+                                'statuses/show',
+                                'users/show',
+                                'help/test',
+                                'help/downtime_schedule');
+
+        static $bareauth = array('statuses/user_timeline',
+                                 'statuses/friends',
+                                 'statuses/followers',
+                                 'favorites/favorites');
 
         # If the site is "private", all API methods need authentication
 
@@ -126,71 +126,71 @@ class ApiAction extends Action {
             return true;
         }
 
-               $fullname = "$this->api_action/$this->api_method";
-
-               if (in_array($fullname, $bareauth)) {
-                       # bareauth: only needs auth if without an argument
-                       if ($this->api_arg) {
-                               return false;
-                       } else {
-                               return true;
-                       }
-               } else if (in_array($fullname, $noauth)) {
-                       # noauth: never needs auth
-                       return false;
-               } else {
-                       # everybody else needs auth
-                       return true;
-               }
-       }
-
-       function show_basic_auth_error() {
-               header('HTTP/1.1 401 Unauthorized');
-               $msg = 'Could not authenticate you.';
-
-               if ($this->content_type == 'xml') {
-                       header('Content-Type: application/xml; charset=utf-8');
-                       common_start_xml();
-                       common_element_start('hash');
-                       common_element('error', NULL, $msg);
-                       common_element('request', NULL, $_SERVER['REQUEST_URI']);
-                       common_element_end('hash');
-                       common_end_xml();
-               } else if ($this->content_type == 'json')  {
-                       header('Content-Type: application/json; charset=utf-8');
-                       $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
-                       print(json_encode($error_array));
-               } else {
-                       header('Content-type: text/plain');
-                       print "$msg\n";
-               }
-       }
-
-       function is_readonly() {
-               # NOTE: before handle(), can't use $this->arg
-               $apiaction = $_REQUEST['apiaction'];
-               $method = $_REQUEST['method'];
-               list($cmdtext, $fmt) = explode('.', $method);
-
-               static $write_methods = array(
-                       'account' => array('update_location', 'update_delivery_device', 'end_session'),
-                       'blocks' => array('create', 'destroy'),
-                       'direct_messages' => array('create', 'destroy'),
-                       'favorites' => array('create', 'destroy'),
-                       'friendships' => array('create', 'destroy'),
-                       'help' => array(),
-                       'notifications' => array('follow', 'leave'),
-                       'statuses' => array('update', 'destroy'),
-                       'users' => array()
-               );
-
-               if (array_key_exists($apiaction, $write_methods)) {
-                       if (!in_array($cmdtext, $write_methods[$apiaction])) {
-                               return true;
-                       }
-               }
-
-               return false;
-       }
+        $fullname = "$this->api_action/$this->api_method";
+
+        if (in_array($fullname, $bareauth)) {
+            # bareauth: only needs auth if without an argument
+            if ($this->api_arg) {
+                return false;
+            } else {
+                return true;
+            }
+        } else if (in_array($fullname, $noauth)) {
+            # noauth: never needs auth
+            return false;
+        } else {
+            # everybody else needs auth
+            return true;
+        }
+    }
+
+    function show_basic_auth_error() {
+        header('HTTP/1.1 401 Unauthorized');
+        $msg = 'Could not authenticate you.';
+
+        if ($this->content_type == 'xml') {
+            header('Content-Type: application/xml; charset=utf-8');
+            common_start_xml();
+            common_element_start('hash');
+            common_element('error', NULL, $msg);
+            common_element('request', NULL, $_SERVER['REQUEST_URI']);
+            common_element_end('hash');
+            common_end_xml();
+        } else if ($this->content_type == 'json')  {
+            header('Content-Type: application/json; charset=utf-8');
+            $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
+            print(json_encode($error_array));
+        } else {
+            header('Content-type: text/plain');
+            print "$msg\n";
+        }
+    }
+
+    function is_readonly() {
+        # NOTE: before handle(), can't use $this->arg
+        $apiaction = $_REQUEST['apiaction'];
+        $method = $_REQUEST['method'];
+        list($cmdtext, $fmt) = explode('.', $method);
+
+        static $write_methods = array(
+            'account' => array('update_location', 'update_delivery_device', 'end_session'),
+            'blocks' => array('create', 'destroy'),
+            'direct_messages' => array('create', 'destroy'),
+            'favorites' => array('create', 'destroy'),
+            'friendships' => array('create', 'destroy'),
+            'help' => array(),
+            'notifications' => array('follow', 'leave'),
+            'statuses' => array('update', 'destroy'),
+            'users' => array()
+        );
+
+        if (array_key_exists($apiaction, $write_methods)) {
+            if (!in_array($cmdtext, $write_methods[$apiaction])) {
+                return true;
+            }
+        }
+
+        return false;
+    }
 
 }
index b33cababf72072aa0ced1dd4cda4a8c703877636..2ca861a66b77fd1995242e920ffed54db2429fa3 100644 (file)
@@ -24,45 +24,45 @@ class AvatarbynicknameAction extends Action {
         parent::handle($args);
         $nickname = $this->trimmed('nickname');
         if (!$nickname) {
-               $this->client_error(_('No nickname.'));
-                       return;
-               }
-               $size = $this->trimmed('size');
+            $this->client_error(_('No nickname.'));
+            return;
+        }
+        $size = $this->trimmed('size');
         if (!$size) {
-               $this->client_error(_('No size.'));
-                       return;
-               }
-               $size = strtolower($size);
-               if (!in_array($size, array('original', '96', '48', '24'))) {
-               $this->client_error(_('Invalid size.'));
-                       return;
-               }
+            $this->client_error(_('No size.'));
+            return;
+        }
+        $size = strtolower($size);
+        if (!in_array($size, array('original', '96', '48', '24'))) {
+            $this->client_error(_('Invalid size.'));
+            return;
+        }
 
-               $user = User::staticGet('nickname', $nickname);
-               if (!$user) {
-               $this->client_error(_('No such user.'));
-                       return;
-               }
-               $profile = $user->getProfile();
-               if (!$profile) {
-               $this->client_error(_('User has no profile.'));
-                       return;
-               }
-               if ($size == 'original') {
-                       $avatar = $profile->getOriginal();
-               } else {
-                       $avatar = $profile->getAvatar($size+0);
-               }
+        $user = User::staticGet('nickname', $nickname);
+        if (!$user) {
+            $this->client_error(_('No such user.'));
+            return;
+        }
+        $profile = $user->getProfile();
+        if (!$profile) {
+            $this->client_error(_('User has no profile.'));
+            return;
+        }
+        if ($size == 'original') {
+            $avatar = $profile->getOriginal();
+        } else {
+            $avatar = $profile->getAvatar($size+0);
+        }
 
-               if ($avatar) {
-                       $url = $avatar->url;
-               } else {
-                       if ($size == 'original') {
-                               $url = common_default_avatar(AVATAR_PROFILE_SIZE);
-                       } else {
-                               $url = common_default_avatar($size+0);
-                       }
-               }
-               common_redirect($url, 302);
-       }
+        if ($avatar) {
+            $url = $avatar->url;
+        } else {
+            if ($size == 'original') {
+                $url = common_default_avatar(AVATAR_PROFILE_SIZE);
+            } else {
+                $url = common_default_avatar($size+0);
+            }
+        }
+        common_redirect($url, 302);
+    }
 }
index e6d2b7e49e96bc685b8751c6ea454350dc47619c..20ba81edba9b1490120c5e16e0aaeb43bc0121b3 100644 (file)
@@ -32,12 +32,12 @@ class BlockAction extends Action {
             return false;
         }
 
-               $token = $this->trimmed('token');
+        $token = $this->trimmed('token');
 
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
         $id = $this->trimmed('blockto');
 
@@ -75,7 +75,7 @@ class BlockAction extends Action {
 
         $id = $this->profile->id;
 
-               common_show_header(_('Block user'));
+        common_show_header(_('Block user'));
 
         common_element('p', NULL,
                        _('Are you sure you want to block this user? '.
index 44280e08a7543cf15dc373244042c5a489b63ec0..9d97c82058552c703442f62f2404aac84877a7df 100644 (file)
@@ -43,44 +43,44 @@ class ConfirmaddressAction extends Action {
             $this->client_error(_('That confirmation code is not for you!'));
             return;
         }
-               $type = $confirm->address_type;
-               if (!in_array($type, array('email', 'jabber', 'sms'))) {
-                       $this->server_error(sprintf(_('Unrecognized address type %s'), $type));
-                       return;
-               }
+        $type = $confirm->address_type;
+        if (!in_array($type, array('email', 'jabber', 'sms'))) {
+            $this->server_error(sprintf(_('Unrecognized address type %s'), $type));
+            return;
+        }
         if ($cur->$type == $confirm->address) {
             $this->client_error(_('That address has already been confirmed.'));
-                       return;
-               }
+            return;
+        }
 
         $cur->query('BEGIN');
 
         $orig_user = clone($cur);
 
-               $cur->$type = $confirm->address;
+        $cur->$type = $confirm->address;
 
-               if ($type == 'sms') {
-                       $cur->carrier = ($confirm->address_extra)+0;
-                       $carrier = Sms_carrier::staticGet($cur->carrier);
-                       $cur->smsemail = $carrier->toEmailAddress($cur->sms);
-               }
+        if ($type == 'sms') {
+            $cur->carrier = ($confirm->address_extra)+0;
+            $carrier = Sms_carrier::staticGet($cur->carrier);
+            $cur->smsemail = $carrier->toEmailAddress($cur->sms);
+        }
 
-               $result = $cur->updateKeys($orig_user);
+        $result = $cur->updateKeys($orig_user);
 
         if (!$result) {
-                       common_log_db_error($cur, 'UPDATE', __FILE__);
+            common_log_db_error($cur, 'UPDATE', __FILE__);
             $this->server_error(_('Couldn\'t update user.'));
             return;
         }
 
-               if ($type == 'email') {
-                   $cur->emailChanged();
-               }
+        if ($type == 'email') {
+            $cur->emailChanged();
+        }
 
         $result = $confirm->delete();
 
         if (!$result) {
-                       common_log_db_error($confirm, 'DELETE', __FILE__);
+            common_log_db_error($confirm, 'DELETE', __FILE__);
             $this->server_error(_('Couldn\'t delete email confirmation.'));
             return;
         }
index 64746283ae5103f18b06823d095412711eeafca4..ba348c5faf4f5bf2be2cf6fc99aef8b11e9a30db 100644 (file)
@@ -22,80 +22,80 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/lib/deleteaction.php');
 
 class DeletenoticeAction extends DeleteAction {
-       function handle($args) {
-               parent::handle($args);
-               # XXX: Ajax!
+    function handle($args) {
+        parent::handle($args);
+        # XXX: Ajax!
 
-               if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $this->delete_notice();
-               } else if ($_SERVER['REQUEST_METHOD'] == 'GET') {
-                       $this->show_form();
-               }
-       }
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->delete_notice();
+        } else if ($_SERVER['REQUEST_METHOD'] == 'GET') {
+            $this->show_form();
+        }
+    }
 
-       function get_instructions() {
-               return _('You are about to permanently delete a notice.  Once this is done, it cannot be undone.');
-       }
+    function get_instructions() {
+        return _('You are about to permanently delete a notice.  Once this is done, it cannot be undone.');
+    }
 
-       function get_title() {
-               return _('Delete notice');
-       }
+    function get_title() {
+        return _('Delete notice');
+    }
 
-       function show_form($error=NULL) {
-               $user = common_current_user();
+    function show_form($error=NULL) {
+        $user = common_current_user();
 
-               common_show_header($this->get_title(), array($this, 'show_header'), $error,
-                                                  array($this, 'show_top'));
-               common_element_start('form', array('id' => 'notice_delete_form',
-                                                                  'method' => 'post',
-                                                                  'action' => common_local_url('deletenotice')));
-               common_hidden('token', common_session_token());
-               common_hidden('notice', $this->trimmed('notice'));
-               common_element_start('p');
-               common_element('span', array('id' => 'confirmation_text'), _('Are you sure you want to delete this notice?'));
+        common_show_header($this->get_title(), array($this, 'show_header'), $error,
+                           array($this, 'show_top'));
+        common_element_start('form', array('id' => 'notice_delete_form',
+                                   'method' => 'post',
+                                   'action' => common_local_url('deletenotice')));
+        common_hidden('token', common_session_token());
+        common_hidden('notice', $this->trimmed('notice'));
+        common_element_start('p');
+        common_element('span', array('id' => 'confirmation_text'), _('Are you sure you want to delete this notice?'));
 
-               common_element('input', array('id' => 'submit_no',
-                                                 'name' => 'submit',
-                                                 'type' => 'submit',
-                                                 'value' => _('No')));
-               common_element('input', array('id' => 'submit_yes',
-                                                 'name' => 'submit',
-                                                 'type' => 'submit',
-                                                 'value' => _('Yes')));
-               common_element_end('p');
-               common_element_end('form');
-               common_show_footer();
-       }
+        common_element('input', array('id' => 'submit_no',
+                          'name' => 'submit',
+                          'type' => 'submit',
+                          'value' => _('No')));
+        common_element('input', array('id' => 'submit_yes',
+                          'name' => 'submit',
+                          'type' => 'submit',
+                          'value' => _('Yes')));
+        common_element_end('p');
+        common_element_end('form');
+        common_show_footer();
+    }
 
-       function delete_notice() {
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-               $url = common_get_returnto();
-               $confirmed = $this->trimmed('submit');
-               if ($confirmed == _('Yes')) {
-                       $user = common_current_user();
-                       $notice_id = $this->trimmed('notice');
-                       $notice = Notice::staticGet($notice_id);
-                       $replies = new Reply;
-                       $replies->get('notice_id', $notice_id);
+    function delete_notice() {
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+        $url = common_get_returnto();
+        $confirmed = $this->trimmed('submit');
+        if ($confirmed == _('Yes')) {
+            $user = common_current_user();
+            $notice_id = $this->trimmed('notice');
+            $notice = Notice::staticGet($notice_id);
+            $replies = new Reply;
+            $replies->get('notice_id', $notice_id);
 
-                       common_dequeue_notice($notice);
-                       if (common_config('memcached', 'enabled')) {
-                               $notice->blowSubsCache();
-                       }
-                       $replies->delete();
-                       $notice->delete();
-               } else {
-                       if ($url) {
-                               common_set_returnto(NULL);
-                       } else {
-                               $url = common_local_url('public');
-                       }
-               }
-               common_redirect($url);
-       }
+            common_dequeue_notice($notice);
+            if (common_config('memcached', 'enabled')) {
+                $notice->blowSubsCache();
+            }
+            $replies->delete();
+            $notice->delete();
+        } else {
+            if ($url) {
+                common_set_returnto(NULL);
+            } else {
+                $url = common_local_url('public');
+            }
+        }
+        common_redirect($url);
+    }
 }
index 418ac998d0671fc5c0d502c596aab3ed41f4ab6f..29797bc76d5aae22060ebf1400e81fd90e0809dd 100644 (file)
@@ -32,101 +32,101 @@ class DeleteprofileAction extends Action {
         }
     }
 
-       function get_instructions() {
-               return _('Export and delete your user information.');
-       }
-
-       function form_header($title, $msg=NULL, $success=false) {
-               common_show_header($title,
-                                  NULL,
-                                  array($msg, $success),
-                                                  array($this, 'show_top'));
-       }
-
-       function show_feeds_list($feeds) {
-               common_element_start('div', array('class' => 'feedsdel'));
-               common_element('p', null, 'Feeds:');
-               common_element_start('ul', array('class' => 'xoxo'));
-
-               foreach ($feeds as $key => $value) {
-                       $this->common_feed_item($feeds[$key]);
-               }
-               common_element_end('ul');
-               common_element_end('div');
-       }
+    function get_instructions() {
+        return _('Export and delete your user information.');
+    }
+
+    function form_header($title, $msg=NULL, $success=false) {
+        common_show_header($title,
+                           NULL,
+                           array($msg, $success),
+                           array($this, 'show_top'));
+    }
+
+    function show_feeds_list($feeds) {
+        common_element_start('div', array('class' => 'feedsdel'));
+        common_element('p', null, 'Feeds:');
+        common_element_start('ul', array('class' => 'xoxo'));
+
+        foreach ($feeds as $key => $value) {
+            $this->common_feed_item($feeds[$key]);
+        }
+        common_element_end('ul');
+        common_element_end('div');
+    }
 
     //TODO move to common.php (and retrace its origin)
-       function common_feed_item($feed) {
+    function common_feed_item($feed) {
+        $user = common_current_user();
+        $nickname = $user->nickname;
+
+        switch($feed['item']) {
+            case 'notices': default:
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "$nickname's ".$feed['version']." notice feed";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'foaf':
+                $feed_classname = "foaf";
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "$nickname's FOAF file";
+                $feed['textContent'] = "FOAF";
+                break;
+        }
+        common_element_start('li');
+        common_element('a', array('href' => $feed['href'],
+                                  'class' => $feed_classname,
+                                  'type' => $feed_mimetype,
+                                  'title' => $feed_title),
+                            $feed['textContent']);
+        common_element_end('li');
+    }
+
+    function show_form($msg=NULL, $success=false) {
+        $this->form_header(_('Delete my account'), $msg, $success);
+        common_element('h2', NULL, _('Delete my account confirmation'));
+        $this->show_confirm_delete_form();
+        common_show_footer();
+    }
+
+    function show_confirm_delete_form() {
         $user = common_current_user();
-               $nickname = $user->nickname;
-
-               switch($feed['item']) {
-                       case 'notices': default:
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "$nickname's ".$feed['version']." notice feed";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'foaf':
-                               $feed_classname = "foaf";
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "$nickname's FOAF file";
-                               $feed['textContent'] = "FOAF";
-                               break;
-               }
-               common_element_start('li');
-               common_element('a', array('href' => $feed['href'],
-                                                                 'class' => $feed_classname,
-                                                                 'type' => $feed_mimetype,
-                                                                 'title' => $feed_title),
-                                                       $feed['textContent']);
-               common_element_end('li');
-       }
-
-       function show_form($msg=NULL, $success=false) {
-               $this->form_header(_('Delete my account'), $msg, $success);
-               common_element('h2', NULL, _('Delete my account confirmation'));
-               $this->show_confirm_delete_form();
-               common_show_footer();
-       }
-
-       function show_confirm_delete_form() {
-               $user = common_current_user();
         $notices = DB_DataObject::factory('notice');
         $notices->profile_id = $user->id;
         $notice_count = (int) $notices->count();
 
-               common_element_start('form', array('method' => 'POST',
-                                                                                  'id' => 'delete',
-                                                                                  'action' =>
-                                                                                  common_local_url('deleteprofile')));
+        common_element_start('form', array('method' => 'POST',
+                                           'id' => 'delete',
+                                           'action' =>
+                                           common_local_url('deleteprofile')));
 
-               common_hidden('token', common_session_token());
+        common_hidden('token', common_session_token());
         common_element('p', null, "Last chance to copy your notices and contacts by saving the two links below before deleting your account. Be careful, this operation cannot be undone.");
 
-               $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('limit' => $notice_count, 'nickname' => $user->nickname)),
-                                                                                         'type' => 'rss',
-                                                                                         'version' => 'RSS 1.0',
-                                                                                         'item' => 'notices'),
-                                                                        1=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
-                                                                                         'type' => 'rdf',
-                                                                                         'version' => 'FOAF',
-                                                                                         'item' => 'foaf')));
+        $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('limit' => $notice_count, 'nickname' => $user->nickname)),
+                                              'type' => 'rss',
+                                              'version' => 'RSS 1.0',
+                                              'item' => 'notices'),
+                                     1=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
+                                              'type' => 'rdf',
+                                              'version' => 'FOAF',
+                                              'item' => 'foaf')));
 
         common_checkbox('confirmation', _('Check if you are sure you want to delete your account.'));
 
-               common_submit('deleteaccount', _('Delete my account'));
-               common_element_end('form');
+        common_submit('deleteaccount', _('Delete my account'));
+        common_element_end('form');
     }
 
-       function handle_post() {
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+    function handle_post() {
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
         if ($this->arg('deleteaccount') && $this->arg('confirmation')) {
             $this->delete_account();
@@ -134,9 +134,9 @@ class DeleteprofileAction extends Action {
         $this->show_form();
     }
 
-       function delete_account() {
-               $user = common_current_user();
-               assert(!is_null($user)); # should already be checked
+    function delete_account() {
+        $user = common_current_user();
+        assert(!is_null($user)); # should already be checked
 
         // deleted later through the profile
         /*
@@ -219,53 +219,53 @@ class DeleteprofileAction extends Action {
         common_redirect(common_local_url('public'));
     }
 
-       function show_top($arr) {
-               $msg = $arr[0];
-               $success = $arr[1];
-               if ($msg) {
-                       $this->message($msg, $success);
-               } else {
-                       $inst = $this->get_instructions();
-                       $output = common_markup_to_html($inst);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-               }
-               $this->settings_menu();
-       }
+    function show_top($arr) {
+        $msg = $arr[0];
+        $success = $arr[1];
+        if ($msg) {
+            $this->message($msg, $success);
+        } else {
+            $inst = $this->get_instructions();
+            $output = common_markup_to_html($inst);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('div');
+        }
+        $this->settings_menu();
+    }
 
     function settings_menu() {
         # action => array('prompt', 'title')
-               $menu =
-                 array('profilesettings' =>
-                               array(_('Profile'),
-                                         _('Change your profile settings')),
-                               'emailsettings' =>
-                               array(_('Email'),
-                                         _('Change email handling')),
-                               'openidsettings' =>
-                               array(_('OpenID'),
-                                         _('Add or remove OpenIDs')),
-                               'smssettings' =>
-                               array(_('SMS'),
-                                         _('Updates by SMS')),
-                               'imsettings' =>
-                               array(_('IM'),
-                                         _('Updates by instant messenger (IM)')),
-                               'twittersettings' =>
-                               array(_('Twitter'),
-                                         _('Twitter integration options')),
-                               'othersettings' =>
-                               array(_('Other'),
-                                         _('Other options')));
+        $menu =
+          array('profilesettings' =>
+                array(_('Profile'),
+                      _('Change your profile settings')),
+                'emailsettings' =>
+                array(_('Email'),
+                      _('Change email handling')),
+                'openidsettings' =>
+                array(_('OpenID'),
+                      _('Add or remove OpenIDs')),
+                'smssettings' =>
+                array(_('SMS'),
+                      _('Updates by SMS')),
+                'imsettings' =>
+                array(_('IM'),
+                      _('Updates by instant messenger (IM)')),
+                'twittersettings' =>
+                array(_('Twitter'),
+                      _('Twitter integration options')),
+                'othersettings' =>
+                array(_('Other'),
+                      _('Other options')));
 
         $action = $this->trimmed('action');
         common_element_start('ul', array('id' => 'nav_views'));
         foreach ($menu as $menuaction => $menudesc) {
-                       if ($menuaction == 'imsettings' &&
-                               !common_config('xmpp', 'enabled')) {
-                               continue;
-                       }
+            if ($menuaction == 'imsettings' &&
+                !common_config('xmpp', 'enabled')) {
+                continue;
+            }
             common_menu_item(common_local_url($menuaction),
                     $menudesc[0],
                     $menudesc[1],
index be208f65ab2a3d1abd5c27315070e1fde11fc1e2..e47e68a8c879fc23565a5179247e0c459c75b1d1 100644 (file)
@@ -21,63 +21,63 @@ if (!defined('LACONICA')) { exit(1); }
 
 class DisfavorAction extends Action {
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-                       return;
-               }
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+            return;
+        }
 
-               $user = common_current_user();
+        $user = common_current_user();
 
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       common_redirect(common_local_url('showfavorites', array('nickname' => $user->nickname)));
-                       return;
-               }
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            common_redirect(common_local_url('showfavorites', array('nickname' => $user->nickname)));
+            return;
+        }
 
-               $id = $this->trimmed('notice');
+        $id = $this->trimmed('notice');
 
-               $notice = Notice::staticGet($id);
+        $notice = Notice::staticGet($id);
 
-               $token = $this->trimmed('token-'.$notice->id);
+        $token = $this->trimmed('token-'.$notice->id);
 
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_("There was a problem with your session token. Try again, please."));
-                       return;
-               }
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_("There was a problem with your session token. Try again, please."));
+            return;
+        }
 
-               $fave = new Fave();
-               $fave->user_id = $this->id;
-               $fave->notice_id = $notice->id;
-               if (!$fave->find(true)) {
-                       $this->client_error(_('This notice is not a favorite!'));
-                       return;
-               }
+        $fave = new Fave();
+        $fave->user_id = $this->id;
+        $fave->notice_id = $notice->id;
+        if (!$fave->find(true)) {
+            $this->client_error(_('This notice is not a favorite!'));
+            return;
+        }
 
-               $result = $fave->delete();
+        $result = $fave->delete();
 
-               if (!$result) {
-                       common_log_db_error($fave, 'DELETE', __FILE__);
-                       $this->server_error(_('Could not delete favorite.'));
-                       return;
-               }
-               
-               $user->blowFavesCache();
+        if (!$result) {
+            common_log_db_error($fave, 'DELETE', __FILE__);
+            $this->server_error(_('Could not delete favorite.'));
+            return;
+        }
+        
+        $user->blowFavesCache();
 
-               if ($this->boolean('ajax')) {
-                       common_start_html('text/xml;charset=utf-8', true);
-                       common_element_start('head');
-                       common_element('title', null, _('Add to favorites'));
-                       common_element_end('head');
-                       common_element_start('body');
-                       common_favor_form($notice);
-                       common_element_end('body');
-                       common_element_end('html');
-               } else {
-                       common_redirect(common_local_url('showfavorites',
-                                                                                        array('nickname' => $user->nickname)));
-               }
-       }
+        if ($this->boolean('ajax')) {
+            common_start_html('text/xml;charset=utf-8', true);
+            common_element_start('head');
+            common_element('title', null, _('Add to favorites'));
+            common_element_end('head');
+            common_element_start('body');
+            common_favor_form($notice);
+            common_element_end('body');
+            common_element_end('html');
+        } else {
+            common_redirect(common_local_url('showfavorites',
+                                             array('nickname' => $user->nickname)));
+        }
+    }
 }
index f3327048f271d09c87496f6e124af37996eadc18..0cf665d683c76d038b44ee32a38629ad5c38cb7e 100644 (file)
@@ -21,18 +21,18 @@ if (!defined('LACONICA')) { exit(1); }
 
 class DocAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-               $title = $this->trimmed('title');
-               $filename = INSTALLDIR.'/doc/'.$title;
-               if (!file_exists($filename)) {
-                       common_user_error(_('No such document.'));
-                       return;
-               }
-               $c = file_get_contents($filename);
-               $output = common_markup_to_html($c);
-               common_show_header(_(ucfirst($title)));
-               common_raw($output);
-               common_show_footer();
-       }
+    function handle($args) {
+        parent::handle($args);
+        $title = $this->trimmed('title');
+        $filename = INSTALLDIR.'/doc/'.$title;
+        if (!file_exists($filename)) {
+            common_user_error(_('No such document.'));
+            return;
+        }
+        $c = file_get_contents($filename);
+        $output = common_markup_to_html($c);
+        common_show_header(_(ucfirst($title)));
+        common_raw($output);
+        common_show_footer();
+    }
 }
index b35b4d28ee1a28c66b82e46454522c50332e5882..b77817c8e4d8c8a9b831c9b2c2bf28c2566bca4b 100644 (file)
@@ -23,308 +23,308 @@ require_once(INSTALLDIR.'/lib/settingsaction.php');
 
 class EmailsettingsAction extends SettingsAction {
 
-       function get_instructions() {
-               return _('Manage how you get email from %%site.name%%.');
-       }
-
-       function show_form($msg=NULL, $success=false) {
-               $user = common_current_user();
-               $this->form_header(_('Email Settings'), $msg, $success);
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'emailsettings',
-                                                                                  'action' =>
-                                                                                  common_local_url('emailsettings')));
-               common_hidden('token', common_session_token());
-
-               common_element('h2', NULL, _('Address'));
-
-               if ($user->email) {
-                       common_element_start('p');
-                       common_element('span', 'address confirmed', $user->email);
-                       common_element('span', 'input_instructions',
-                                      _('Current confirmed email address.'));
-                       common_hidden('email', $user->email);
-                       common_element_end('p');
-                       common_submit('remove', _('Remove'));
-               } else {
-                       $confirm = $this->get_confirmation();
-                       if ($confirm) {
-                               common_element_start('p');
-                               common_element('span', 'address unconfirmed', $confirm->address);
-                               common_element('span', 'input_instructions',
-                                                          _('Awaiting confirmation on this address. Check your inbox (and spam box!) for a message with further instructions.'));
-                               common_hidden('email', $confirm->address);
-                               common_element_end('p');
-                               common_submit('cancel', _('Cancel'));
-                       } else {
-                               common_input('email', _('Email Address'),
-                                                        ($this->arg('email')) ? $this->arg('email') : NULL,
-                                                        _('Email address, like "UserName@example.org"'));
-                               common_submit('add', _('Add'));
-                       }
-               }
-
-               if ($user->email) {
-                       common_element('h2', NULL, _('Incoming email'));
-                       
-                       if ($user->incomingemail) {
-                               common_element_start('p');
-                               common_element('span', 'address', $user->incomingemail);
-                               common_element('span', 'input_instructions',
-                                                          _('Send email to this address to post new notices.'));
-                               common_element_end('p');
-                               common_submit('removeincoming', _('Remove'));
-                       }
-                       
-                       common_element_start('p');
-                       common_element('span', 'input_instructions',
-                                                  _('Make a new email address for posting to; cancels the old one.'));
-                       common_element_end('p');
-                       common_submit('newincoming', _('New'));
-               }
-               
-               common_element('h2', NULL, _('Preferences'));
-
-               common_checkbox('emailnotifysub',
-                               _('Send me notices of new subscriptions through email.'),
-                               $user->emailnotifysub);
-               common_checkbox('emailnotifyfav',
-                               _('Send me email when someone adds my notice as a favorite.'),
-                               $user->emailnotifyfav);
-               common_checkbox('emailnotifymsg',
-                               _('Send me email when someone sends me a private message.'),
-                               $user->emailnotifymsg);
-               common_checkbox('emailnotifynudge',
-                               _('Allow friends to nudge me and send me an email.'),
-                               $user->emailnotifynudge);
-               common_checkbox('emailpost',
-                                               _('I want to post notices by email.'),
-                                               $user->emailpost);
-               common_checkbox('emailmicroid',
-                               _('Publish a MicroID for my email address.'),
-                               $user->emailmicroid);
-
-               common_submit('save', _('Save'));
-               
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function get_confirmation() {
-               $user = common_current_user();
-               $confirm = new Confirm_address();
-               $confirm->user_id = $user->id;
-               $confirm->address_type = 'email';
-               if ($confirm->find(TRUE)) {
-                       return $confirm;
-               } else {
-                       return NULL;
-               }
-       }
-
-       function handle_post() {
-
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               if ($this->arg('save')) {
-                       $this->save_preferences();
-               } else if ($this->arg('add')) {
-                       $this->add_address();
-               } else if ($this->arg('cancel')) {
-                       $this->cancel_confirmation();
-               } else if ($this->arg('remove')) {
-                       $this->remove_address();
-               } else if ($this->arg('removeincoming')) {
-                       $this->remove_incoming();
-               } else if ($this->arg('newincoming')) {
-                       $this->new_incoming();
-               } else {
-                       $this->show_form(_('Unexpected form submission.'));
-               }
-       }
-
-       function save_preferences() {
-
-               $emailnotifysub = $this->boolean('emailnotifysub');
-               $emailnotifyfav = $this->boolean('emailnotifyfav');
-               $emailnotifymsg = $this->boolean('emailnotifymsg');
-               $emailnotifynudge = $this->boolean('emailnotifynudge');
-               $emailmicroid = $this->boolean('emailmicroid');
-               $emailpost = $this->boolean('emailpost');
-
-               $user = common_current_user();
-
-               assert(!is_null($user)); # should already be checked
-
-               $user->query('BEGIN');
-
-               $original = clone($user);
-
-               $user->emailnotifysub = $emailnotifysub;
-               $user->emailnotifyfav = $emailnotifyfav;
-               $user->emailnotifymsg = $emailnotifymsg;
-               $user->emailnotifynudge = $emailnotifynudge;
-               $user->emailmicroid = $emailmicroid;
-               $user->emailpost = $emailpost;
-
-               $result = $user->update($original);
-
-               if ($result === FALSE) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t update user.'));
-                       return;
-               }
-
-               $user->query('COMMIT');
-
-               $this->show_form(_('Preferences saved.'), true);
-       }
-
-       function add_address() {
-
-               $user = common_current_user();
-
-               $email = $this->trimmed('email');
-
-               # Some validation
-
-               if (!$email) {
-                       $this->show_form(_('No email address.'));
-                       return;
-               }
-
-               $email = common_canonical_email($email);
-
-               if (!$email) {
-                   $this->show_form(_('Cannot normalize that email address'));
-                   return;
-               }
-               if (!Validate::email($email, true)) {
-                   $this->show_form(_('Not a valid email address'));
-                   return;
-               } else if ($user->email == $email) {
-                   $this->show_form(_('That is already your email address.'));
-                   return;
-               } else if ($this->email_exists($email)) {
-                   $this->show_form(_('That email address already belongs to another user.'));
-                   return;
-               }
-
-               $confirm = new Confirm_address();
-               $confirm->address = $email;
-               $confirm->address_type = 'email';
-               $confirm->user_id = $user->id;
-               $confirm->code = common_confirmation_code(64);
-
-               $result = $confirm->insert();
-
-               if ($result === FALSE) {
-                       common_log_db_error($confirm, 'INSERT', __FILE__);
-                       common_server_error(_('Couldn\'t insert confirmation code.'));
-                       return;
-               }
-
-               mail_confirm_address($user, $confirm->code, $user->nickname, $email);
-
-               $msg = _('A confirmation code was sent to the email address you added. Check your inbox (and spam box!) for the code and instructions on how to use it.');
-
-               $this->show_form($msg, TRUE);
-       }
-
-       function cancel_confirmation() {
-               $email = $this->arg('email');
-               $confirm = $this->get_confirmation();
-               if (!$confirm) {
-                       $this->show_form(_('No pending confirmation to cancel.'));
-                       return;
-               }
-               if ($confirm->address != $email) {
-                       $this->show_form(_('That is the wrong IM address.'));
-                       return;
-               }
+    function get_instructions() {
+        return _('Manage how you get email from %%site.name%%.');
+    }
+
+    function show_form($msg=NULL, $success=false) {
+        $user = common_current_user();
+        $this->form_header(_('Email Settings'), $msg, $success);
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'emailsettings',
+                                           'action' =>
+                                           common_local_url('emailsettings')));
+        common_hidden('token', common_session_token());
+
+        common_element('h2', NULL, _('Address'));
+
+        if ($user->email) {
+            common_element_start('p');
+            common_element('span', 'address confirmed', $user->email);
+            common_element('span', 'input_instructions',
+                           _('Current confirmed email address.'));
+            common_hidden('email', $user->email);
+            common_element_end('p');
+            common_submit('remove', _('Remove'));
+        } else {
+            $confirm = $this->get_confirmation();
+            if ($confirm) {
+                common_element_start('p');
+                common_element('span', 'address unconfirmed', $confirm->address);
+                common_element('span', 'input_instructions',
+                               _('Awaiting confirmation on this address. Check your inbox (and spam box!) for a message with further instructions.'));
+                common_hidden('email', $confirm->address);
+                common_element_end('p');
+                common_submit('cancel', _('Cancel'));
+            } else {
+                common_input('email', _('Email Address'),
+                             ($this->arg('email')) ? $this->arg('email') : NULL,
+                             _('Email address, like "UserName@example.org"'));
+                common_submit('add', _('Add'));
+            }
+        }
+
+        if ($user->email) {
+            common_element('h2', NULL, _('Incoming email'));
+            
+            if ($user->incomingemail) {
+                common_element_start('p');
+                common_element('span', 'address', $user->incomingemail);
+                common_element('span', 'input_instructions',
+                               _('Send email to this address to post new notices.'));
+                common_element_end('p');
+                common_submit('removeincoming', _('Remove'));
+            }
+            
+            common_element_start('p');
+            common_element('span', 'input_instructions',
+                           _('Make a new email address for posting to; cancels the old one.'));
+            common_element_end('p');
+            common_submit('newincoming', _('New'));
+        }
+        
+        common_element('h2', NULL, _('Preferences'));
+
+        common_checkbox('emailnotifysub',
+                        _('Send me notices of new subscriptions through email.'),
+                        $user->emailnotifysub);
+        common_checkbox('emailnotifyfav',
+                        _('Send me email when someone adds my notice as a favorite.'),
+                        $user->emailnotifyfav);
+        common_checkbox('emailnotifymsg',
+                        _('Send me email when someone sends me a private message.'),
+                        $user->emailnotifymsg);
+        common_checkbox('emailnotifynudge',
+                        _('Allow friends to nudge me and send me an email.'),
+                        $user->emailnotifynudge);
+        common_checkbox('emailpost',
+                        _('I want to post notices by email.'),
+                        $user->emailpost);
+        common_checkbox('emailmicroid',
+                        _('Publish a MicroID for my email address.'),
+                        $user->emailmicroid);
+
+        common_submit('save', _('Save'));
+        
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function get_confirmation() {
+        $user = common_current_user();
+        $confirm = new Confirm_address();
+        $confirm->user_id = $user->id;
+        $confirm->address_type = 'email';
+        if ($confirm->find(TRUE)) {
+            return $confirm;
+        } else {
+            return NULL;
+        }
+    }
+
+    function handle_post() {
+
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        if ($this->arg('save')) {
+            $this->save_preferences();
+        } else if ($this->arg('add')) {
+            $this->add_address();
+        } else if ($this->arg('cancel')) {
+            $this->cancel_confirmation();
+        } else if ($this->arg('remove')) {
+            $this->remove_address();
+        } else if ($this->arg('removeincoming')) {
+            $this->remove_incoming();
+        } else if ($this->arg('newincoming')) {
+            $this->new_incoming();
+        } else {
+            $this->show_form(_('Unexpected form submission.'));
+        }
+    }
+
+    function save_preferences() {
+
+        $emailnotifysub = $this->boolean('emailnotifysub');
+        $emailnotifyfav = $this->boolean('emailnotifyfav');
+        $emailnotifymsg = $this->boolean('emailnotifymsg');
+        $emailnotifynudge = $this->boolean('emailnotifynudge');
+        $emailmicroid = $this->boolean('emailmicroid');
+        $emailpost = $this->boolean('emailpost');
+
+        $user = common_current_user();
+
+        assert(!is_null($user)); # should already be checked
+
+        $user->query('BEGIN');
+
+        $original = clone($user);
+
+        $user->emailnotifysub = $emailnotifysub;
+        $user->emailnotifyfav = $emailnotifyfav;
+        $user->emailnotifymsg = $emailnotifymsg;
+        $user->emailnotifynudge = $emailnotifynudge;
+        $user->emailmicroid = $emailmicroid;
+        $user->emailpost = $emailpost;
+
+        $result = $user->update($original);
+
+        if ($result === FALSE) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t update user.'));
+            return;
+        }
+
+        $user->query('COMMIT');
+
+        $this->show_form(_('Preferences saved.'), true);
+    }
+
+    function add_address() {
+
+        $user = common_current_user();
+
+        $email = $this->trimmed('email');
+
+        # Some validation
+
+        if (!$email) {
+            $this->show_form(_('No email address.'));
+            return;
+        }
+
+        $email = common_canonical_email($email);
+
+        if (!$email) {
+            $this->show_form(_('Cannot normalize that email address'));
+            return;
+        }
+        if (!Validate::email($email, true)) {
+            $this->show_form(_('Not a valid email address'));
+            return;
+        } else if ($user->email == $email) {
+            $this->show_form(_('That is already your email address.'));
+            return;
+        } else if ($this->email_exists($email)) {
+            $this->show_form(_('That email address already belongs to another user.'));
+            return;
+        }
+
+          $confirm = new Confirm_address();
+           $confirm->address = $email;
+           $confirm->address_type = 'email';
+           $confirm->user_id = $user->id;
+           $confirm->code = common_confirmation_code(64);
+
+        $result = $confirm->insert();
+
+        if ($result === FALSE) {
+            common_log_db_error($confirm, 'INSERT', __FILE__);
+            common_server_error(_('Couldn\'t insert confirmation code.'));
+            return;
+        }
+
+        mail_confirm_address($user, $confirm->code, $user->nickname, $email);
+
+        $msg = _('A confirmation code was sent to the email address you added. Check your inbox (and spam box!) for the code and instructions on how to use it.');
+
+        $this->show_form($msg, TRUE);
+    }
+
+    function cancel_confirmation() {
+        $email = $this->arg('email');
+        $confirm = $this->get_confirmation();
+        if (!$confirm) {
+            $this->show_form(_('No pending confirmation to cancel.'));
+            return;
+        }
+        if ($confirm->address != $email) {
+            $this->show_form(_('That is the wrong IM address.'));
+            return;
+        }
 
         $result = $confirm->delete();
 
         if (!$result) {
-                       common_log_db_error($confirm, 'DELETE', __FILE__);
+            common_log_db_error($confirm, 'DELETE', __FILE__);
             $this->server_error(_('Couldn\'t delete email confirmation.'));
             return;
         }
 
         $this->show_form(_('Confirmation cancelled.'), TRUE);
-       }
-
-       function remove_address() {
-
-               $user = common_current_user();
-               $email = $this->arg('email');
-
-               # Maybe an old tab open...?
-
-               if ($user->email != $email) {
-                   $this->show_form(_('That is not your email address.'));
-                   return;
-               }
-
-               $user->query('BEGIN');
-               $original = clone($user);
-               $user->email = NULL;
-               $result = $user->updateKeys($original);
-               if (!$result) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t update user.'));
-                       return;
-               }
-               $user->query('COMMIT');
-
-               $this->show_form(_('The address was removed.'), TRUE);
-       }
-
-       function remove_incoming() {
-               $user = common_current_user();
-               
-               if (!$user->incomingemail) {
-                       $this->show_form(_('No incoming email address.'));
-                       return;
-               }
-               
-               $orig = clone($user);
-               $user->incomingemail = NULL;
-
-               if (!$user->updateKeys($orig)) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       $this->server_error(_("Couldn't update user record."));
-               }
-               
-               $this->show_form(_('Incoming email address removed.'), TRUE);
-       }
-
-       function new_incoming() {
-               $user = common_current_user();
-               
-               $orig = clone($user);
-               $user->incomingemail = mail_new_incoming_address();
-               
-               if (!$user->updateKeys($orig)) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       $this->server_error(_("Couldn't update user record."));
-               }
-
-               $this->show_form(_('New incoming email address added.'), TRUE);
-       }
-       
-       function email_exists($email) {
-               $user = common_current_user();
-               $other = User::staticGet('email', $email);
-               if (!$other) {
-                       return false;
-               } else {
-                       return $other->id != $user->id;
-               }
-       }
+    }
+
+    function remove_address() {
+
+        $user = common_current_user();
+        $email = $this->arg('email');
+
+        # Maybe an old tab open...?
+
+        if ($user->email != $email) {
+            $this->show_form(_('That is not your email address.'));
+            return;
+        }
+
+        $user->query('BEGIN');
+        $original = clone($user);
+        $user->email = NULL;
+        $result = $user->updateKeys($original);
+        if (!$result) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t update user.'));
+            return;
+        }
+        $user->query('COMMIT');
+
+        $this->show_form(_('The address was removed.'), TRUE);
+    }
+
+    function remove_incoming() {
+        $user = common_current_user();
+        
+        if (!$user->incomingemail) {
+            $this->show_form(_('No incoming email address.'));
+            return;
+        }
+        
+        $orig = clone($user);
+        $user->incomingemail = NULL;
+
+        if (!$user->updateKeys($orig)) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            $this->server_error(_("Couldn't update user record."));
+        }
+        
+        $this->show_form(_('Incoming email address removed.'), TRUE);
+    }
+
+    function new_incoming() {
+        $user = common_current_user();
+        
+        $orig = clone($user);
+        $user->incomingemail = mail_new_incoming_address();
+        
+        if (!$user->updateKeys($orig)) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            $this->server_error(_("Couldn't update user record."));
+        }
+
+        $this->show_form(_('New incoming email address added.'), TRUE);
+    }
+    
+    function email_exists($email) {
+        $user = common_current_user();
+        $other = User::staticGet('email', $email);
+        if (!$other) {
+            return false;
+        } else {
+            return $other->id != $user->id;
+        }
+    }
 }
index 8ee2d4cd36812392931078833652f4b86d9ebfc6..c964f451af8abbc9c82da53214bf9361f1db4d73 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,110 +23,110 @@ require_once(INSTALLDIR.'/lib/facebookaction.php');
 
 class FacebookhomeAction extends FacebookAction {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               $this->login();
-       }
+        $this->login();
+    }
 
-       function login() {
+    function login() {
 
-               $user = null;
+        $user = null;
 
-               $facebook = $this->get_facebook();
-               $fbuid = $facebook->require_login();
+        $facebook = $this->get_facebook();
+        $fbuid = $facebook->require_login();
 
-               # check to see whether there's already a Facebook link for this user
-               $flink = Foreign_link::getByForeignID($fbuid, 2); // 2 == Facebook
+        # check to see whether there's already a Facebook link for this user
+        $flink = Foreign_link::getByForeignID($fbuid, 2); // 2 == Facebook
 
-               if ($flink) {
+        if ($flink) {
 
-                       $user = $flink->getUser();
-                       $this->show_home($facebook, $fbuid, $user);
+            $user = $flink->getUser();
+            $this->show_home($facebook, $fbuid, $user);
 
-               } else {
+        } else {
 
-                       # Make the user put in her Laconica creds
-                       $nickname = common_canonical_nickname($this->trimmed('nickname'));
-                       $password = $this->arg('password');
+            # Make the user put in her Laconica creds
+            $nickname = common_canonical_nickname($this->trimmed('nickname'));
+            $password = $this->arg('password');
 
-                       if ($nickname) {
+            if ($nickname) {
 
-                               if (common_check_user($nickname, $password)) {
+                if (common_check_user($nickname, $password)) {
 
 
-                                       $user = User::staticGet('nickname', $nickname);
+                    $user = User::staticGet('nickname', $nickname);
 
-                                       if (!$user) {
-                                               echo '<fb:error message="Coudln\'t get user!" />';
-                                               $this->show_login_form();
-                                       }
+                    if (!$user) {
+                        echo '<fb:error message="Coudln\'t get user!" />';
+                        $this->show_login_form();
+                    }
 
-                                       $flink = DB_DataObject::factory('foreign_link');
-                                       $flink->user_id = $user->id;
-                                       $flink->foreign_id = $fbuid;
-                                       $flink->service = 2; # Facebook
-                                       $flink->created = common_sql_now();
+                    $flink = DB_DataObject::factory('foreign_link');
+                    $flink->user_id = $user->id;
+                    $flink->foreign_id = $fbuid;
+                    $flink->service = 2; # Facebook
+                    $flink->created = common_sql_now();
 
-                                       # $this->set_flags($flink, $noticesync, $replysync, $friendsync);
+                    # $this->set_flags($flink, $noticesync, $replysync, $friendsync);
 
-                                       $flink_id = $flink->insert();
+                    $flink_id = $flink->insert();
 
-                                       if ($flink_id) {
-                                               echo '<fb:success message="You can now use the Identi.ca from Facebook!" />';
-                                       }
+                    if ($flink_id) {
+                        echo '<fb:success message="You can now use the Identi.ca from Facebook!" />';
+                    }
 
-                                       $this->show_home($facebook, $fbuid, $user);
+                    $this->show_home($facebook, $fbuid, $user);
 
-                                       return;
-                               } else {
-                                       echo '<fb:error message="Incorrect username or password." />';
-                               }
-                       }
+                    return;
+                } else {
+                    echo '<fb:error message="Incorrect username or password." />';
+                }
+            }
 
-                       $this->show_login_form();
-               }
+            $this->show_login_form();
+        }
 
-       }
+    }
 
-       function show_home($facebook, $fbuid, $user) {
+    function show_home($facebook, $fbuid, $user) {
 
-               $this->show_header('Home');
+        $this->show_header('Home');
 
-               echo $this->show_notices($user);
-               $this->update_profile_box($facebook, $fbuid, $user);
+        echo $this->show_notices($user);
+        $this->update_profile_box($facebook, $fbuid, $user);
 
-               $this->show_footer();
-       }
+        $this->show_footer();
+    }
 
-       function show_notices($user) {
+    function show_notices($user) {
 
-               $page = $this->trimmed('page');
-               if (!$page) {
-                       $page = 1;
-               }
+        $page = $this->trimmed('page');
+        if (!$page) {
+            $page = 1;
+        }
 
-               $notice = $user->noticesWithFriends(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+        $notice = $user->noticesWithFriends(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
 
-               echo '<ul id="notices">';
+        echo '<ul id="notices">';
 
-               $cnt = 0;
+        $cnt = 0;
 
-               while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) {
-                       $cnt++;
+        while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) {
+            $cnt++;
 
-                       if ($cnt > NOTICES_PER_PAGE) {
-                               break;
-                       }
+            if ($cnt > NOTICES_PER_PAGE) {
+                break;
+            }
 
-                       echo $this->render_notice($notice);
-               }
+            echo $this->render_notice($notice);
+        }
 
-               echo '<ul>';
+        echo '<ul>';
 
-               $this->pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'index.php', array('nickname' => $user->nickname));
+        $this->pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'index.php', array('nickname' => $user->nickname));
 
-       }
+    }
 
 }
index 68b351fb93b96b4a967affedca7093cb9029f060..3a85a7c5c0f85f2a164178b347b185bb54faaaf2 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,24 +23,24 @@ require_once(INSTALLDIR.'/lib/facebookaction.php');
 
 class FacebookinviteAction extends FacebookAction {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               $this->display();
-       }
+        $this->display();
+    }
 
-       function display() {
+    function display() {
 
-               $facebook = $this->get_facebook();
+        $facebook = $this->get_facebook();
 
-               $fbuid = $facebook->require_login();
+        $fbuid = $facebook->require_login();
 
-               $this->show_header('Invite');
+        $this->show_header('Invite');
 
-               echo '<h2>Coming soon...</h2>';
+        echo '<h2>Coming soon...</h2>';
 
-               $this->show_footer();
+        $this->show_footer();
 
-       }
+    }
 
 }
index 2a7bdd03e0f624060991a8053194726dcaa60a71..1215f6622032e3ffcc3b9240879aaaccbbee59d8 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,43 +23,43 @@ require_once(INSTALLDIR.'/lib/facebookaction.php');
 
 class FacebookremoveAction extends FacebookAction {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               $secret = common_config('facebook', 'secret');
+        $secret = common_config('facebook', 'secret');
 
-               $sig = '';
+        $sig = '';
 
-               ksort($_POST);
+        ksort($_POST);
 
-               foreach ($_POST as $key => $val) {
-                       if (substr($key, 0, 7) == 'fb_sig_') {
-                               $sig .= substr($key, 7) . '=' . $val;
-                       }
-                }
+        foreach ($_POST as $key => $val) {
+            if (substr($key, 0, 7) == 'fb_sig_') {
+                $sig .= substr($key, 7) . '=' . $val;
+            }
+         }
 
-               $sig .= $secret;
-               $verify = md5($sig);
+        $sig .= $secret;
+        $verify = md5($sig);
 
-               if ($verify == $this->arg('fb_sig')) {
+        if ($verify == $this->arg('fb_sig')) {
 
-                       $flink = Foreign_link::getByForeignID($this->arg('fb_sig_user'), 2);
+            $flink = Foreign_link::getByForeignID($this->arg('fb_sig_user'), 2);
 
-                       common_debug("Removing foreign link to Facebook - local user ID: $flink->user_id, Facebook ID: $flink->foreign_id");
+            common_debug("Removing foreign link to Facebook - local user ID: $flink->user_id, Facebook ID: $flink->foreign_id");
 
-                       $result = $flink->delete();
+            $result = $flink->delete();
 
-                       if (!$result) {
-                               common_log_db_error($flink, 'DELETE', __FILE__);
-                               common_server_error(_('Couldn\'t remove Facebook user.'));
-                               return;
-                       }
+            if (!$result) {
+                common_log_db_error($flink, 'DELETE', __FILE__);
+                common_server_error(_('Couldn\'t remove Facebook user.'));
+                return;
+            }
 
-               } else {
-                       # Someone bad tried to remove facebook link?
-                       common_log(LOG_ERR, "Someone from $_SERVER[REMOTE_ADDR] " .
-                               'unsuccessfully tried to remove a foreign link to Facebook!');
-               }
-       }
+        } else {
+            # Someone bad tried to remove facebook link?
+            common_log(LOG_ERR, "Someone from $_SERVER[REMOTE_ADDR] " .
+                'unsuccessfully tried to remove a foreign link to Facebook!');
+        }
+    }
 
 }
index 4d7000d605e9e4e81b7593af0100817d0394a41e..a5ad9d07ac8c6c3884d896e8d42bae28b29537cf 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,30 +23,30 @@ require_once(INSTALLDIR.'/lib/facebookaction.php');
 
 class FacebooksettingsAction extends FacebookAction {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               $this->display();
-       }
+        $this->display();
+    }
 
-       function display() {
+    function display() {
 
-               $facebook = $this->get_facebook();
+        $facebook = $this->get_facebook();
 
-               $fbuid = $facebook->require_login();
+        $fbuid = $facebook->require_login();
 
-               $fbml = '<fb:if-section-not-added section="profile">'
-                       .'<h2>Add an Identi.ca box to your profile!</h2>'
-                       .'<fb:add-section-button section="profile"/>'
-                       .'</fb:if-section-not-added>';
+        $fbml = '<fb:if-section-not-added section="profile">'
+            .'<h2>Add an Identi.ca box to your profile!</h2>'
+            .'<fb:add-section-button section="profile"/>'
+            .'</fb:if-section-not-added>';
 
 
-               $this->show_header('Settings');
+        $this->show_header('Settings');
 
-               echo $fbml;
+        echo $fbml;
 
-               $this->show_footer();
+        $this->show_footer();
 
-       }
+    }
 
 }
index aede32902e62bd287976771e8563f9f5d9070a4c..c0b0324b5b04b84211c9e6086f75fb60cd2be24e 100644 (file)
@@ -23,72 +23,72 @@ require_once(INSTALLDIR.'/lib/mail.php');
 
 class FavorAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-                       return;
-               }
-
-               $user = common_current_user();
-
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       common_redirect(common_local_url('showfavorites', array('nickname' => $user->nickname)));
-                       return;
-               }
-
-               $id = $this->trimmed('notice');
-
-               $notice = Notice::staticGet($id);
-
-               # CSRF protection
-
-               $token = $this->trimmed('token-'.$notice->id);
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_("There was a problem with your session token. Try again, please."));
-                       return;
-               }
-
-               if ($user->hasFave($notice)) {
-                       $this->client_error(_('This notice is already a favorite!'));
-                       return;
-               }
-
-               $fave = Fave::addNew($user, $notice);
-
-               if (!$fave) {
-                       $this->server_error(_('Could not create favorite.'));
-                       return;
-               }
-
-               $this->notify($fave, $notice, $user);
-               $user->blowFavesCache();
-               
-               if ($this->boolean('ajax')) {
-                       common_start_html('text/xml;charset=utf-8', true);
-                       common_element_start('head');
-                       common_element('title', null, _('Disfavor favorite'));
-                       common_element_end('head');
-                       common_element_start('body');
-                       common_disfavor_form($notice);
-                       common_element_end('body');
-                       common_element_end('html');
-               } else {
-                       common_redirect(common_local_url('showfavorites',
-                                                                                        array('nickname' => $user->nickname)));
-               }
-       }
-
-       function notify($fave, $notice, $user) {
-           $other = User::staticGet('id', $notice->profile_id);
-               if ($other && $other->id != $user->id) {
-                       if ($other->email && $other->emailnotifyfav) {
-                               mail_notify_fave($other, $user, $notice);
-                       }
-                       # XXX: notify by IM
-                       # XXX: notify by SMS
-               }
-       }
+    function handle($args) {
+        parent::handle($args);
+
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+            return;
+        }
+
+        $user = common_current_user();
+
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            common_redirect(common_local_url('showfavorites', array('nickname' => $user->nickname)));
+            return;
+        }
+
+        $id = $this->trimmed('notice');
+
+        $notice = Notice::staticGet($id);
+
+        # CSRF protection
+
+        $token = $this->trimmed('token-'.$notice->id);
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_("There was a problem with your session token. Try again, please."));
+            return;
+        }
+
+        if ($user->hasFave($notice)) {
+            $this->client_error(_('This notice is already a favorite!'));
+            return;
+        }
+
+        $fave = Fave::addNew($user, $notice);
+
+        if (!$fave) {
+            $this->server_error(_('Could not create favorite.'));
+            return;
+        }
+
+        $this->notify($fave, $notice, $user);
+        $user->blowFavesCache();
+        
+        if ($this->boolean('ajax')) {
+            common_start_html('text/xml;charset=utf-8', true);
+            common_element_start('head');
+            common_element('title', null, _('Disfavor favorite'));
+            common_element_end('head');
+            common_element_start('body');
+            common_disfavor_form($notice);
+            common_element_end('body');
+            common_element_end('html');
+        } else {
+            common_redirect(common_local_url('showfavorites',
+                                             array('nickname' => $user->nickname)));
+        }
+    }
+
+    function notify($fave, $notice, $user) {
+        $other = User::staticGet('id', $notice->profile_id);
+        if ($other && $other->id != $user->id) {
+            if ($other->email && $other->emailnotifyfav) {
+                mail_notify_fave($other, $user, $notice);
+            }
+            # XXX: notify by IM
+            # XXX: notify by SMS
+        }
+    }
 
 }
index dc8070d060b1571f9143bb1b84ede62f8ef17b18..6a465df96a7503f544509707bd3b736ec741c155 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,77 +23,77 @@ require_once(INSTALLDIR.'/lib/stream.php');
 
 class FavoritedAction extends StreamAction {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
 
-               common_show_header(_('Popular notices'),
-                                                  array($this, 'show_header'), NULL,
-                                                  array($this, 'show_top'));
+        common_show_header(_('Popular notices'),
+                           array($this, 'show_header'), NULL,
+                           array($this, 'show_top'));
 
-               $this->show_notices($page);
+        $this->show_notices($page);
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function show_top() {
-               $instr = $this->get_instructions();
-               $output = common_markup_to_html($instr);
-               common_element_start('div', 'instructions');
-               common_raw($output);
-               common_element_end('div');
-               $this->public_views_menu();
-       }
+    function show_top() {
+        $instr = $this->get_instructions();
+        $output = common_markup_to_html($instr);
+        common_element_start('div', 'instructions');
+        common_raw($output);
+        common_element_end('div');
+        $this->public_views_menu();
+    }
 
-       function show_header() {
+    function show_header() {
         return;
-       }
+    }
 
-       function get_instructions() {
-               return _('Showing recently popular notices');
-       }
+    function get_instructions() {
+        return _('Showing recently popular notices');
+    }
 
-       function show_notices($page) {
+    function show_notices($page) {
 
-               $qry = 'SELECT notice.*, sum(exp(-(now() - fave.modified) / %s)) as weight ' .
-                               'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
-                               'GROUP BY fave.notice_id ' .
-                               'ORDER BY weight DESC';
+        $qry = 'SELECT notice.*, sum(exp(-(now() - fave.modified) / %s)) as weight ' .
+                'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
+                'GROUP BY fave.notice_id ' .
+                'ORDER BY weight DESC';
 
-               $offset = ($page - 1) * NOTICES_PER_PAGE;
-               $limit = NOTICES_PER_PAGE + 1;
+        $offset = ($page - 1) * NOTICES_PER_PAGE;
+        $limit = NOTICES_PER_PAGE + 1;
 
-               if (common_config('db','type') == 'pgsql') {
-                       $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
-               } else {
-                       $qry .= ' LIMIT ' . $offset . ', ' . $limit;
-               }
+        if (common_config('db','type') == 'pgsql') {
+            $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+        } else {
+            $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+        }
 
-               # Figure out how to cache this query
+        # Figure out how to cache this query
 
-               $notice = new Notice;
-               $notice->query(sprintf($qry, common_config('popular', 'dropoff')));
+        $notice = new Notice;
+        $notice->query(sprintf($qry, common_config('popular', 'dropoff')));
 
-               common_element_start('ul', array('id' => 'notices'));
+        common_element_start('ul', array('id' => 'notices'));
 
-               $cnt = 0;
+        $cnt = 0;
 
-               while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) {
-                       $cnt++;
+        while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) {
+            $cnt++;
 
-                       if ($cnt > NOTICES_PER_PAGE) {
-                               break;
-                       }
+            if ($cnt > NOTICES_PER_PAGE) {
+                break;
+            }
 
             $item = new NoticeListItem($notice);
             $item->show();
-               }
+        }
 
-               common_element_end('ul');
+        common_element_end('ul');
 
-               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'favorited');
-       }
+        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'favorited');
+    }
 
 }
index 25dd3861fa29fed97076d0bcad6974bd5ffc0e18..642d4f880269369e90baefcb43578911d8e802ee 100644 (file)
@@ -25,49 +25,49 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class FavoritesrssAction extends Rss10Action {
 
-       var $user = NULL;
-       
-       function init() {
-               $nickname = $this->trimmed('nickname');
-               $this->user = User::staticGet('nickname', $nickname);
+    var $user = NULL;
+    
+    function init() {
+        $nickname = $this->trimmed('nickname');
+        $this->user = User::staticGet('nickname', $nickname);
 
-               if (!$this->user) {
-                       common_user_error(_('No such user.'));
-                       return false;
-               } else {
-                       return true;
-               }
-       }
+        if (!$this->user) {
+            common_user_error(_('No such user.'));
+            return false;
+        } else {
+            return true;
+        }
+    }
 
-       function get_notices($limit=0) {
+    function get_notices($limit=0) {
 
-               $user = $this->user;
+        $user = $this->user;
 
-               $notice = $user->favoriteNotices(0, $limit);
+        $notice = $user->favoriteNotices(0, $limit);
 
-               $notices = array();
+        $notices = array();
 
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
 
-               return $notices;
-       }
+        return $notices;
+    }
 
-       function get_channel() {
-               $user = $this->user;
-               $c = array('url' => common_local_url('favoritesrss',
-                                                                                        array('nickname' =>
-                                                                                                  $user->nickname)),
-                                  'title' => sprintf(_("%s favorite notices"), $user->nickname),
-                                  'link' => common_local_url('showfavorites',
-                                                                                        array('nickname' =>
-                                                                                                  $user->nickname)),
-                                  'description' => sprintf(_('Feed of favorite notices of %s'), $user->nickname));
-               return $c;
-       }
+    function get_channel() {
+        $user = $this->user;
+        $c = array('url' => common_local_url('favoritesrss',
+                                             array('nickname' =>
+                                                   $user->nickname)),
+                   'title' => sprintf(_("%s favorite notices"), $user->nickname),
+                   'link' => common_local_url('showfavorites',
+                                             array('nickname' =>
+                                                   $user->nickname)),
+                   'description' => sprintf(_('Feed of favorite notices of %s'), $user->nickname));
+        return $c;
+    }
 
-       function get_image() {
-               return NULL;
-       }
+    function get_image() {
+        return NULL;
+    }
 }
\ No newline at end of file
index 96fbd89ab7d05440cd7bc3f588d20464a89b3ee2..2ff4f7745dbe2a622111ebd20b976a4b63e4c9d3 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -24,79 +24,79 @@ require_once(INSTALLDIR.'/lib/profilelist.php');
 
 class FeaturedAction extends StreamAction {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
 
-               common_show_header(_('Featured users'),
-                                                  array($this, 'show_header'), NULL,
-                                                  array($this, 'show_top'));
+        common_show_header(_('Featured users'),
+                           array($this, 'show_header'), NULL,
+                           array($this, 'show_top'));
 
-               $this->show_notices($page);
+        $this->show_notices($page);
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function show_top() {
-               $instr = $this->get_instructions();
-               $output = common_markup_to_html($instr);
-               common_element_start('div', 'instructions');
-               common_raw($output);
-               common_element_end('div');
-               $this->public_views_menu();
-       }
+    function show_top() {
+        $instr = $this->get_instructions();
+        $output = common_markup_to_html($instr);
+        common_element_start('div', 'instructions');
+        common_raw($output);
+        common_element_end('div');
+        $this->public_views_menu();
+    }
 
-       function show_header() {
-       }
+    function show_header() {
+    }
 
-       function get_instructions() {
-               return _('Featured users');
-       }
+    function get_instructions() {
+        return _('Featured users');
+    }
 
-       function show_notices($page) {
+    function show_notices($page) {
 
-               // XXX: Note I'm doing it this two-stage way because a raw query
-               // with a JOIN was *not* working. --Zach
+        // XXX: Note I'm doing it this two-stage way because a raw query
+        // with a JOIN was *not* working. --Zach
 
-               $featured_nicks = common_config('nickname', 'featured');
+        $featured_nicks = common_config('nickname', 'featured');
 
-               if (count($featured_nicks) > 0) {
+        if (count($featured_nicks) > 0) {
 
-                       $quoted = array();
+            $quoted = array();
 
-                       foreach ($featured_nicks as $nick) {
-                               $quoted[] = "'$nick'";
-                       }
+            foreach ($featured_nicks as $nick) {
+                $quoted[] = "'$nick'";
+            }
 
-                       $user = new User;
-                       $user->whereAdd(sprintf('nickname IN (%s)', implode(',', $quoted)));
-                       $user->limit(($page - 1) * PROFILES_PER_PAGE, PROFILES_PER_PAGE + 1);
-                       $user->orderBy('user.nickname ASC');
+            $user = new User;
+            $user->whereAdd(sprintf('nickname IN (%s)', implode(',', $quoted)));
+            $user->limit(($page - 1) * PROFILES_PER_PAGE, PROFILES_PER_PAGE + 1);
+            $user->orderBy('user.nickname ASC');
 
-                       $user->find();
+            $user->find();
 
-                       $profile_ids = array();
+            $profile_ids = array();
 
-                       while ($user->fetch()) {
-                               $profile_ids[] = $user->id;
-                       }
+            while ($user->fetch()) {
+                $profile_ids[] = $user->id;
+            }
 
-                       $profile = new Profile;
-                       $profile->whereAdd(sprintf('profile.id IN (%s)', implode(',', $profile_ids)));
-                       $profile->orderBy('nickname ASC');
+            $profile = new Profile;
+            $profile->whereAdd(sprintf('profile.id IN (%s)', implode(',', $profile_ids)));
+            $profile->orderBy('nickname ASC');
 
-                       $cnt = $profile->find();
+            $cnt = $profile->find();
 
-                       if ($cnt > 0) {
-                               $featured = new ProfileList($profile);
-                               $featured->show_list();
-                       }
+            if ($cnt > 0) {
+                $featured = new ProfileList($profile);
+                $featured->show_list();
+            }
 
-                       $profile->free();
+            $profile->free();
 
-                       common_pagination($page > 1, $cnt > PROFILES_PER_PAGE, $page, 'featured');
-               }
-       }
+            common_pagination($page > 1, $cnt > PROFILES_PER_PAGE, $page, 'featured');
+        }
+    }
 
 }
\ No newline at end of file
index 54d81b0b4e538efd0ba3c60d43f7d22566daaf53..07024e09151fc3fdf9f54df66f7791dd2a8ea182 100644 (file)
@@ -23,81 +23,81 @@ require_once(INSTALLDIR.'/lib/openid.php');
 
 class FinishaddopenidAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-               } else {
-                       $this->try_login();
-               }
-       }
-       
-       function try_login() {
-
-               $consumer =& oid_consumer();
-
-               $response = $consumer->complete(common_local_url('finishaddopenid'));
-
-               if ($response->status == Auth_OpenID_CANCEL) {
-                       $this->message(_('OpenID authentication cancelled.'));
-                       return;
-               } else if ($response->status == Auth_OpenID_FAILURE) {
-                       // Authentication failed; display the error message.
-                       $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message));
-               } else if ($response->status == Auth_OpenID_SUCCESS) {
-
-                       $display = $response->getDisplayIdentifier();
-                       $canonical = ($response->endpoint && $response->endpoint->canonicalID) ?
-                         $response->endpoint->canonicalID : $display;
-
-                       $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
-
-                       if ($sreg_resp) {
-                               $sreg = $sreg_resp->contents();
-                       }
-
-                       $cur =& common_current_user();
-                       $other = oid_get_user($canonical);
-
-                       if ($other) {
-                               if ($other->id == $cur->id) {
-                                       $this->message(_('You already have this OpenID!'));
-                               } else {
-                                       $this->message(_('Someone else already has this OpenID.'));
-                               }
-                               return;
-                       }
-
-                       # start a transaction
-
-                       $cur->query('BEGIN');
-
-                       $result = oid_link_user($cur->id, $canonical, $display);
-
-                       if (!$result) {
-                               $this->message(_('Error connecting user.'));
-                               return;
-                       }
-                       if ($sreg) {
-                               if (!oid_update_user($cur, $sreg)) {
-                                       $this->message(_('Error updating profile'));
-                                       return;
-                               }
-                       }
-
-                       # success!
-
-                       $cur->query('COMMIT');
-
-                       oid_set_last($display);
-
-                       common_redirect(common_local_url('openidsettings'));
-               }
-       }
-
-       function message($msg) {
-               common_show_header(_('OpenID Login'));
-               common_element('p', NULL, $msg);
-               common_show_footer();
-       }
+    function handle($args) {
+        parent::handle($args);
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+        } else {
+            $this->try_login();
+        }
+    }
+    
+    function try_login() {
+
+        $consumer =& oid_consumer();
+
+        $response = $consumer->complete(common_local_url('finishaddopenid'));
+
+        if ($response->status == Auth_OpenID_CANCEL) {
+            $this->message(_('OpenID authentication cancelled.'));
+            return;
+        } else if ($response->status == Auth_OpenID_FAILURE) {
+            // Authentication failed; display the error message.
+            $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message));
+        } else if ($response->status == Auth_OpenID_SUCCESS) {
+
+            $display = $response->getDisplayIdentifier();
+            $canonical = ($response->endpoint && $response->endpoint->canonicalID) ?
+              $response->endpoint->canonicalID : $display;
+
+            $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
+
+            if ($sreg_resp) {
+                $sreg = $sreg_resp->contents();
+            }
+
+            $cur =& common_current_user();
+            $other = oid_get_user($canonical);
+
+            if ($other) {
+                if ($other->id == $cur->id) {
+                    $this->message(_('You already have this OpenID!'));
+                } else {
+                    $this->message(_('Someone else already has this OpenID.'));
+                }
+                return;
+            }
+
+            # start a transaction
+
+            $cur->query('BEGIN');
+
+            $result = oid_link_user($cur->id, $canonical, $display);
+
+            if (!$result) {
+                $this->message(_('Error connecting user.'));
+                return;
+            }
+            if ($sreg) {
+                if (!oid_update_user($cur, $sreg)) {
+                    $this->message(_('Error updating profile'));
+                    return;
+                }
+            }
+
+            # success!
+
+            $cur->query('COMMIT');
+
+            oid_set_last($display);
+
+            common_redirect(common_local_url('openidsettings'));
+        }
+    }
+
+    function message($msg) {
+        common_show_header(_('OpenID Login'));
+        common_element('p', NULL, $msg);
+        common_show_footer();
+    }
 }
index 6dbaa3d1c6f0510054721ba5e52e48b76749b2d9..ea711f5c5fa2dbcf453cf7410ed7e32de9c56493 100644 (file)
@@ -23,43 +23,43 @@ require_once(INSTALLDIR.'/lib/openid.php');
 
 class FinishimmediateAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               $consumer = oid_consumer();
+        $consumer = oid_consumer();
 
-               $response = $consumer->complete(common_local_url('finishimmediate'));
+        $response = $consumer->complete(common_local_url('finishimmediate'));
 
-               if ($response->status == Auth_OpenID_SUCCESS) {
-                       $display = $response->getDisplayIdentifier();
-                       $canonical = ($response->endpoint->canonicalID) ?
-                         $response->endpoint->canonicalID : $response->getDisplayIdentifier();
+        if ($response->status == Auth_OpenID_SUCCESS) {
+            $display = $response->getDisplayIdentifier();
+            $canonical = ($response->endpoint->canonicalID) ?
+              $response->endpoint->canonicalID : $response->getDisplayIdentifier();
 
-                       $user = oid_get_user($canonical);
+            $user = oid_get_user($canonical);
 
-                       if ($user) {
-                               oid_update_user($user, $sreg);
-                               oid_set_last($display); # refresh for another year
-                               common_set_user($user->nickname);
-                               $this->go_backto();
-                               return;
-                       }
-               }
+            if ($user) {
+                oid_update_user($user, $sreg);
+                oid_set_last($display); # refresh for another year
+                common_set_user($user->nickname);
+                $this->go_backto();
+                return;
+            }
+        }
 
-               # Failure! Clear openid so we don't try it again
+        # Failure! Clear openid so we don't try it again
 
-               oid_clear_last();
-               $this->go_backto();
-               return;
-       }
+        oid_clear_last();
+        $this->go_backto();
+        return;
+    }
 
-       function go_backto() {
-               common_ensure_session();
-               $backto = $_SESSION['openid_immediate_backto'];
-               if (!$backto) {
-                       # gar. Well, push them to the public page
-                       $backto = common_local_url('public');
-               }
-               common_redirect($backto);
-       }
+    function go_backto() {
+        common_ensure_session();
+        $backto = $_SESSION['openid_immediate_backto'];
+        if (!$backto) {
+            # gar. Well, push them to the public page
+            $backto = common_local_url('public');
+        }
+        common_redirect($backto);
+    }
 }
index 766a08b208a60778e9edccc3ce1345d86e29a58f..a2a778f31081f4c51ceda1d1c7a279919ec01123 100644 (file)
@@ -23,414 +23,414 @@ require_once(INSTALLDIR.'/lib/openid.php');
 
 class FinishopenidloginAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-               if (common_logged_in()) {
-                       common_user_error(_('Already logged in.'));
-               } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $token = $this->trimmed('token');
-                       if (!$token || $token != common_session_token()) {
-                               $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                               return;
-                       }
-                       if ($this->arg('create')) {
-                               if (!$this->boolean('license')) {
-                                       $this->show_form(_('You can\'t register if you don\'t agree to the license.'),
-                                                                        $this->trimmed('newname'));
-                                       return;
-                               }
-                               $this->create_new_user();
-                       } else if ($this->arg('connect')) {
-                               $this->connect_user();
-                       } else {
-                               common_debug(print_r($this->args, true), __FILE__);
-                               $this->show_form(_('Something weird happened.'),
-                                                                $this->trimmed('newname'));
-                       }
-               } else {
-                       $this->try_login();
-               }
-       }
-
-       function show_top($error=NULL) {
-               if ($error) {
-                       common_element('div', array('class' => 'error'), $error);
-               } else {
-                       global $config;
-                       common_element('div', 'instructions',
-                                                  sprintf(_('This is the first time you\'ve logged into %s so we must connect your OpenID to a local account. You can either create a new account, or connect with your existing account, if you have one.'), $config['site']['name']));
-               }
-       }
-
-       function show_form($error=NULL, $username=NULL) {
-               common_show_header(_('OpenID Account Setup'), NULL, $error,
-                                                  array($this, 'show_top'));
-
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'account_connect',
-                                                                                  'action' => common_local_url('finishopenidlogin')));
-               common_hidden('token', common_session_token());
-               common_element('h2', NULL,
-                                          _('Create new account'));
-               common_element('p', NULL,
-                                          _('Create a new user with this nickname.'));
-               common_input('newname', _('New nickname'),
-                                        ($username) ? $username : '',
-                                        _('1-64 lowercase letters or numbers, no punctuation or spaces'));
-               common_element_start('p');
-               common_element('input', array('type' => 'checkbox',
-                                                                         'id' => 'license',
-                                                                         'name' => 'license',
-                                                                         'value' => 'true'));
-               common_text(_('My text and files are available under '));
-               common_element('a', array(href => common_config('license', 'url')),
-                                          common_config('license', 'title'));
-               common_text(_(' except this private data: password, email address, IM address, phone number.'));
-               common_element_end('p');
-               common_submit('create', _('Create'));
-               common_element('h2', NULL,
-                                          _('Connect existing account'));
-               common_element('p', NULL,
-                                          _('If you already have an account, login with your username and password to connect it to your OpenID.'));
-               common_input('nickname', _('Existing nickname'));
-               common_password('password', _('Password'));
-               common_submit('connect', _('Connect'));
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function try_login() {
-
-               $consumer = oid_consumer();
-
-               $response = $consumer->complete(common_local_url('finishopenidlogin'));
-
-               if ($response->status == Auth_OpenID_CANCEL) {
-                       $this->message(_('OpenID authentication cancelled.'));
-                       return;
-               } else if ($response->status == Auth_OpenID_FAILURE) {
-                       // Authentication failed; display the error message.
-                       $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message));
-               } else if ($response->status == Auth_OpenID_SUCCESS) {
-                       // This means the authentication succeeded; extract the
-                       // identity URL and Simple Registration data (if it was
-                       // returned).
-                       $display = $response->getDisplayIdentifier();
-                       $canonical = ($response->endpoint->canonicalID) ?
-                         $response->endpoint->canonicalID : $response->getDisplayIdentifier();
-
-                       $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
-
-                       if ($sreg_resp) {
-                               $sreg = $sreg_resp->contents();
-                       }
-
-                       $user = oid_get_user($canonical);
-
-                       if ($user) {
-                               oid_set_last($display);
-                               # XXX: commented out at @edd's request until better
-                               # control over how data flows from OpenID provider.
-                               # oid_update_user($user, $sreg);
-                               common_set_user($user);
-                               common_real_login(true);
-                               if (isset($_SESSION['openid_rememberme']) && $_SESSION['openid_rememberme']) {
-                                       common_rememberme($user);
-                               }
+    function handle($args) {
+        parent::handle($args);
+        if (common_logged_in()) {
+            common_user_error(_('Already logged in.'));
+        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $token = $this->trimmed('token');
+            if (!$token || $token != common_session_token()) {
+                $this->show_form(_('There was a problem with your session token. Try again, please.'));
+                return;
+            }
+            if ($this->arg('create')) {
+                if (!$this->boolean('license')) {
+                    $this->show_form(_('You can\'t register if you don\'t agree to the license.'),
+                                     $this->trimmed('newname'));
+                    return;
+                }
+                $this->create_new_user();
+            } else if ($this->arg('connect')) {
+                $this->connect_user();
+            } else {
+                common_debug(print_r($this->args, true), __FILE__);
+                $this->show_form(_('Something weird happened.'),
+                                 $this->trimmed('newname'));
+            }
+        } else {
+            $this->try_login();
+        }
+    }
+
+    function show_top($error=NULL) {
+        if ($error) {
+            common_element('div', array('class' => 'error'), $error);
+        } else {
+            global $config;
+            common_element('div', 'instructions',
+                           sprintf(_('This is the first time you\'ve logged into %s so we must connect your OpenID to a local account. You can either create a new account, or connect with your existing account, if you have one.'), $config['site']['name']));
+        }
+    }
+
+    function show_form($error=NULL, $username=NULL) {
+        common_show_header(_('OpenID Account Setup'), NULL, $error,
+                           array($this, 'show_top'));
+
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'account_connect',
+                                           'action' => common_local_url('finishopenidlogin')));
+        common_hidden('token', common_session_token());
+        common_element('h2', NULL,
+                       _('Create new account'));
+        common_element('p', NULL,
+                       _('Create a new user with this nickname.'));
+        common_input('newname', _('New nickname'),
+                     ($username) ? $username : '',
+                     _('1-64 lowercase letters or numbers, no punctuation or spaces'));
+        common_element_start('p');
+        common_element('input', array('type' => 'checkbox',
+                                      'id' => 'license',
+                                      'name' => 'license',
+                                      'value' => 'true'));
+        common_text(_('My text and files are available under '));
+        common_element('a', array(href => common_config('license', 'url')),
+                       common_config('license', 'title'));
+        common_text(_(' except this private data: password, email address, IM address, phone number.'));
+        common_element_end('p');
+        common_submit('create', _('Create'));
+        common_element('h2', NULL,
+                       _('Connect existing account'));
+        common_element('p', NULL,
+                       _('If you already have an account, login with your username and password to connect it to your OpenID.'));
+        common_input('nickname', _('Existing nickname'));
+        common_password('password', _('Password'));
+        common_submit('connect', _('Connect'));
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function try_login() {
+
+        $consumer = oid_consumer();
+
+        $response = $consumer->complete(common_local_url('finishopenidlogin'));
+
+        if ($response->status == Auth_OpenID_CANCEL) {
+            $this->message(_('OpenID authentication cancelled.'));
+            return;
+        } else if ($response->status == Auth_OpenID_FAILURE) {
+            // Authentication failed; display the error message.
+            $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message));
+        } else if ($response->status == Auth_OpenID_SUCCESS) {
+            // This means the authentication succeeded; extract the
+            // identity URL and Simple Registration data (if it was
+            // returned).
+            $display = $response->getDisplayIdentifier();
+            $canonical = ($response->endpoint->canonicalID) ?
+              $response->endpoint->canonicalID : $response->getDisplayIdentifier();
+
+            $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
+
+            if ($sreg_resp) {
+                $sreg = $sreg_resp->contents();
+            }
+
+            $user = oid_get_user($canonical);
+
+            if ($user) {
+                oid_set_last($display);
+                # XXX: commented out at @edd's request until better
+                # control over how data flows from OpenID provider.
+                # oid_update_user($user, $sreg);
+                common_set_user($user);
+                common_real_login(true);
+                if (isset($_SESSION['openid_rememberme']) && $_SESSION['openid_rememberme']) {
+                    common_rememberme($user);
+                }
                 unset($_SESSION['openid_rememberme']);
-                               $this->go_home($user->nickname);
-                       } else {
-                               $this->save_values($display, $canonical, $sreg);
-                               $this->show_form(NULL, $this->best_new_nickname($display, $sreg));
-                       }
-               }
-       }
-
-       function message($msg) {
-               common_show_header(_('OpenID Login'));
-               common_element('p', NULL, $msg);
-               common_show_footer();
-       }
-
-       function save_values($display, $canonical, $sreg) {
-               common_ensure_session();
-               $_SESSION['openid_display'] = $display;
-               $_SESSION['openid_canonical'] = $canonical;
-               $_SESSION['openid_sreg'] = $sreg;
-       }
-
-       function get_saved_values() {
-               return array($_SESSION['openid_display'],
-                                        $_SESSION['openid_canonical'],
-                                        $_SESSION['openid_sreg']);
-       }
-
-       function create_new_user() {
+                $this->go_home($user->nickname);
+            } else {
+                $this->save_values($display, $canonical, $sreg);
+                $this->show_form(NULL, $this->best_new_nickname($display, $sreg));
+            }
+        }
+    }
+
+    function message($msg) {
+        common_show_header(_('OpenID Login'));
+        common_element('p', NULL, $msg);
+        common_show_footer();
+    }
+
+    function save_values($display, $canonical, $sreg) {
+        common_ensure_session();
+        $_SESSION['openid_display'] = $display;
+        $_SESSION['openid_canonical'] = $canonical;
+        $_SESSION['openid_sreg'] = $sreg;
+    }
+
+    function get_saved_values() {
+        return array($_SESSION['openid_display'],
+                     $_SESSION['openid_canonical'],
+                     $_SESSION['openid_sreg']);
+    }
+
+    function create_new_user() {
 
         # FIXME: save invite code before redirect, and check here
 
-               if (common_config('site', 'closed') || common_config('site', 'inviteonly')) {
-                       common_user_error(_('Registration not allowed.'));
+        if (common_config('site', 'closed') || common_config('site', 'inviteonly')) {
+            common_user_error(_('Registration not allowed.'));
             return;
         }
 
-               $nickname = $this->trimmed('newname');
+        $nickname = $this->trimmed('newname');
 
-               if (!Validate::string($nickname, array('min_length' => 1,
-                                                                                          'max_length' => 64,
-                                                                                          'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
-                       $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
-                       return;
-               }
+        if (!Validate::string($nickname, array('min_length' => 1,
+                                               'max_length' => 64,
+                                               'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+            $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
+            return;
+        }
 
-               if (!User::allowed_nickname($nickname)) {
-                       $this->show_form(_('Nickname not allowed.'));
-                       return;
-               }
+        if (!User::allowed_nickname($nickname)) {
+            $this->show_form(_('Nickname not allowed.'));
+            return;
+        }
 
-               if (User::staticGet('nickname', $nickname)) {
-                       $this->show_form(_('Nickname already in use. Try another one.'));
-                       return;
-               }
+        if (User::staticGet('nickname', $nickname)) {
+            $this->show_form(_('Nickname already in use. Try another one.'));
+            return;
+        }
 
-               list($display, $canonical, $sreg) = $this->get_saved_values();
+        list($display, $canonical, $sreg) = $this->get_saved_values();
 
-               if (!$display || !$canonical) {
-                       common_server_error(_('Stored OpenID not found.'));
-                       return;
-               }
+        if (!$display || !$canonical) {
+            common_server_error(_('Stored OpenID not found.'));
+            return;
+        }
 
-               # Possible race condition... let's be paranoid
+        # Possible race condition... let's be paranoid
 
-               $other = oid_get_user($canonical);
+        $other = oid_get_user($canonical);
 
-               if ($other) {
-                       common_server_error(_('Creating new account for OpenID that already has a user.'));
-                       return;
-               }
+        if ($other) {
+            common_server_error(_('Creating new account for OpenID that already has a user.'));
+            return;
+        }
 
-               if ($sreg['country']) {
-                       if ($sreg['postcode']) {
-                               # XXX: use postcode to get city and region
-                               # XXX: also, store postcode somewhere -- it's valuable!
-                               $location = $sreg['postcode'] . ', ' . $sreg['country'];
-                       } else {
-                               $location = $sreg['country'];
-                       }
-               }
+        if ($sreg['country']) {
+            if ($sreg['postcode']) {
+                # XXX: use postcode to get city and region
+                # XXX: also, store postcode somewhere -- it's valuable!
+                $location = $sreg['postcode'] . ', ' . $sreg['country'];
+            } else {
+                $location = $sreg['country'];
+            }
+        }
 
-               if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
-                       $fullname = $sreg['fullname'];
-               }
+        if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
+            $fullname = $sreg['fullname'];
+        }
 
-               if ($sreg['email'] && Validate::email($sreg['email'], true)) {
-                       $email = $sreg['email'];
-               }
+        if ($sreg['email'] && Validate::email($sreg['email'], true)) {
+            $email = $sreg['email'];
+        }
 
-               # XXX: add language
-               # XXX: add timezone
+        # XXX: add language
+        # XXX: add timezone
 
-               $user = User::register(array('nickname' => $nickname,
-                                                                        'email' => $email,
-                                                                        'fullname' => $fullname,
-                                                                        'location' => $location));
+        $user = User::register(array('nickname' => $nickname,
+                                     'email' => $email,
+                                     'fullname' => $fullname,
+                                     'location' => $location));
 
-               $result = oid_link_user($user->id, $canonical, $display);
+        $result = oid_link_user($user->id, $canonical, $display);
 
-               oid_set_last($display);
-               common_set_user($user);
-               common_real_login(true);
+        oid_set_last($display);
+        common_set_user($user);
+        common_real_login(true);
         if (isset($_SESSION['openid_rememberme']) && $_SESSION['openid_rememberme']) {
-                       common_rememberme($user);
-               }
+            common_rememberme($user);
+        }
         unset($_SESSION['openid_rememberme']);
-               common_redirect(common_local_url('showstream', array('nickname' => $user->nickname)));
-       }
+        common_redirect(common_local_url('showstream', array('nickname' => $user->nickname)));
+    }
 
-       function connect_user() {
+    function connect_user() {
 
-               $nickname = $this->trimmed('nickname');
-               $password = $this->trimmed('password');
+        $nickname = $this->trimmed('nickname');
+        $password = $this->trimmed('password');
 
-               if (!common_check_user($nickname, $password)) {
-                       $this->show_form(_('Invalid username or password.'));
-                       return;
-               }
+        if (!common_check_user($nickname, $password)) {
+            $this->show_form(_('Invalid username or password.'));
+            return;
+        }
 
-               # They're legit!
+        # They're legit!
 
-               $user = User::staticGet('nickname', $nickname);
+        $user = User::staticGet('nickname', $nickname);
 
-               list($display, $canonical, $sreg) = $this->get_saved_values();
+        list($display, $canonical, $sreg) = $this->get_saved_values();
 
-               if (!$display || !$canonical) {
-                       common_server_error(_('Stored OpenID not found.'));
-                       return;
-               }
+        if (!$display || !$canonical) {
+            common_server_error(_('Stored OpenID not found.'));
+            return;
+        }
 
-               $result = oid_link_user($user->id, $canonical, $display);
+        $result = oid_link_user($user->id, $canonical, $display);
 
-               if (!$result) {
-                       common_server_error(_('Error connecting user to OpenID.'));
-                       return;
-               }
+        if (!$result) {
+            common_server_error(_('Error connecting user to OpenID.'));
+            return;
+        }
 
-               oid_update_user($user, $sreg);
-               oid_set_last($display);
-               common_set_user($user);
-               common_real_login(true);
+        oid_update_user($user, $sreg);
+        oid_set_last($display);
+        common_set_user($user);
+        common_real_login(true);
         if (isset($_SESSION['openid_rememberme']) && $_SESSION['openid_rememberme']) {
-                       common_rememberme($user);
-               }
-               unset($_SESSION['openid_rememberme']);
-               $this->go_home($user->nickname);
-       }
-
-       function go_home($nickname) {
-               $url = common_get_returnto();
-               if ($url) {
-                       # We don't have to return to it again
-                       common_set_returnto(NULL);
-               } else {
-                       $url = common_local_url('all',
-                                                                       array('nickname' =>
-                                                                                 $nickname));
-               }
-               common_redirect($url);
-       }
-
-       function best_new_nickname($display, $sreg) {
-
-               # Try the passed-in nickname
-
-               if ($sreg['nickname']) {
-                       $nickname = $this->nicknamize($sreg['nickname']);
-                       if ($this->is_new_nickname($nickname)) {
-                               return $nickname;
-                       }
-               }
-
-               # Try the full name
-
-               if ($sreg['fullname']) {
-                       $fullname = $this->nicknamize($sreg['fullname']);
-                       if ($this->is_new_nickname($fullname)) {
-                               return $fullname;
-                       }
-               }
-
-               # Try the URL
-
-               $from_url = $this->openid_to_nickname($display);
-
-               if ($from_url && $this->is_new_nickname($from_url)) {
-                       return $from_url;
-               }
-
-               # XXX: others?
-
-               return NULL;
-       }
-
-       function is_new_nickname($str) {
-               if (!Validate::string($str, array('min_length' => 1,
-                                                                                 'max_length' => 64,
-                                                                                 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
-                       return false;
-               }
-       if (!User::allowed_nickname($str)) {
-                       return false;
-               }
-               if (User::staticGet('nickname', $str)) {
-                       return false;
-               }
-               return true;
-       }
-
-       function openid_to_nickname($openid) {
+            common_rememberme($user);
+        }
+        unset($_SESSION['openid_rememberme']);
+        $this->go_home($user->nickname);
+    }
+
+    function go_home($nickname) {
+        $url = common_get_returnto();
+        if ($url) {
+            # We don't have to return to it again
+            common_set_returnto(NULL);
+        } else {
+            $url = common_local_url('all',
+                                    array('nickname' =>
+                                          $nickname));
+        }
+        common_redirect($url);
+    }
+
+    function best_new_nickname($display, $sreg) {
+
+        # Try the passed-in nickname
+
+        if ($sreg['nickname']) {
+            $nickname = $this->nicknamize($sreg['nickname']);
+            if ($this->is_new_nickname($nickname)) {
+                return $nickname;
+            }
+        }
+
+        # Try the full name
+
+        if ($sreg['fullname']) {
+            $fullname = $this->nicknamize($sreg['fullname']);
+            if ($this->is_new_nickname($fullname)) {
+                return $fullname;
+            }
+        }
+
+        # Try the URL
+
+        $from_url = $this->openid_to_nickname($display);
+
+        if ($from_url && $this->is_new_nickname($from_url)) {
+            return $from_url;
+        }
+
+        # XXX: others?
+
+        return NULL;
+    }
+
+    function is_new_nickname($str) {
+        if (!Validate::string($str, array('min_length' => 1,
+                                          'max_length' => 64,
+                                          'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+            return false;
+        }
+    if (!User::allowed_nickname($str)) {
+            return false;
+        }
+        if (User::staticGet('nickname', $str)) {
+            return false;
+        }
+        return true;
+    }
+
+    function openid_to_nickname($openid) {
         if (Auth_Yadis_identifierScheme($openid) == 'XRI') {
-                       return $this->xri_to_nickname($openid);
-               } else {
-                       return $this->url_to_nickname($openid);
-               }
-       }
+            return $this->xri_to_nickname($openid);
+        } else {
+            return $this->url_to_nickname($openid);
+        }
+    }
 
-       # We try to use an OpenID URL as a legal Laconica user name in this order
-       # 1. Plain hostname, like http://evanp.myopenid.com/
-       # 2. One element in path, like http://profile.typekey.com/EvanProdromou/
-       #    or http://getopenid.com/evanprodromou
+    # We try to use an OpenID URL as a legal Laconica user name in this order
+    # 1. Plain hostname, like http://evanp.myopenid.com/
+    # 2. One element in path, like http://profile.typekey.com/EvanProdromou/
+    #    or http://getopenid.com/evanprodromou
 
     function url_to_nickname($openid) {
-               static $bad = array('query', 'user', 'password', 'port', 'fragment');
-
-           $parts = parse_url($openid);
-
-               # If any of these parts exist, this won't work
-
-               foreach ($bad as $badpart) {
-                       if (array_key_exists($badpart, $parts)) {
-                               return NULL;
-                       }
-               }
-
-               # We just have host and/or path
-
-               # If it's just a host...
-               if (array_key_exists('host', $parts) &&
-                       (!array_key_exists('path', $parts) || strcmp($parts['path'], '/') == 0))
-               {
-                       $hostparts = explode('.', $parts['host']);
-
-                       # Try to catch common idiom of nickname.service.tld
-
-                       if ((count($hostparts) > 2) &&
-                               (strlen($hostparts[count($hostparts) - 2]) > 3) && # try to skip .co.uk, .com.au
-                               (strcmp($hostparts[0], 'www') != 0))
-                       {
-                               return $this->nicknamize($hostparts[0]);
-                       } else {
-                               # Do the whole hostname
-                               return $this->nicknamize($parts['host']);
-                       }
-               } else {
-                       if (array_key_exists('path', $parts)) {
-                               # Strip starting, ending slashes
-                               $path = preg_replace('@/$@', '', $parts['path']);
-                               $path = preg_replace('@^/@', '', $path);
-                               if (strpos($path, '/') === false) {
-                                       return $this->nicknamize($path);
-                               }
-                       }
-               }
-
-               return NULL;
-       }
-
-       function xri_to_nickname($xri) {
-               $base = $this->xri_base($xri);
-
-               if (!$base) {
-                       return NULL;
-               } else {
-                       # =evan.prodromou
-                       # or @gratis*evan.prodromou
-                       $parts = explode('*', substr($base, 1));
-                       return $this->nicknamize(array_pop($parts));
-               }
-       }
-
-       function xri_base($xri) {
-               if (substr($xri, 0, 6) == 'xri://') {
-                       return substr($xri, 6);
-               } else {
-                       return $xri;
-               }
-       }
-
-       # Given a string, try to make it work as a nickname
-
-       function nicknamize($str) {
-               $str = preg_replace('/\W/', '', $str);
-               return strtolower($str);
-       }
+        static $bad = array('query', 'user', 'password', 'port', 'fragment');
+
+        $parts = parse_url($openid);
+
+        # If any of these parts exist, this won't work
+
+        foreach ($bad as $badpart) {
+            if (array_key_exists($badpart, $parts)) {
+                return NULL;
+            }
+        }
+
+        # We just have host and/or path
+
+        # If it's just a host...
+        if (array_key_exists('host', $parts) &&
+            (!array_key_exists('path', $parts) || strcmp($parts['path'], '/') == 0))
+        {
+            $hostparts = explode('.', $parts['host']);
+
+            # Try to catch common idiom of nickname.service.tld
+
+            if ((count($hostparts) > 2) &&
+                (strlen($hostparts[count($hostparts) - 2]) > 3) && # try to skip .co.uk, .com.au
+                (strcmp($hostparts[0], 'www') != 0))
+            {
+                return $this->nicknamize($hostparts[0]);
+            } else {
+                # Do the whole hostname
+                return $this->nicknamize($parts['host']);
+            }
+        } else {
+            if (array_key_exists('path', $parts)) {
+                # Strip starting, ending slashes
+                $path = preg_replace('@/$@', '', $parts['path']);
+                $path = preg_replace('@^/@', '', $path);
+                if (strpos($path, '/') === false) {
+                    return $this->nicknamize($path);
+                }
+            }
+        }
+
+        return NULL;
+    }
+
+    function xri_to_nickname($xri) {
+        $base = $this->xri_base($xri);
+
+        if (!$base) {
+            return NULL;
+        } else {
+            # =evan.prodromou
+            # or @gratis*evan.prodromou
+            $parts = explode('*', substr($base, 1));
+            return $this->nicknamize(array_pop($parts));
+        }
+    }
+
+    function xri_base($xri) {
+        if (substr($xri, 0, 6) == 'xri://') {
+            return substr($xri, 6);
+        } else {
+            return $xri;
+        }
+    }
+
+    # Given a string, try to make it work as a nickname
+
+    function nicknamize($str) {
+        $str = preg_replace('/\W/', '', $str);
+        return strtolower($str);
+    }
 }
index 58040683fdb44bed058e280b903633f382920902..c3387cf0235a0e3528562fe1446166a3878a90c1 100644 (file)
@@ -23,174 +23,174 @@ require_once(INSTALLDIR.'/lib/omb.php');
 
 class FinishremotesubscribeAction extends Action {
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               if (common_logged_in()) {
-                       common_user_error(_('You can use the local subscription!'));
-                   return;
-               }
+        if (common_logged_in()) {
+            common_user_error(_('You can use the local subscription!'));
+            return;
+        }
+
+        $omb = $_SESSION['oauth_authorization_request'];
+
+        if (!$omb) {
+            common_user_error(_('Not expecting this response!'));
+            return;
+        }
+
+        common_debug('stored request: '.print_r($omb,true), __FILE__);
+
+        common_remove_magic_from_request();
+        $req = OAuthRequest::from_request();
 
-               $omb = $_SESSION['oauth_authorization_request'];
+        $token = $req->get_parameter('oauth_token');
 
-               if (!$omb) {
-                       common_user_error(_('Not expecting this response!'));
-                       return;
-               }
+        # I think this is the success metric
 
-               common_debug('stored request: '.print_r($omb,true), __FILE__);
+        if ($token != $omb['token']) {
+            common_user_error(_('Not authorized.'));
+            return;
+        }
 
-               common_remove_magic_from_request();
-               $req = OAuthRequest::from_request();
+        $version = $req->get_parameter('omb_version');
+
+        if ($version != OMB_VERSION_01) {
+            common_user_error(_('Unknown version of OMB protocol.'));
+            return;
+        }
 
-               $token = $req->get_parameter('oauth_token');
+        $nickname = $req->get_parameter('omb_listener_nickname');
 
-               # I think this is the success metric
+        if (!$nickname) {
+            common_user_error(_('No nickname provided by remote server.'));
+            return;
+        }
 
-               if ($token != $omb['token']) {
-                       common_user_error(_('Not authorized.'));
-                       return;
-               }
-
-               $version = $req->get_parameter('omb_version');
-
-               if ($version != OMB_VERSION_01) {
-                       common_user_error(_('Unknown version of OMB protocol.'));
-                       return;
-               }
-
-               $nickname = $req->get_parameter('omb_listener_nickname');
-
-               if (!$nickname) {
-                       common_user_error(_('No nickname provided by remote server.'));
-                       return;
-               }
-
-               $profile_url = $req->get_parameter('omb_listener_profile');
-
-               if (!$profile_url) {
-                       common_user_error(_('No profile URL returned by server.'));
-                       return;
-               }
-
-               if (!Validate::uri($profile_url, array('allowed_schemes' => array('http', 'https')))) {
-                       common_user_error(_('Invalid profile URL returned by server.'));
-                       return;
-               }
-
-               if ($profile_url == common_local_url('showstream', array('nickname' => $nickname))) {
-                       common_user_error(_('You can use the local subscription!'));
-                   return;
-               }
-
-               common_debug('listenee: "'.$omb['listenee'].'"', __FILE__);
-
-               $user = User::staticGet('nickname', $omb['listenee']);
-
-               if (!$user) {
-                       common_user_error(_('User being listened to doesn\'t exist.'));
-                       return;
-               }
-
-               $other = User::staticGet('uri', $omb['listener']);
-
-               if ($other) {
-                       common_user_error(_('You can use the local subscription!'));
-                       return;
-               }
-
-               $fullname = $req->get_parameter('omb_listener_fullname');
-               $homepage = $req->get_parameter('omb_listener_homepage');
-               $bio = $req->get_parameter('omb_listener_bio');
-               $location = $req->get_parameter('omb_listener_location');
-               $avatar_url = $req->get_parameter('omb_listener_avatar');
-
-               list($newtok, $newsecret) = $this->access_token($omb);
-
-               if (!$newtok || !$newsecret) {
-                       common_user_error(_('Couldn\'t convert request tokens to access tokens.'));
-                       return;
-               }
-
-               # XXX: possible attack point; subscribe and return someone else's profile URI
-
-               $remote = Remote_profile::staticGet('uri', $omb['listener']);
-
-               if ($remote) {
-                       $exists = true;
-                       $profile = Profile::staticGet($remote->id);
-                       $orig_remote = clone($remote);
-                       $orig_profile = clone($profile);
-                       # XXX: compare current postNotice and updateProfile URLs to the ones
-                       # stored in the DB to avoid (possibly...) above attack
-               } else {
-                       $exists = false;
-                       $remote = new Remote_profile();
-                       $remote->uri = $omb['listener'];
-                       $profile = new Profile();
-               }
-
-               $profile->nickname = $nickname;
-               $profile->profileurl = $profile_url;
-
-               if ($fullname) {
-                       $profile->fullname = $fullname;
-               }
-               if ($homepage) {
-                       $profile->homepage = $homepage;
-               }
-               if ($bio) {
-                       $profile->bio = $bio;
-               }
-               if ($location) {
-                       $profile->location = $location;
-               }
-
-               if ($exists) {
-                       $profile->update($orig_profile);
-               } else {
-                       $profile->created = DB_DataObject_Cast::dateTime(); # current time
-                       $id = $profile->insert();
-                       if (!$id) {
-                               common_server_error(_('Error inserting new profile'));
-                               return;
-                       }
-                       $remote->id = $id;
-               }
-
-               if ($avatar_url) {
-                       if (!$this->add_avatar($profile, $avatar_url)) {
-                               common_server_error(_('Error inserting avatar'));
-                               return;
-                       }
-               }
-
-               $remote->postnoticeurl = $omb['post_notice_url'];
-               $remote->updateprofileurl = $omb['update_profile_url'];
-
-               if ($exists) {
-                       if (!$remote->update($orig_remote)) {
-                               common_server_error(_('Error updating remote profile'));
-                               return;
-                       }
-               } else {
-                       $remote->created = DB_DataObject_Cast::dateTime(); # current time
-                       if (!$remote->insert()) {
-                               common_server_error(_('Error inserting remote profile'));
-                               return;
-                       }
-               }
+        $profile_url = $req->get_parameter('omb_listener_profile');
+
+        if (!$profile_url) {
+            common_user_error(_('No profile URL returned by server.'));
+            return;
+        }
+
+        if (!Validate::uri($profile_url, array('allowed_schemes' => array('http', 'https')))) {
+            common_user_error(_('Invalid profile URL returned by server.'));
+            return;
+        }
+
+        if ($profile_url == common_local_url('showstream', array('nickname' => $nickname))) {
+            common_user_error(_('You can use the local subscription!'));
+            return;
+        }
+
+        common_debug('listenee: "'.$omb['listenee'].'"', __FILE__);
+
+        $user = User::staticGet('nickname', $omb['listenee']);
+
+        if (!$user) {
+            common_user_error(_('User being listened to doesn\'t exist.'));
+            return;
+        }
+
+        $other = User::staticGet('uri', $omb['listener']);
+
+        if ($other) {
+            common_user_error(_('You can use the local subscription!'));
+            return;
+        }
+
+        $fullname = $req->get_parameter('omb_listener_fullname');
+        $homepage = $req->get_parameter('omb_listener_homepage');
+        $bio = $req->get_parameter('omb_listener_bio');
+        $location = $req->get_parameter('omb_listener_location');
+        $avatar_url = $req->get_parameter('omb_listener_avatar');
+
+        list($newtok, $newsecret) = $this->access_token($omb);
+
+        if (!$newtok || !$newsecret) {
+            common_user_error(_('Couldn\'t convert request tokens to access tokens.'));
+            return;
+        }
+
+        # XXX: possible attack point; subscribe and return someone else's profile URI
+
+        $remote = Remote_profile::staticGet('uri', $omb['listener']);
+
+        if ($remote) {
+            $exists = true;
+            $profile = Profile::staticGet($remote->id);
+            $orig_remote = clone($remote);
+            $orig_profile = clone($profile);
+            # XXX: compare current postNotice and updateProfile URLs to the ones
+            # stored in the DB to avoid (possibly...) above attack
+        } else {
+            $exists = false;
+            $remote = new Remote_profile();
+            $remote->uri = $omb['listener'];
+            $profile = new Profile();
+        }
+
+        $profile->nickname = $nickname;
+        $profile->profileurl = $profile_url;
+
+        if ($fullname) {
+            $profile->fullname = $fullname;
+        }
+        if ($homepage) {
+            $profile->homepage = $homepage;
+        }
+        if ($bio) {
+            $profile->bio = $bio;
+        }
+        if ($location) {
+            $profile->location = $location;
+        }
+
+        if ($exists) {
+            $profile->update($orig_profile);
+        } else {
+            $profile->created = DB_DataObject_Cast::dateTime(); # current time
+            $id = $profile->insert();
+            if (!$id) {
+                common_server_error(_('Error inserting new profile'));
+                return;
+            }
+            $remote->id = $id;
+        }
+
+        if ($avatar_url) {
+            if (!$this->add_avatar($profile, $avatar_url)) {
+                common_server_error(_('Error inserting avatar'));
+                return;
+            }
+        }
+
+        $remote->postnoticeurl = $omb['post_notice_url'];
+        $remote->updateprofileurl = $omb['update_profile_url'];
+
+        if ($exists) {
+            if (!$remote->update($orig_remote)) {
+                common_server_error(_('Error updating remote profile'));
+                return;
+            }
+        } else {
+            $remote->created = DB_DataObject_Cast::dateTime(); # current time
+            if (!$remote->insert()) {
+                common_server_error(_('Error inserting remote profile'));
+                return;
+            }
+        }
 
         if ($user->hasBlocked($profile)) {
             $this->client_error(_('That user has blocked you from subscribing.'));
             return;
         }
 
-               $sub = new Subscription();
+        $sub = new Subscription();
 
-               $sub->subscriber = $remote->id;
-               $sub->subscribed = $user->id;
+        $sub->subscriber = $remote->id;
+        $sub->subscribed = $user->id;
 
         $sub_exists = false;
 
@@ -202,8 +202,8 @@ class FinishremotesubscribeAction extends Action {
             $sub->created = DB_DataObject_Cast::dateTime(); # current time
         }
 
-               $sub->token = $newtok;
-               $sub->secret = $newsecret;
+        $sub->token = $newtok;
+        $sub->secret = $newsecret;
 
         if ($sub_exists) {
             $result = $sub->update($orig_sub);
@@ -211,78 +211,78 @@ class FinishremotesubscribeAction extends Action {
             $result = $sub->insert();
         }
 
-               if (!$result) {
+        if (!$result) {
             common_log_db_error($sub, ($sub_exists) ? 'UPDATE' : 'INSERT', __FILE__);
-                       common_user_error(_('Couldn\'t insert new subscription.'));
-                       return;
-               }
+            common_user_error(_('Couldn\'t insert new subscription.'));
+            return;
+        }
 
-               # Notify user, if necessary
+        # Notify user, if necessary
 
-               mail_subscribe_notify_profile($user, $profile);
+        mail_subscribe_notify_profile($user, $profile);
 
-               # Clear the data
-               unset($_SESSION['oauth_authorization_request']);
+        # Clear the data
+        unset($_SESSION['oauth_authorization_request']);
 
-               # If we show subscriptions in reverse chron order, this should
-               # show up close to the top of the page
+        # If we show subscriptions in reverse chron order, this should
+        # show up close to the top of the page
 
-               common_redirect(common_local_url('subscribers', array('nickname' =>
-                                                                                                                        $user->nickname)));
-       }
+        common_redirect(common_local_url('subscribers', array('nickname' =>
+                                                             $user->nickname)));
+    }
 
-       function add_avatar($profile, $url) {
-               $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar');
-               copy($url, $temp_filename);
-               return $profile->setOriginal($temp_filename);
-       }
+    function add_avatar($profile, $url) {
+        $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar');
+        copy($url, $temp_filename);
+        return $profile->setOriginal($temp_filename);
+    }
 
-       function access_token($omb) {
+    function access_token($omb) {
 
-               common_debug('starting request for access token', __FILE__);
+        common_debug('starting request for access token', __FILE__);
 
-               $con = omb_oauth_consumer();
-               $tok = new OAuthToken($omb['token'], $omb['secret']);
+        $con = omb_oauth_consumer();
+        $tok = new OAuthToken($omb['token'], $omb['secret']);
 
-               common_debug('using request token "'.$tok.'"', __FILE__);
+        common_debug('using request token "'.$tok.'"', __FILE__);
 
-               $url = $omb['access_token_url'];
+        $url = $omb['access_token_url'];
 
-               common_debug('using access token url "'.$url.'"', __FILE__);
+        common_debug('using access token url "'.$url.'"', __FILE__);
 
-               # XXX: Is this the right thing to do? Strip off GET params and make them
-               # POST params? Seems wrong to me.
+        # XXX: Is this the right thing to do? Strip off GET params and make them
+        # POST params? Seems wrong to me.
 
-               $parsed = parse_url($url);
-               $params = array();
-               parse_str($parsed['query'], $params);
+        $parsed = parse_url($url);
+        $params = array();
+        parse_str($parsed['query'], $params);
 
-               $req = OAuthRequest::from_consumer_and_token($con, $tok, "POST", $url, $params);
+        $req = OAuthRequest::from_consumer_and_token($con, $tok, "POST", $url, $params);
 
-               $req->set_parameter('omb_version', OMB_VERSION_01);
+        $req->set_parameter('omb_version', OMB_VERSION_01);
 
-               # XXX: test to see if endpoint accepts this signature method
+        # XXX: test to see if endpoint accepts this signature method
 
-               $req->sign_request(omb_hmac_sha1(), $con, $tok);
+        $req->sign_request(omb_hmac_sha1(), $con, $tok);
 
-               # We re-use this tool's fetcher, since it's pretty good
+        # We re-use this tool's fetcher, since it's pretty good
 
-               common_debug('posting to access token url "'.$req->get_normalized_http_url().'"', __FILE__);
-               common_debug('posting request data "'.$req->to_postdata().'"', __FILE__);
+        common_debug('posting to access token url "'.$req->get_normalized_http_url().'"', __FILE__);
+        common_debug('posting request data "'.$req->to_postdata().'"', __FILE__);
 
-               $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
-               $result = $fetcher->post($req->get_normalized_http_url(),
-                                                                $req->to_postdata(),
+        $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+        $result = $fetcher->post($req->get_normalized_http_url(),
+                                 $req->to_postdata(),
                                  array('User-Agent' => 'Laconica/' . LACONICA_VERSION));
 
-               common_debug('got result: "'.print_r($result,TRUE).'"', __FILE__);
+        common_debug('got result: "'.print_r($result,TRUE).'"', __FILE__);
 
-               if ($result->status != 200) {
-                       return NULL;
-               }
+        if ($result->status != 200) {
+            return NULL;
+        }
 
-               parse_str($result->body, $return);
+        parse_str($result->body, $return);
 
-               return array($return['oauth_token'], $return['oauth_token_secret']);
-       }
+        return array($return['oauth_token'], $return['oauth_token_secret']);
+    }
 }
index 6811fc05af647808fd384934c79e20d0bfc44f57..310ba2c19fcdb2c7d2a87224f67d1177b08e2a45 100644 (file)
@@ -25,178 +25,178 @@ define('BOTH', 0);
 
 class FoafAction extends Action {
 
-       function is_readonly() {
-               return true;
-       }
-
-       function handle($args) {
-               parent::handle($args);
-
-               $nickname = $this->trimmed('nickname');
-
-               $user = User::staticGet('nickname', $nickname);
-
-               if (!$user) {
-                       common_user_error(_('No such user.'), 404);
-                       return;
-               }
-
-               $profile = $user->getProfile();
-
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'), 500);
-                       return;
-               }
-
-               header('Content-Type: application/rdf+xml');
-
-               common_start_xml();
-               common_element_start('rdf:RDF', array('xmlns:rdf' =>
-                                                                                         'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
-                                                                                         'xmlns:rdfs' =>
-                                                                                         'http://www.w3.org/2000/01/rdf-schema#',
-                                                                                         'xmlns:geo' =>
-                                                                                         'http://www.w3.org/2003/01/geo/wgs84_pos#',
-                                                                                         'xmlns' => 'http://xmlns.com/foaf/0.1/'));
-
-               # This is the document about the user
-
-               $this->show_ppd('', $user->uri);
-
-               # XXX: might not be a person
-               common_element_start('Person', array('rdf:about' =>
-                                                                                        $user->uri));
-               common_element('mbox_sha1sum', NULL, sha1('mailto:' . $user->email));
-               if ($profile->fullname) {
-                       common_element('name', NULL, $profile->fullname);
-               }
-               if ($profile->homepage) {
-                       common_element('homepage', array('rdf:resource' => $profile->homepage));
-               }
-               if ($profile->bio) {
-                       common_element('rdfs:comment', NULL, $profile->bio);
-               }
-               # XXX: more structured location data
-               if ($profile->location) {
-                       common_element_start('based_near');
-                       common_element_start('geo:SpatialThing');
-                       common_element('name', NULL, $profile->location);
-                       common_element_end('geo:SpatialThing');
-                       common_element_end('based_near');
-               }
-
-               $this->show_microblogging_account($profile, common_root_url());
-
-               $avatar = $profile->getOriginalAvatar();
-
-               if ($avatar) {
-                       common_element_start('img');
-                       common_element_start('Image', array('rdf:about' => $avatar->url));
-                       foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
-                               $scaled = $profile->getAvatar($size);
-                               if (!$scaled->original) { # sometimes the original has one of our scaled sizes
-                                       common_element_start('thumbnail');
-                                       common_element('Image', array('rdf:about' => $scaled->url));
-                                       common_element_end('thumbnail');
-                               }
-                       }
-                       common_element_end('Image');
-                       common_element_end('img');
-               }
-
-               # Get people user is subscribed to
-
-               $person = array();
-
-               $sub = new Subscription();
-               $sub->subscriber = $profile->id;
-               $sub->whereAdd('subscriber != subscribed');
-               
-               if ($sub->find()) {
-                       while ($sub->fetch()) {
-                               if ($sub->token) {
-                                       $other = Remote_profile::staticGet('id', $sub->subscribed);
-                               } else {
-                                       $other = User::staticGet('id', $sub->subscribed);
-                               }
-                               if (!$other) {
-                                       common_debug('Got a bad subscription: '.print_r($sub,TRUE));
-                                       continue;
-                               }
-                               common_element('knows', array('rdf:resource' => $other->uri));
-                               $person[$other->uri] = array(LISTENEE, $other);
-                       }
-               }
-
-               # Get people who subscribe to user
-
-               $sub = new Subscription();
-               $sub->subscribed = $profile->id;
-               $sub->whereAdd('subscriber != subscribed');
-
-               if ($sub->find()) {
-                       while ($sub->fetch()) {
-                               if ($sub->token) {
-                                       $other = Remote_profile::staticGet('id', $sub->subscriber);
-                               } else {
-                                       $other = User::staticGet('id', $sub->subscriber);
-                               }
-                               if (!$other) {
-                                       common_debug('Got a bad subscription: '.print_r($sub,TRUE));
-                                       continue;
-                               }
-                               if (array_key_exists($other->uri, $person)) {
-                                       $person[$other->uri][0] = BOTH;
-                               } else {
-                                       $person[$other->uri] = array(LISTENER, $other);
-                               }
-                       }
-               }
-
-               common_element_end('Person');
-
-               foreach ($person as $uri => $p) {
-                       $foaf_url = NULL;
-                       if ($p[1] instanceof User) {
-                               $foaf_url = common_local_url('foaf', array('nickname' => $p[1]->nickname));
-                       }
-                       $profile = Profile::staticGet($p[1]->id);
-                       common_element_start('Person', array('rdf:about' => $uri));
-                       if ($p[0] == LISTENER || $p[0] == BOTH) {
-                               common_element('knows', array('rdf:resource' => $user->uri));
-                       }
-                       $this->show_microblogging_account($profile, ($p[1] instanceof User) ?
-                                                                                         common_root_url() : NULL);
-                       if ($foaf_url) {
-                               common_element('rdfs:seeAlso', array('rdf:resource' => $foaf_url));
-                       }
-                       common_element_end('Person');
-                       if ($foaf_url) {
-                               $this->show_ppd($foaf_url, $uri);
-                       }
-               }
-
-               common_element_end('rdf:RDF');
-       }
-
-       function show_ppd($foaf_url, $person_uri) {
-               common_element_start('PersonalProfileDocument', array('rdf:about' => $foaf_url));
-               common_element('maker', array('rdf:resource' => $person_uri));
-               common_element('primaryTopic', array('rdf:resource' => $person_uri));
-               common_element_end('PersonalProfileDocument');
-       }
-
-       function show_microblogging_account($profile, $service=NULL) {
-               # Their account
-               common_element_start('holdsAccount');
-               common_element_start('OnlineAccount');
-               if ($service) {
-                       common_element('accountServiceHomepage', array('rdf:resource' =>
-                                                                                                                  $service));
-               }
-               common_element('accountName', NULL, $profile->nickname);
-               common_element('homepage', array('rdf:resource' => $profile->profileurl));
-               common_element_end('OnlineAccount');
-               common_element_end('holdsAccount');
-       }
+    function is_readonly() {
+        return true;
+    }
+
+    function handle($args) {
+        parent::handle($args);
+
+        $nickname = $this->trimmed('nickname');
+
+        $user = User::staticGet('nickname', $nickname);
+
+        if (!$user) {
+            common_user_error(_('No such user.'), 404);
+            return;
+        }
+
+        $profile = $user->getProfile();
+
+        if (!$profile) {
+            common_server_error(_('User has no profile.'), 500);
+            return;
+        }
+
+        header('Content-Type: application/rdf+xml');
+
+        common_start_xml();
+        common_element_start('rdf:RDF', array('xmlns:rdf' =>
+                                              'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
+                                              'xmlns:rdfs' =>
+                                              'http://www.w3.org/2000/01/rdf-schema#',
+                                              'xmlns:geo' =>
+                                              'http://www.w3.org/2003/01/geo/wgs84_pos#',
+                                              'xmlns' => 'http://xmlns.com/foaf/0.1/'));
+
+        # This is the document about the user
+
+        $this->show_ppd('', $user->uri);
+
+        # XXX: might not be a person
+        common_element_start('Person', array('rdf:about' =>
+                                             $user->uri));
+        common_element('mbox_sha1sum', NULL, sha1('mailto:' . $user->email));
+        if ($profile->fullname) {
+            common_element('name', NULL, $profile->fullname);
+        }
+        if ($profile->homepage) {
+            common_element('homepage', array('rdf:resource' => $profile->homepage));
+        }
+        if ($profile->bio) {
+            common_element('rdfs:comment', NULL, $profile->bio);
+        }
+        # XXX: more structured location data
+        if ($profile->location) {
+            common_element_start('based_near');
+            common_element_start('geo:SpatialThing');
+            common_element('name', NULL, $profile->location);
+            common_element_end('geo:SpatialThing');
+            common_element_end('based_near');
+        }
+
+        $this->show_microblogging_account($profile, common_root_url());
+
+        $avatar = $profile->getOriginalAvatar();
+
+        if ($avatar) {
+            common_element_start('img');
+            common_element_start('Image', array('rdf:about' => $avatar->url));
+            foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
+                $scaled = $profile->getAvatar($size);
+                if (!$scaled->original) { # sometimes the original has one of our scaled sizes
+                    common_element_start('thumbnail');
+                    common_element('Image', array('rdf:about' => $scaled->url));
+                    common_element_end('thumbnail');
+                }
+            }
+            common_element_end('Image');
+            common_element_end('img');
+        }
+
+        # Get people user is subscribed to
+
+        $person = array();
+
+        $sub = new Subscription();
+        $sub->subscriber = $profile->id;
+        $sub->whereAdd('subscriber != subscribed');
+        
+        if ($sub->find()) {
+            while ($sub->fetch()) {
+                if ($sub->token) {
+                    $other = Remote_profile::staticGet('id', $sub->subscribed);
+                } else {
+                    $other = User::staticGet('id', $sub->subscribed);
+                }
+                if (!$other) {
+                    common_debug('Got a bad subscription: '.print_r($sub,TRUE));
+                    continue;
+                }
+                common_element('knows', array('rdf:resource' => $other->uri));
+                $person[$other->uri] = array(LISTENEE, $other);
+            }
+        }
+
+        # Get people who subscribe to user
+
+        $sub = new Subscription();
+        $sub->subscribed = $profile->id;
+        $sub->whereAdd('subscriber != subscribed');
+
+        if ($sub->find()) {
+            while ($sub->fetch()) {
+                if ($sub->token) {
+                    $other = Remote_profile::staticGet('id', $sub->subscriber);
+                } else {
+                    $other = User::staticGet('id', $sub->subscriber);
+                }
+                if (!$other) {
+                    common_debug('Got a bad subscription: '.print_r($sub,TRUE));
+                    continue;
+                }
+                if (array_key_exists($other->uri, $person)) {
+                    $person[$other->uri][0] = BOTH;
+                } else {
+                    $person[$other->uri] = array(LISTENER, $other);
+                }
+            }
+        }
+
+        common_element_end('Person');
+
+        foreach ($person as $uri => $p) {
+            $foaf_url = NULL;
+            if ($p[1] instanceof User) {
+                $foaf_url = common_local_url('foaf', array('nickname' => $p[1]->nickname));
+            }
+            $profile = Profile::staticGet($p[1]->id);
+            common_element_start('Person', array('rdf:about' => $uri));
+            if ($p[0] == LISTENER || $p[0] == BOTH) {
+                common_element('knows', array('rdf:resource' => $user->uri));
+            }
+            $this->show_microblogging_account($profile, ($p[1] instanceof User) ?
+                                              common_root_url() : NULL);
+            if ($foaf_url) {
+                common_element('rdfs:seeAlso', array('rdf:resource' => $foaf_url));
+            }
+            common_element_end('Person');
+            if ($foaf_url) {
+                $this->show_ppd($foaf_url, $uri);
+            }
+        }
+
+        common_element_end('rdf:RDF');
+    }
+
+    function show_ppd($foaf_url, $person_uri) {
+        common_element_start('PersonalProfileDocument', array('rdf:about' => $foaf_url));
+        common_element('maker', array('rdf:resource' => $person_uri));
+        common_element('primaryTopic', array('rdf:resource' => $person_uri));
+        common_element_end('PersonalProfileDocument');
+    }
+
+    function show_microblogging_account($profile, $service=NULL) {
+        # Their account
+        common_element_start('holdsAccount');
+        common_element_start('OnlineAccount');
+        if ($service) {
+            common_element('accountServiceHomepage', array('rdf:resource' =>
+                                                           $service));
+        }
+        common_element('accountName', NULL, $profile->nickname);
+        common_element('homepage', array('rdf:resource' => $profile->profileurl));
+        common_element_end('OnlineAccount');
+        common_element_end('holdsAccount');
+    }
 }
index 0aa7631dc2c2fc59314ce269aad42cf65a4985cb..d0c47f7fdd6c49e2534c9c213e64beb2dd271920 100644 (file)
@@ -24,247 +24,247 @@ require_once(INSTALLDIR.'/lib/jabber.php');
 
 class ImsettingsAction extends SettingsAction {
 
-       function get_instructions() {
-               return _('You can send and receive notices through Jabber/GTalk [instant messages](%%doc.im%%). Configure your address and settings below.');
-       }
-
-       function show_form($msg=NULL, $success=false) {
-               $user = common_current_user();
-               $this->form_header(_('IM Settings'), $msg, $success);
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'imsettings',
-                                                                                  'action' =>
-                                                                                  common_local_url('imsettings')));
-               common_hidden('token', common_session_token());
-
-               common_element('h2', NULL, _('Address'));
-
-               if ($user->jabber) {
-                       common_element_start('p');
-                       common_element('span', 'address confirmed', $user->jabber);
-                       common_element('span', 'input_instructions',
-                                      _('Current confirmed Jabber/GTalk address.'));
-                       common_hidden('jabber', $user->jabber);
-                       common_element_end('p');
-                       common_submit('remove', _('Remove'));
-               } else {
-                       $confirm = $this->get_confirmation();
-                       if ($confirm) {
-                               common_element_start('p');
-                               common_element('span', 'address unconfirmed', $confirm->address);
-                               common_element('span', 'input_instructions',
-                                             sprintf(_('Awaiting confirmation on this address. Check your Jabber/GTalk account for a message with further instructions. (Did you add %s to your buddy list?)'), jabber_daemon_address()));
-                               common_hidden('jabber', $confirm->address);
-                               common_element_end('p');
-                               common_submit('cancel', _('Cancel'));
-                       } else {
-                               common_input('jabber', _('IM Address'),
-                                                       ($this->arg('jabber')) ? $this->arg('jabber') : NULL,
-                                                sprintf(_('Jabber or GTalk address, like "UserName@example.org". First, make sure to add %s to your buddy list in your IM client or on GTalk.'), jabber_daemon_address()));
-                               common_submit('add', _('Add'));
-                       }
-               }
-
-               common_element('h2', NULL, _('Preferences'));
-
-               common_checkbox('jabbernotify',
-                               _('Send me notices through Jabber/GTalk.'),
-                               $user->jabbernotify);
-               common_checkbox('updatefrompresence',
-                               _('Post a notice when my Jabber/GTalk status changes.'),
-                               $user->updatefrompresence);
-               common_checkbox('jabberreplies',
-                               _('Send me replies through Jabber/GTalk from people I\'m not subscribed to.'),
-                               $user->jabberreplies);
-               common_checkbox('jabbermicroid',
-                               _('Publish a MicroID for my Jabber/GTalk address.'),
-                               $user->jabbermicroid);
-               common_submit('save', _('Save'));
-
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function get_confirmation() {
-               $user = common_current_user();
-               $confirm = new Confirm_address();
-               $confirm->user_id = $user->id;
-               $confirm->address_type = 'jabber';
-               if ($confirm->find(TRUE)) {
-                       return $confirm;
-               } else {
-                       return NULL;
-               }
-       }
-
-       function handle_post() {
-
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               if ($this->arg('save')) {
-                       $this->save_preferences();
-               } else if ($this->arg('add')) {
-                       $this->add_address();
-               } else if ($this->arg('cancel')) {
-                       $this->cancel_confirmation();
-               } else if ($this->arg('remove')) {
-                       $this->remove_address();
-               } else {
-                       $this->show_form(_('Unexpected form submission.'));
-               }
-       }
-
-       function save_preferences() {
-
-               $jabbernotify = $this->boolean('jabbernotify');
-               $updatefrompresence = $this->boolean('updatefrompresence');
-               $jabberreplies = $this->boolean('jabberreplies');
-               $jabbermicroid = $this->boolean('jabbermicroid');
-
-               $user = common_current_user();
-
-               assert(!is_null($user)); # should already be checked
-
-               $user->query('BEGIN');
-
-               $original = clone($user);
-
-               $user->jabbernotify = $jabbernotify;
-               $user->updatefrompresence = $updatefrompresence;
-               $user->jabberreplies = $jabberreplies;
-               $user->jabbermicroid = $jabbermicroid;
-
-               $result = $user->update($original);
-
-               if ($result === FALSE) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t update user.'));
-                       return;
-               }
-
-               $user->query('COMMIT');
-
-               $this->show_form(_('Preferences saved.'), true);
-       }
-
-       function add_address() {
-
-               $user = common_current_user();
-
-               $jabber = $this->trimmed('jabber');
-
-               # Some validation
-
-               if (!$jabber) {
-                       $this->show_form(_('No Jabber ID.'));
-                       return;
-               }
-
-               $jabber = jabber_normalize_jid($jabber);
-
-               if (!$jabber) {
-                   $this->show_form(_('Cannot normalize that Jabber ID'));
-                   return;
-               }
-               if (!jabber_valid_base_jid($jabber)) {
-                   $this->show_form(_('Not a valid Jabber ID'));
-                   return;
-               } else if ($user->jabber == $jabber) {
-                   $this->show_form(_('That is already your Jabber ID.'));
-                   return;
-               } else if ($this->jabber_exists($jabber)) {
-                   $this->show_form(_('Jabber ID already belongs to another user.'));
-                   return;
-               }
-
-               $confirm = new Confirm_address();
-               $confirm->address = $jabber;
-               $confirm->address_type = 'jabber';
-               $confirm->user_id = $user->id;
-               $confirm->code = common_confirmation_code(64);
-
-               $result = $confirm->insert();
-
-               if ($result === FALSE) {
-                       common_log_db_error($confirm, 'INSERT', __FILE__);
-                       common_server_error(_('Couldn\'t insert confirmation code.'));
-                       return;
-               }
-
-               if (!common_config('queue', 'enabled')) {
-                       jabber_confirm_address($confirm->code,
-                                                                  $user->nickname,
-                                                                  $jabber);
-               }
-
-               $msg = sprintf(_('A confirmation code was sent to the IM address you added. You must approve %s for sending messages to you.'), jabber_daemon_address());
-
-               $this->show_form($msg, TRUE);
-       }
-
-       function cancel_confirmation() {
-               $jabber = $this->arg('jabber');
-               $confirm = $this->get_confirmation();
-               if (!$confirm) {
-                       $this->show_form(_('No pending confirmation to cancel.'));
-                       return;
-               }
-               if ($confirm->address != $jabber) {
-                       $this->show_form(_('That is the wrong IM address.'));
-                       return;
-               }
+    function get_instructions() {
+        return _('You can send and receive notices through Jabber/GTalk [instant messages](%%doc.im%%). Configure your address and settings below.');
+    }
+
+    function show_form($msg=NULL, $success=false) {
+        $user = common_current_user();
+        $this->form_header(_('IM Settings'), $msg, $success);
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'imsettings',
+                                           'action' =>
+                                           common_local_url('imsettings')));
+        common_hidden('token', common_session_token());
+
+        common_element('h2', NULL, _('Address'));
+
+        if ($user->jabber) {
+            common_element_start('p');
+            common_element('span', 'address confirmed', $user->jabber);
+            common_element('span', 'input_instructions',
+                           _('Current confirmed Jabber/GTalk address.'));
+            common_hidden('jabber', $user->jabber);
+            common_element_end('p');
+            common_submit('remove', _('Remove'));
+        } else {
+            $confirm = $this->get_confirmation();
+            if ($confirm) {
+                common_element_start('p');
+                common_element('span', 'address unconfirmed', $confirm->address);
+                common_element('span', 'input_instructions',
+                                sprintf(_('Awaiting confirmation on this address. Check your Jabber/GTalk account for a message with further instructions. (Did you add %s to your buddy list?)'), jabber_daemon_address()));
+                common_hidden('jabber', $confirm->address);
+                common_element_end('p');
+                common_submit('cancel', _('Cancel'));
+            } else {
+                common_input('jabber', _('IM Address'),
+                             ($this->arg('jabber')) ? $this->arg('jabber') : NULL,
+                         sprintf(_('Jabber or GTalk address, like "UserName@example.org". First, make sure to add %s to your buddy list in your IM client or on GTalk.'), jabber_daemon_address()));
+                common_submit('add', _('Add'));
+            }
+        }
+
+        common_element('h2', NULL, _('Preferences'));
+
+        common_checkbox('jabbernotify',
+                        _('Send me notices through Jabber/GTalk.'),
+                        $user->jabbernotify);
+        common_checkbox('updatefrompresence',
+                        _('Post a notice when my Jabber/GTalk status changes.'),
+                        $user->updatefrompresence);
+        common_checkbox('jabberreplies',
+                        _('Send me replies through Jabber/GTalk from people I\'m not subscribed to.'),
+                        $user->jabberreplies);
+        common_checkbox('jabbermicroid',
+                        _('Publish a MicroID for my Jabber/GTalk address.'),
+                        $user->jabbermicroid);
+        common_submit('save', _('Save'));
+
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function get_confirmation() {
+        $user = common_current_user();
+        $confirm = new Confirm_address();
+        $confirm->user_id = $user->id;
+        $confirm->address_type = 'jabber';
+        if ($confirm->find(TRUE)) {
+            return $confirm;
+        } else {
+            return NULL;
+        }
+    }
+
+    function handle_post() {
+
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        if ($this->arg('save')) {
+            $this->save_preferences();
+        } else if ($this->arg('add')) {
+            $this->add_address();
+        } else if ($this->arg('cancel')) {
+            $this->cancel_confirmation();
+        } else if ($this->arg('remove')) {
+            $this->remove_address();
+        } else {
+            $this->show_form(_('Unexpected form submission.'));
+        }
+    }
+
+    function save_preferences() {
+
+        $jabbernotify = $this->boolean('jabbernotify');
+        $updatefrompresence = $this->boolean('updatefrompresence');
+        $jabberreplies = $this->boolean('jabberreplies');
+        $jabbermicroid = $this->boolean('jabbermicroid');
+
+        $user = common_current_user();
+
+        assert(!is_null($user)); # should already be checked
+
+        $user->query('BEGIN');
+
+        $original = clone($user);
+
+        $user->jabbernotify = $jabbernotify;
+        $user->updatefrompresence = $updatefrompresence;
+        $user->jabberreplies = $jabberreplies;
+        $user->jabbermicroid = $jabbermicroid;
+
+        $result = $user->update($original);
+
+        if ($result === FALSE) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t update user.'));
+            return;
+        }
+
+        $user->query('COMMIT');
+
+        $this->show_form(_('Preferences saved.'), true);
+    }
+
+    function add_address() {
+
+        $user = common_current_user();
+
+        $jabber = $this->trimmed('jabber');
+
+        # Some validation
+
+        if (!$jabber) {
+            $this->show_form(_('No Jabber ID.'));
+            return;
+        }
+
+        $jabber = jabber_normalize_jid($jabber);
+
+        if (!$jabber) {
+            $this->show_form(_('Cannot normalize that Jabber ID'));
+            return;
+        }
+        if (!jabber_valid_base_jid($jabber)) {
+            $this->show_form(_('Not a valid Jabber ID'));
+            return;
+        } else if ($user->jabber == $jabber) {
+            $this->show_form(_('That is already your Jabber ID.'));
+            return;
+        } else if ($this->jabber_exists($jabber)) {
+            $this->show_form(_('Jabber ID already belongs to another user.'));
+            return;
+        }
+
+          $confirm = new Confirm_address();
+           $confirm->address = $jabber;
+           $confirm->address_type = 'jabber';
+           $confirm->user_id = $user->id;
+           $confirm->code = common_confirmation_code(64);
+
+        $result = $confirm->insert();
+
+        if ($result === FALSE) {
+            common_log_db_error($confirm, 'INSERT', __FILE__);
+            common_server_error(_('Couldn\'t insert confirmation code.'));
+            return;
+        }
+
+        if (!common_config('queue', 'enabled')) {
+            jabber_confirm_address($confirm->code,
+                                   $user->nickname,
+                                   $jabber);
+        }
+
+        $msg = sprintf(_('A confirmation code was sent to the IM address you added. You must approve %s for sending messages to you.'), jabber_daemon_address());
+
+        $this->show_form($msg, TRUE);
+    }
+
+    function cancel_confirmation() {
+        $jabber = $this->arg('jabber');
+        $confirm = $this->get_confirmation();
+        if (!$confirm) {
+            $this->show_form(_('No pending confirmation to cancel.'));
+            return;
+        }
+        if ($confirm->address != $jabber) {
+            $this->show_form(_('That is the wrong IM address.'));
+            return;
+        }
 
         $result = $confirm->delete();
 
         if (!$result) {
-                       common_log_db_error($confirm, 'DELETE', __FILE__);
+            common_log_db_error($confirm, 'DELETE', __FILE__);
             $this->server_error(_('Couldn\'t delete email confirmation.'));
             return;
         }
 
         $this->show_form(_('Confirmation cancelled.'), TRUE);
-       }
-
-       function remove_address() {
-
-               $user = common_current_user();
-               $jabber = $this->arg('jabber');
-
-               # Maybe an old tab open...?
-
-               if ($user->jabber != $jabber) {
-                   $this->show_form(_('That is not your Jabber ID.'));
-                   return;
-               }
-
-               $user->query('BEGIN');
-               $original = clone($user);
-               $user->jabber = NULL;
-               $result = $user->updateKeys($original);
-               if (!$result) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t update user.'));
-                       return;
-               }
-               $user->query('COMMIT');
-
-               # XXX: unsubscribe to the old address
-
-               $this->show_form(_('The address was removed.'), TRUE);
-       }
-
-       function jabber_exists($jabber) {
-               $user = common_current_user();
-               $other = User::staticGet('jabber', $jabber);
-               if (!$other) {
-                       return false;
-               } else {
-                       return $other->id != $user->id;
-               }
-       }
+    }
+
+    function remove_address() {
+
+        $user = common_current_user();
+        $jabber = $this->arg('jabber');
+
+        # Maybe an old tab open...?
+
+        if ($user->jabber != $jabber) {
+            $this->show_form(_('That is not your Jabber ID.'));
+            return;
+        }
+
+        $user->query('BEGIN');
+        $original = clone($user);
+        $user->jabber = NULL;
+        $result = $user->updateKeys($original);
+        if (!$result) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t update user.'));
+            return;
+        }
+        $user->query('COMMIT');
+
+        # XXX: unsubscribe to the old address
+
+        $this->show_form(_('The address was removed.'), TRUE);
+    }
+
+    function jabber_exists($jabber) {
+        $user = common_current_user();
+        $other = User::staticGet('jabber', $jabber);
+        if (!$other) {
+            return false;
+        } else {
+            return $other->id != $user->id;
+        }
+    }
 }
index c7d92085c163faff7999baba8f08186e6ae79e35..e5cc6ad0191c973403355fc20554c49680d64f5a 100644 (file)
@@ -21,179 +21,179 @@ if (!defined('LACONICA')) { exit(1); }
 
 class InviteAction extends Action {
 
-       function is_readonly() {
-               return false;
-       }
+    function is_readonly() {
+        return false;
+    }
 
     function handle($args) {
         parent::handle($args);
-               if (!common_logged_in()) {
-                       $this->client_error(sprintf(_('You must be logged in to invite other users to use %s'),
-                                                                               common_config('site', 'name')));
-                       return;
-               } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $this->send_invitations();
-               } else {
-                       $this->show_form();
-               }
-       }
-
-       function send_invitations() {
-
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               $user = common_current_user();
-               $profile = $user->getProfile();
-
-               $bestname = $profile->getBestName();
-               $sitename = common_config('site', 'name');
-               $personal = $this->trimmed('personal');
-
-               $addresses = explode("\n", $this->trimmed('addresses'));
-
-               foreach ($addresses as $email) {
-                       $email = trim($email);
-                       if (!Validate::email($email, true)) {
-                               $this->show_form(sprintf(_('Invalid email address: %s'), $email));
-                               return;
-                       }
-               }
-
-               $already = array();
-               $subbed = array();
-
-               foreach ($addresses as $email) {
-                       $email = common_canonical_email($email);
-                       $other = User::staticGet('email', $email);
-                       if ($other) {
-                               if ($user->isSubscribed($other)) {
-                                       $already[] = $other;
-                               } else {
-                                       subs_subscribe_to($user, $other);
-                                       $subbed[] = $other;
-                               }
-                       } else {
-                               $sent[] = $email;
-                               $this->send_invitation($email, $user, $personal);
-                       }
-               }
-
-               common_show_header(_('Invitation(s) sent'));
-               if ($already) {
-                       common_element('p', NULL, _('You are already subscribed to these users:'));
-                       common_element_start('ul');
-                       foreach ($already as $other) {
-                               common_element('li', NULL, sprintf(_('%s (%s)'), $other->nickname, $other->email));
-                       }
-                       common_element_end('ul');
-               }
-               if ($subbed) {
-                       common_element('p', NULL, _('These people are already users and you were automatically subscribed to them:'));
-                       common_element_start('ul');
-                       foreach ($subbed as $other) {
-                               common_element('li', NULL, sprintf(_('%s (%s)'), $other->nickname, $other->email));
-                       }
-                       common_element_end('ul');
-               }
-               if ($sent) {
-                       common_element('p', NULL, _('Invitation(s) sent to the following people:'));
-                       common_element_start('ul');
-                       foreach ($sent as $other) {
-                               common_element('li', NULL, $other);
-                       }
-                       common_element_end('ul');
-                       common_element('p', NULL, _('You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!'));
-               }
-               common_show_footer();
-       }
-
-       function show_top($error=NULL) {
-               if ($error) {
-                       common_element('p', 'error', $error);
-               } else {
-                       common_element_start('div', 'instructions');
-                       common_element('p', NULL,
-                                                  _('Use this form to invite your friends and colleagues to use this service.'));
-                       common_element_end('div');
-               }
-       }
-
-       function show_form($error=NULL) {
-
-               global $config;
-
-               common_show_header(_('Invite new users'), NULL, $error, array($this, 'show_top'));
-
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'invite',
-                                                                                  'action' => common_local_url('invite')));
-               common_hidden('token', common_session_token());
-
-               common_textarea('addresses', _('Email addresses'),
-                                               $this->trimmed('addresses'),
-                                               _('Addresses of friends to invite (one per line)'));
-
-               common_textarea('personal', _('Personal message'),
-                                               $this->trimmed('personal'),
-                                               _('Optionally add a personal message to the invitation.'));
-
-               common_submit('send', _('Send'));
-
-               common_element_end('form');
-
-               common_show_footer();
-       }
-
-       function send_invitation($email, $user, $personal) {
-
-               $profile = $user->getProfile();
-               $bestname = $profile->getBestName();
-
-               $sitename = common_config('site', 'name');
-
-               $invite = new Invitation();
-
-               $invite->address = $email;
-               $invite->address_type = 'email';
-               $invite->code = common_confirmation_code(128);
-               $invite->user_id = $user->id;
-               $invite->created = common_sql_now();
-
-               if (!$invite->insert()) {
-                       common_log_db_error($invite, 'INSERT', __FILE__);
-                       return false;
-               }
-
-               $recipients = array($email);
-
-               $headers['From'] = mail_notify_from();
-               $headers['To'] = $email;
-               $headers['Subject'] = sprintf(_('%1$s has invited you to join them on %2$s'), $bestname, $sitename);
-
-               $body = sprintf(_("%1\$s has invited you to join them on %2\$s (%3\$s).\n\n".
-                                                 "%2\$s is a micro-blogging service that lets you keep up-to-date with people you know and people who interest you.\n\n".
-                                                 "You can also share news about yourself, your thoughts, or your life online with people who know about you. ".
-                                                 "It's also great for meeting new people who share your interests.\n\n".
-                                                 "%1\$s said:\n\n%4\$s\n\n".
-                                                 "You can see %1\$s's profile page on %2\$s here:\n\n".
-                                                 "%5\$s\n\n".
-                                                 "If you'd like to try the service, click on the link below to accept the invitation.\n\n".
-                                                 "%6\$s\n\n".
-                                                 "If not, you can ignore this message. Thanks for your patience and your time.\n\n".
-                                                 "Sincerely, %2\$s\n"),
-                                               $bestname,
-                                               $sitename,
-                                               common_root_url(),
-                                               $personal,
-                                               common_local_url('showstream', array('nickname' => $user->nickname)),
-                                               common_local_url('register', array('code' => $invite->code)));
-
-               mail_send($recipients, $headers, $body);
-       }
+        if (!common_logged_in()) {
+            $this->client_error(sprintf(_('You must be logged in to invite other users to use %s'),
+                                        common_config('site', 'name')));
+            return;
+        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->send_invitations();
+        } else {
+            $this->show_form();
+        }
+    }
+
+    function send_invitations() {
+
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        $user = common_current_user();
+        $profile = $user->getProfile();
+
+        $bestname = $profile->getBestName();
+        $sitename = common_config('site', 'name');
+        $personal = $this->trimmed('personal');
+
+        $addresses = explode("\n", $this->trimmed('addresses'));
+
+        foreach ($addresses as $email) {
+            $email = trim($email);
+            if (!Validate::email($email, true)) {
+                $this->show_form(sprintf(_('Invalid email address: %s'), $email));
+                return;
+            }
+        }
+
+        $already = array();
+        $subbed = array();
+
+        foreach ($addresses as $email) {
+            $email = common_canonical_email($email);
+            $other = User::staticGet('email', $email);
+            if ($other) {
+                if ($user->isSubscribed($other)) {
+                    $already[] = $other;
+                } else {
+                    subs_subscribe_to($user, $other);
+                    $subbed[] = $other;
+                }
+            } else {
+                $sent[] = $email;
+                $this->send_invitation($email, $user, $personal);
+            }
+        }
+
+        common_show_header(_('Invitation(s) sent'));
+        if ($already) {
+            common_element('p', NULL, _('You are already subscribed to these users:'));
+            common_element_start('ul');
+            foreach ($already as $other) {
+                common_element('li', NULL, sprintf(_('%s (%s)'), $other->nickname, $other->email));
+            }
+            common_element_end('ul');
+        }
+        if ($subbed) {
+            common_element('p', NULL, _('These people are already users and you were automatically subscribed to them:'));
+            common_element_start('ul');
+            foreach ($subbed as $other) {
+                common_element('li', NULL, sprintf(_('%s (%s)'), $other->nickname, $other->email));
+            }
+            common_element_end('ul');
+        }
+        if ($sent) {
+            common_element('p', NULL, _('Invitation(s) sent to the following people:'));
+            common_element_start('ul');
+            foreach ($sent as $other) {
+                common_element('li', NULL, $other);
+            }
+            common_element_end('ul');
+            common_element('p', NULL, _('You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!'));
+        }
+        common_show_footer();
+    }
+
+    function show_top($error=NULL) {
+        if ($error) {
+            common_element('p', 'error', $error);
+        } else {
+            common_element_start('div', 'instructions');
+            common_element('p', NULL,
+                           _('Use this form to invite your friends and colleagues to use this service.'));
+            common_element_end('div');
+        }
+    }
+
+    function show_form($error=NULL) {
+
+        global $config;
+
+        common_show_header(_('Invite new users'), NULL, $error, array($this, 'show_top'));
+
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'invite',
+                                           'action' => common_local_url('invite')));
+        common_hidden('token', common_session_token());
+
+        common_textarea('addresses', _('Email addresses'),
+                        $this->trimmed('addresses'),
+                        _('Addresses of friends to invite (one per line)'));
+
+        common_textarea('personal', _('Personal message'),
+                        $this->trimmed('personal'),
+                        _('Optionally add a personal message to the invitation.'));
+
+        common_submit('send', _('Send'));
+
+        common_element_end('form');
+
+        common_show_footer();
+    }
+
+    function send_invitation($email, $user, $personal) {
+
+        $profile = $user->getProfile();
+        $bestname = $profile->getBestName();
+
+        $sitename = common_config('site', 'name');
+
+        $invite = new Invitation();
+
+        $invite->address = $email;
+        $invite->address_type = 'email';
+        $invite->code = common_confirmation_code(128);
+        $invite->user_id = $user->id;
+        $invite->created = common_sql_now();
+
+        if (!$invite->insert()) {
+            common_log_db_error($invite, 'INSERT', __FILE__);
+            return false;
+        }
+
+        $recipients = array($email);
+
+        $headers['From'] = mail_notify_from();
+        $headers['To'] = $email;
+        $headers['Subject'] = sprintf(_('%1$s has invited you to join them on %2$s'), $bestname, $sitename);
+
+        $body = sprintf(_("%1\$s has invited you to join them on %2\$s (%3\$s).\n\n".
+                          "%2\$s is a micro-blogging service that lets you keep up-to-date with people you know and people who interest you.\n\n".
+                          "You can also share news about yourself, your thoughts, or your life online with people who know about you. ".
+                          "It's also great for meeting new people who share your interests.\n\n".
+                          "%1\$s said:\n\n%4\$s\n\n".
+                          "You can see %1\$s's profile page on %2\$s here:\n\n".
+                          "%5\$s\n\n".
+                          "If you'd like to try the service, click on the link below to accept the invitation.\n\n".
+                          "%6\$s\n\n".
+                          "If not, you can ignore this message. Thanks for your patience and your time.\n\n".
+                          "Sincerely, %2\$s\n"),
+                        $bestname,
+                        $sitename,
+                        common_root_url(),
+                        $personal,
+                        common_local_url('showstream', array('nickname' => $user->nickname)),
+                        common_local_url('register', array('code' => $invite->code)));
+
+        mail_send($recipients, $headers, $body);
+    }
 
 }
index ccec9cf8a787818e20cb518f64b44bfd31b30336..5e4d451491d44fcb935f6017450137f978fc4193 100644 (file)
@@ -21,132 +21,132 @@ if (!defined('LACONICA')) { exit(1); }
 
 class LoginAction extends Action {
 
-       function is_readonly() {
-               return true;
-       }
+    function is_readonly() {
+        return true;
+    }
 
-       function handle($args) {
-               parent::handle($args);
-               if (common_is_real_login()) {
-                       common_user_error(_('Already logged in.'));
-               } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $this->check_login();
-               } else {
-                       $this->show_form();
-               }
-       }
+    function handle($args) {
+        parent::handle($args);
+        if (common_is_real_login()) {
+            common_user_error(_('Already logged in.'));
+        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->check_login();
+        } else {
+            $this->show_form();
+        }
+    }
 
-       function check_login() {
-               # XXX: login throttle
+    function check_login() {
+        # XXX: login throttle
 
-               # CSRF protection - token set in common_notice_form()
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        # CSRF protection - token set in common_notice_form()
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
-               $nickname = common_canonical_nickname($this->trimmed('nickname'));
-               $password = $this->arg('password');
-               if (common_check_user($nickname, $password)) {
-                       # success!
-                       if (!common_set_user($nickname)) {
-                               common_server_error(_('Error setting user.'));
-                               return;
-                       }
-                       common_real_login(true);
-                       if ($this->boolean('rememberme')) {
-                               common_debug('Adding rememberme cookie for ' . $nickname);
-                               common_rememberme();
-                       }
-                       # success!
-                       $url = common_get_returnto();
-                       if ($url) {
-                               # We don't have to return to it again
-                               common_set_returnto(NULL);
-                       } else {
-                               $url = common_local_url('all',
-                                                                               array('nickname' =>
-                                                                                         $nickname));
-                       }
-                       common_redirect($url);
-               } else {
-                       $this->show_form(_('Incorrect username or password.'));
-                       return;
-               }
+        $nickname = common_canonical_nickname($this->trimmed('nickname'));
+        $password = $this->arg('password');
+        if (common_check_user($nickname, $password)) {
+            # success!
+            if (!common_set_user($nickname)) {
+                common_server_error(_('Error setting user.'));
+                return;
+            }
+            common_real_login(true);
+            if ($this->boolean('rememberme')) {
+                common_debug('Adding rememberme cookie for ' . $nickname);
+                common_rememberme();
+            }
+            # success!
+            $url = common_get_returnto();
+            if ($url) {
+                # We don't have to return to it again
+                common_set_returnto(NULL);
+            } else {
+                $url = common_local_url('all',
+                                        array('nickname' =>
+                                              $nickname));
+            }
+            common_redirect($url);
+        } else {
+            $this->show_form(_('Incorrect username or password.'));
+            return;
+        }
 
-               # success!
-               if (!common_set_user($user)) {
-                       common_server_error(_('Error setting user.'));
-                       return;
-               }
+        # success!
+        if (!common_set_user($user)) {
+            common_server_error(_('Error setting user.'));
+            return;
+        }
 
-               common_real_login(true);
+        common_real_login(true);
 
-               if ($this->boolean('rememberme')) {
-                       common_debug('Adding rememberme cookie for ' . $nickname);
-                       common_rememberme($user);
-               }
-               # success!
-               $url = common_get_returnto();
-               if ($url) {
-                       # We don't have to return to it again
-                       common_set_returnto(NULL);
-               } else {
-                       $url = common_local_url('all',
-                                                                       array('nickname' =>
-                                                                                 $nickname));
-               }
-               common_redirect($url);
-       }
+        if ($this->boolean('rememberme')) {
+            common_debug('Adding rememberme cookie for ' . $nickname);
+            common_rememberme($user);
+        }
+        # success!
+        $url = common_get_returnto();
+        if ($url) {
+            # We don't have to return to it again
+            common_set_returnto(NULL);
+        } else {
+            $url = common_local_url('all',
+                                    array('nickname' =>
+                                          $nickname));
+        }
+        common_redirect($url);
+    }
 
-       function show_form($error=NULL) {
-               common_show_header(_('Login'), NULL, $error, array($this, 'show_top'));
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'login',
-                                                                                  'action' => common_local_url('login')));
-               common_input('nickname', _('Nickname'));
-               common_password('password', _('Password'));
-               common_checkbox('rememberme', _('Remember me'), false,
-                               _('Automatically login in the future; ' .
-                                  'not for shared computers!'));
-               common_submit('submit', _('Login'));
-               common_hidden('token', common_session_token());
-               common_element_end('form');
-               common_element_start('p');
-               common_element('a', array('href' => common_local_url('recoverpassword')),
-                                          _('Lost or forgotten password?'));
-               common_element_end('p');
-               common_show_footer();
-       }
+    function show_form($error=NULL) {
+        common_show_header(_('Login'), NULL, $error, array($this, 'show_top'));
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'login',
+                                           'action' => common_local_url('login')));
+        common_input('nickname', _('Nickname'));
+        common_password('password', _('Password'));
+        common_checkbox('rememberme', _('Remember me'), false,
+                        _('Automatically login in the future; ' .
+                           'not for shared computers!'));
+        common_submit('submit', _('Login'));
+        common_hidden('token', common_session_token());
+        common_element_end('form');
+        common_element_start('p');
+        common_element('a', array('href' => common_local_url('recoverpassword')),
+                       _('Lost or forgotten password?'));
+        common_element_end('p');
+        common_show_footer();
+    }
 
-       function get_instructions() {
-               if (common_logged_in() &&
-                       !common_is_real_login() &&
-                       common_get_returnto())
-               {
-                       # rememberme logins have to reauthenticate before
-                       # changing any profile settings (cookie-stealing protection)
-                       return _('For security reasons, please re-enter your ' .
-                                        'user name and password ' .
-                                        'before changing your settings.');
-               } else {
-                       return _('Login with your username and password. ' .
-                                        'Don\'t have a username yet? ' .
-                                        '[Register](%%action.register%%) a new account, or ' .
-                                        'try [OpenID](%%action.openidlogin%%). ');
-               }
-       }
+    function get_instructions() {
+        if (common_logged_in() &&
+            !common_is_real_login() &&
+            common_get_returnto())
+        {
+            # rememberme logins have to reauthenticate before
+            # changing any profile settings (cookie-stealing protection)
+            return _('For security reasons, please re-enter your ' .
+                     'user name and password ' .
+                     'before changing your settings.');
+        } else {
+            return _('Login with your username and password. ' .
+                     'Don\'t have a username yet? ' .
+                     '[Register](%%action.register%%) a new account, or ' .
+                     'try [OpenID](%%action.openidlogin%%). ');
+        }
+    }
 
-       function show_top($error=NULL) {
-               if ($error) {
-                       common_element('p', 'error', $error);
-               } else {
-                       $instr = $this->get_instructions();
-                       $output = common_markup_to_html($instr);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-               }
-       }
+    function show_top($error=NULL) {
+        if ($error) {
+            common_element('p', 'error', $error);
+        } else {
+            $instr = $this->get_instructions();
+            $output = common_markup_to_html($instr);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('div');
+        }
+    }
 }
index f00fa0ba7f2f39298e77cdd365099b3d53cb8954..5f7b9d502db6f5b50e329afb7589c23ef8517252 100644 (file)
@@ -22,20 +22,20 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/lib/openid.php');
 
 class LogoutAction extends Action {
-       
-       function is_readonly() {
-               return true;
-       }
-       
-       function handle($args) {
-               parent::handle($args);
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-               } else {
-                       common_set_user(NULL);
-                       common_real_login(false); # not logged in
-                       common_forgetme(); # don't log back in!
-                       common_redirect(common_local_url('public'));
-               }
-       }
+    
+    function is_readonly() {
+        return true;
+    }
+    
+    function handle($args) {
+        parent::handle($args);
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+        } else {
+            common_set_user(NULL);
+            common_real_login(false); # not logged in
+            common_forgetme(); # don't log back in!
+            common_redirect(common_local_url('public'));
+        }
+    }
 }
index 104467d2979c33fec91ae1a71301334dc522995d..ced4b0d1e58c31d8a7dbc885a140fcb73cff097c 100644 (file)
@@ -21,26 +21,26 @@ if (!defined('LACONICA')) { exit(1); }
 
 class MicrosummaryAction extends Action {
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               $nickname = common_canonical_nickname($this->arg('nickname'));
-               $user = User::staticGet('nickname', $nickname);
+        $nickname = common_canonical_nickname($this->arg('nickname'));
+        $user = User::staticGet('nickname', $nickname);
 
-               if (!$user) {
-                       $this->client_error(_('No such user'), 404);
-                       return;
-               }
-               
-               $notice = $user->getCurrentNotice();
-               
-               if (!$notice) {
-                       $this->client_error(_('No current status'), 404);
-               }
-               
-               header('Content-Type: text/plain');
-               
-               print $user->nickname . ': ' . $notice->content;
-       }
+        if (!$user) {
+            $this->client_error(_('No such user'), 404);
+            return;
+        }
+        
+        $notice = $user->getCurrentNotice();
+        
+        if (!$notice) {
+            $this->client_error(_('No current status'), 404);
+        }
+        
+        header('Content-Type: text/plain');
+        
+        print $user->nickname . ': ' . $notice->content;
+    }
 }
index da48fc7e7a07ad8806d6d2b0bd807952690585f9..121fc4246191676d18bf65675e4e93c6775b00a1 100644 (file)
 if (!defined('LACONICA')) { exit(1); }
 
 class NewmessageAction extends Action {
-       
-       function handle($args) {
-               parent::handle($args);
-
-               if (!common_logged_in()) {
-                       $this->client_error(_('Not logged in.'), 403);
-               } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $this->save_new_message();
-               } else {
-                       $this->show_form();
-               }
-       }
-
-       function save_new_message() {
-               $user = common_current_user();
-               assert($user); # XXX: maybe an error instead...
-
-               # CSRF protection
-               
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-               
-               $content = $this->trimmed('content');
-               $to = $this->trimmed('to');
-               
-               if (!$content) {
-                       $this->show_form(_('No content!'));
-                       return;
-               } else {
-                       $content_shortened = common_shorten_links($content);
-
-                       if (mb_strlen($content_shortened) > 140) {
-                               common_debug("Content = '$content_shortened'", __FILE__);
-                               common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__);
-                               $this->show_form(_('That\'s too long. Max message size is 140 chars.'));
-                               return;
-                       }
-               }
-
-               $other = User::staticGet('id', $to);
-               
-               if (!$other) {
-                       $this->show_form(_('No recipient specified.'));
-                       return;
-               } else if (!$user->mutuallySubscribed($other)) {
-                       $this->client_error(_('You can\'t send a message to this user.'), 404);
-                       return;
-               } else if ($user->id == $other->id) {
-                       $this->client_error(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'), 403);
-                       return;
-               }
-               
-               $message = Message::saveNew($user->id, $other->id, $content, 'web');
-               
-               if (is_string($message)) {
-                       $this->show_form($message);
-                       return;
-               }
-
-               $this->notify($user, $other, $message);
-
-               $url = common_local_url('outbox', array('nickname' => $user->nickname));
-
-               common_redirect($url, 303);
-       }
-
-       function show_top($params) {
-
-               list($content, $user, $to) = $params;
-               
-               assert(!is_null($user));
-
-               common_message_form($content, $user, $to);
-       }
-
-       function show_form($msg=NULL) {
-               
-               $content = $this->trimmed('content');
-               $user = common_current_user();
-
-               $to = $this->trimmed('to');
-               
-               $other = User::staticGet('id', $to);
-
-               if (!$other) {
-                       $this->client_error(_('No such user'), 404);
-                       return;
-               }
-
-               if (!$user->mutuallySubscribed($other)) {
-                       $this->client_error(_('You can\'t send a message to this user.'), 404);
-                       return;
-               }
-               
-               common_show_header(_('New message'), NULL,
-                                                  array($content, $user, $other),
-                                  array($this, 'show_top'));
-               
-               if ($msg) {
-                       common_element('p', array('id'=>'error'), $msg);
-               }
-               
-               common_show_footer();
-       }
-       
-       function notify($from, $to, $message) {
-               mail_notify_message($message, $from, $to);
-               # XXX: Jabber, SMS notifications... probably queued
-       }
+    
+    function handle($args) {
+        parent::handle($args);
+
+        if (!common_logged_in()) {
+            $this->client_error(_('Not logged in.'), 403);
+        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->save_new_message();
+        } else {
+            $this->show_form();
+        }
+    }
+
+    function save_new_message() {
+        $user = common_current_user();
+        assert($user); # XXX: maybe an error instead...
+
+        # CSRF protection
+        
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+        
+        $content = $this->trimmed('content');
+        $to = $this->trimmed('to');
+        
+        if (!$content) {
+            $this->show_form(_('No content!'));
+            return;
+        } else {
+            $content_shortened = common_shorten_links($content);
+
+            if (mb_strlen($content_shortened) > 140) {
+                common_debug("Content = '$content_shortened'", __FILE__);
+                common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__);
+                $this->show_form(_('That\'s too long. Max message size is 140 chars.'));
+                return;
+            }
+        }
+
+        $other = User::staticGet('id', $to);
+        
+        if (!$other) {
+            $this->show_form(_('No recipient specified.'));
+            return;
+        } else if (!$user->mutuallySubscribed($other)) {
+            $this->client_error(_('You can\'t send a message to this user.'), 404);
+            return;
+        } else if ($user->id == $other->id) {
+            $this->client_error(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'), 403);
+            return;
+        }
+        
+        $message = Message::saveNew($user->id, $other->id, $content, 'web');
+        
+        if (is_string($message)) {
+            $this->show_form($message);
+            return;
+        }
+
+        $this->notify($user, $other, $message);
+
+        $url = common_local_url('outbox', array('nickname' => $user->nickname));
+
+        common_redirect($url, 303);
+    }
+
+    function show_top($params) {
+
+        list($content, $user, $to) = $params;
+        
+        assert(!is_null($user));
+
+        common_message_form($content, $user, $to);
+    }
+
+    function show_form($msg=NULL) {
+        
+        $content = $this->trimmed('content');
+        $user = common_current_user();
+
+        $to = $this->trimmed('to');
+        
+        $other = User::staticGet('id', $to);
+
+        if (!$other) {
+            $this->client_error(_('No such user'), 404);
+            return;
+        }
+
+        if (!$user->mutuallySubscribed($other)) {
+            $this->client_error(_('You can\'t send a message to this user.'), 404);
+            return;
+        }
+        
+        common_show_header(_('New message'), NULL,
+                           array($content, $user, $other),
+                           array($this, 'show_top'));
+        
+        if ($msg) {
+            common_element('p', array('id'=>'error'), $msg);
+        }
+        
+        common_show_footer();
+    }
+    
+    function notify($from, $to, $message) {
+        mail_notify_message($message, $from, $to);
+        # XXX: Jabber, SMS notifications... probably queued
+    }
 }
index 42b48923f56b8d104f68a58bc57b9e3410e224ba..7c3ad881546dd3e3cc852281504a4fd311c6ef68 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,132 +23,132 @@ require_once INSTALLDIR . '/lib/noticelist.php';
 
 class NewnoticeAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-               } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-
-                       # CSRF protection - token set in common_notice_form()
-                       $token = $this->trimmed('token');
-                       if (!$token || $token != common_session_token()) {
-                               $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                               return;
-                       }
-
-                       $this->save_new_notice();
-               } else {
-                       $this->show_form();
-               }
-       }
-
-       function save_new_notice() {
-
-               $user = common_current_user();
-               assert($user); # XXX: maybe an error instead...
-               $content = $this->trimmed('status_textarea');
-
-               if (!$content) {
-                       $this->show_form(_('No content!'));
-                       return;
-               } else {
-                       $content_shortened = common_shorten_links($content);
-
-                       if (mb_strlen($content_shortened) > 140) {
-                               common_debug("Content = '$content_shortened'", __FILE__);
-                               common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__);
-                               $this->show_form(_('That\'s too long. Max notice size is 140 chars.'));
-                               return;
-                       }
-               }
-
-               $inter = new CommandInterpreter();
-
-               $cmd = $inter->handle_command($user, $content_shortened);
-
-               if ($cmd) {
-                       if ($this->boolean('ajax')) {
-                               $cmd->execute(new AjaxWebChannel());
-                       } else {
-                               $cmd->execute(new WebChannel());
-                       }
-                       return;
-               }
-
-               $replyto = $this->trimmed('inreplyto');
-
-               $notice = Notice::saveNew($user->id, $content, 'web', 1, ($replyto == 'false') ? NULL : $replyto);
-
-               if (is_string($notice)) {
-                       $this->show_form($notice);
-                       return;
-               }
-
-               common_broadcast_notice($notice);
-
-               if ($this->boolean('ajax')) {
-                       common_start_html('text/xml;charset=utf-8', true);
-                       common_element_start('head');
-                       common_element('title', null, _('Notice posted'));
-                       common_element_end('head');
-                       common_element_start('body');
-                       $this->show_notice($notice);
-                       common_element_end('body');
-                       common_element_end('html');
-               } else {
-                       $returnto = $this->trimmed('returnto');
-
-                       if ($returnto) {
-                               $url = common_local_url($returnto,
-                                                                               array('nickname' => $user->nickname));
-                       } else {
-                               $url = common_local_url('shownotice',
-                                                                               array('notice' => $notice->id));
-                       }
-                       common_redirect($url, 303);
-               }
-       }
-
-       function ajax_error_msg($msg) {
-               common_start_html('text/xml;charset=utf-8', true);
-               common_element_start('head');
-               common_element('title', null, _('Ajax Error'));
-               common_element_end('head');
-               common_element_start('body');
-               common_element('p', array('id' => 'error'), $msg);
-               common_element_end('body');
-               common_element_end('html');
-       }
-
-       function show_top($content=NULL) {
-               common_notice_form(NULL, $content);
-       }
-
-       function show_form($msg=NULL) {
-               if ($msg && $this->boolean('ajax')) {
-                       $this->ajax_error_msg($msg);
-                       return;
-               }
-               $content = $this->trimmed('status_textarea');
-               if (!$content) {
-                       $replyto = $this->trimmed('replyto');
-                       $profile = Profile::staticGet('nickname', $replyto);
-                       if ($profile) {
-                               $content = '@' . $profile->nickname . ' ';
-                       }
-               }
-               common_show_header(_('New notice'), NULL, $content,
-                                                  array($this, 'show_top'));
-               if ($msg) {
-                       common_element('p', array('id' => 'error'), $msg);
-               }
-               common_show_footer();
-       }
-
-       function show_notice($notice) {
+    function handle($args) {
+        parent::handle($args);
+
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+
+            # CSRF protection - token set in common_notice_form()
+            $token = $this->trimmed('token');
+            if (!$token || $token != common_session_token()) {
+                $this->client_error(_('There was a problem with your session token. Try again, please.'));
+                return;
+            }
+
+            $this->save_new_notice();
+        } else {
+            $this->show_form();
+        }
+    }
+
+    function save_new_notice() {
+
+        $user = common_current_user();
+        assert($user); # XXX: maybe an error instead...
+        $content = $this->trimmed('status_textarea');
+
+        if (!$content) {
+            $this->show_form(_('No content!'));
+            return;
+        } else {
+            $content_shortened = common_shorten_links($content);
+
+            if (mb_strlen($content_shortened) > 140) {
+                common_debug("Content = '$content_shortened'", __FILE__);
+                common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__);
+                $this->show_form(_('That\'s too long. Max notice size is 140 chars.'));
+                return;
+            }
+        }
+
+        $inter = new CommandInterpreter();
+
+        $cmd = $inter->handle_command($user, $content_shortened);
+
+        if ($cmd) {
+            if ($this->boolean('ajax')) {
+                $cmd->execute(new AjaxWebChannel());
+            } else {
+                $cmd->execute(new WebChannel());
+            }
+            return;
+        }
+
+        $replyto = $this->trimmed('inreplyto');
+
+        $notice = Notice::saveNew($user->id, $content, 'web', 1, ($replyto == 'false') ? NULL : $replyto);
+
+        if (is_string($notice)) {
+            $this->show_form($notice);
+            return;
+        }
+
+        common_broadcast_notice($notice);
+
+        if ($this->boolean('ajax')) {
+            common_start_html('text/xml;charset=utf-8', true);
+            common_element_start('head');
+            common_element('title', null, _('Notice posted'));
+            common_element_end('head');
+            common_element_start('body');
+            $this->show_notice($notice);
+            common_element_end('body');
+            common_element_end('html');
+        } else {
+            $returnto = $this->trimmed('returnto');
+
+            if ($returnto) {
+                $url = common_local_url($returnto,
+                                        array('nickname' => $user->nickname));
+            } else {
+                $url = common_local_url('shownotice',
+                                        array('notice' => $notice->id));
+            }
+            common_redirect($url, 303);
+        }
+    }
+
+    function ajax_error_msg($msg) {
+        common_start_html('text/xml;charset=utf-8', true);
+        common_element_start('head');
+        common_element('title', null, _('Ajax Error'));
+        common_element_end('head');
+        common_element_start('body');
+        common_element('p', array('id' => 'error'), $msg);
+        common_element_end('body');
+        common_element_end('html');
+    }
+
+    function show_top($content=NULL) {
+        common_notice_form(NULL, $content);
+    }
+
+    function show_form($msg=NULL) {
+        if ($msg && $this->boolean('ajax')) {
+            $this->ajax_error_msg($msg);
+            return;
+        }
+        $content = $this->trimmed('status_textarea');
+        if (!$content) {
+            $replyto = $this->trimmed('replyto');
+            $profile = Profile::staticGet('nickname', $replyto);
+            if ($profile) {
+                $content = '@' . $profile->nickname . ' ';
+            }
+        }
+        common_show_header(_('New notice'), NULL, $content,
+                           array($this, 'show_top'));
+        if ($msg) {
+            common_element('p', array('id' => 'error'), $msg);
+        }
+        common_show_footer();
+    }
+
+    function show_notice($notice) {
         $nli = new NoticeListItem($notice);
         $nli->show();
-       }
+    }
 
 }
index 96e4d777fa3aca01c86ea3a0d39285535e014ffd..53d78e199918923e82d20cdcf8f3e06dcaaeccaf 100644 (file)
@@ -25,140 +25,140 @@ require_once(INSTALLDIR.'/lib/searchaction.php');
 
 class NoticesearchAction extends SearchAction {
 
-       function get_instructions() {
-               return _('Search for notices on %%site.name%% by their contents. Separate search terms by spaces; they must be 3 characters or more.');
-       }
+    function get_instructions() {
+        return _('Search for notices on %%site.name%% by their contents. Separate search terms by spaces; they must be 3 characters or more.');
+    }
 
-       function get_title() {
-               return _('Text search');
-       }
+    function get_title() {
+        return _('Text search');
+    }
 
-       function show_results($q, $page) {
+    function show_results($q, $page) {
 
-               $notice = new Notice();
+        $notice = new Notice();
 
-               # lcase it for comparison
-               $q = strtolower($q);
+        # lcase it for comparison
+        $q = strtolower($q);
 
         $search_engine = $notice->getSearchEngine('identica_notices');
 
         $search_engine->set_sort_mode('chron');
-               # Ask for an extra to see if there's more.
-               $search_engine->limit((($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
+        # Ask for an extra to see if there's more.
+        $search_engine->limit((($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
 
         if (false === $search_engine->query($q)) {
             $cnt = 0;
         }
         else {
-               $cnt = $notice->find();
+            $cnt = $notice->find();
         }
-               if ($cnt > 0) {
-                       $terms = preg_split('/[\s,]+/', $q);
-                       common_element_start('ul', array('id' => 'notices'));
-                       for ($i = 0; $i < min($cnt, NOTICES_PER_PAGE); $i++) {
-                               if ($notice->fetch()) {
-                                       $this->show_notice($notice, $terms);
-                               } else {
-                                       // shouldn't happen!
-                                       break;
-                               }
-                       }
-                       common_element_end('ul');
-               } else {
-                       common_element('p', 'error', _('No results'));
-               }
-
-               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'noticesearch', array('q' => $q));
-       }
-
-       function show_header($arr) {
-               if ($arr) {
-                       $q = $arr[0];
-               }
-               if ($q) {
-                       common_element('link', array('rel' => 'alternate',
-                                                                                'href' => common_local_url('noticesearchrss',
-                                                                                                                                       array('q' => $q)),
-                                                                                'type' => 'application/rss+xml',
-                                                                                'title' => _('Search Stream Feed')));
-               }
-       }
-
-       # XXX: refactor and combine with StreamAction::show_notice()
-
-       function show_notice($notice, $terms) {
-               $profile = $notice->getProfile();
-               if (!$profile) {
-                       common_log_db_error($notice, 'SELECT', __FILE__);
-                       $this->server_error(_('Notice without matching profile'));
-                       return;
-               }
-               # XXX: RDFa
-               common_element_start('li', array('class' => 'notice_single',
-                                                                                 'id' => 'notice-' . $notice->id));
-               $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
-               common_element_start('a', array('href' => $profile->profileurl));
-               common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
-                                                                       'class' => 'avatar stream',
-                                                                       'width' => AVATAR_STREAM_SIZE,
-                                                                       'height' => AVATAR_STREAM_SIZE,
-                                                                       'alt' =>
-                                                                       ($profile->fullname) ? $profile->fullname :
-                                                                       $profile->nickname));
-               common_element_end('a');
-               common_element('a', array('href' => $profile->profileurl,
-                                                                 'class' => 'nickname'),
-                                          $profile->nickname);
-               # FIXME: URL, image, video, audio
-               common_element_start('p', array('class' => 'content'));
-               if ($notice->rendered) {
-                       common_raw($this->highlight($notice->rendered, $terms));
-               } else {
-                       # XXX: may be some uncooked notices in the DB,
-                       # we cook them right now. This should probably disappear in future
-                       # versions (>> 0.4.x)
-                       common_raw($this->highlight(common_render_content($notice->content, $notice), $terms));
-               }
-               common_element_end('p');
-               $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
-               common_element_start('p', 'time');
-               common_element('a', array('class' => 'permalink',
-                                                                 'href' => $noticeurl,
-                                                                 'title' => common_exact_date($notice->created)),
-                                          common_date_string($notice->created));
-               if ($notice->reply_to) {
-                       $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to));
-                       common_text(' (');
-                       common_element('a', array('class' => 'inreplyto',
-                                                                         'href' => $replyurl),
-                                                  _('in reply to...'));
-                       common_text(')');
-               }
-               common_element_start('a',
-                                                        array('href' => common_local_url('newnotice',
-                                                                                                                         array('replyto' => $profile->nickname)),
-                                                                  'onclick' => 'doreply("'.$profile->nickname.'"); return false',
-                                                                  'title' => _('reply'),
-                                                                  'class' => 'replybutton'));
-               common_hidden('posttoken', common_session_token());
-               
-               common_raw('&rarr;');
-               common_element_end('a');
-               common_element_end('p');
-               common_element_end('li');
-       }
-
-       function highlight($text, $terms) {
-               /* Highligh serach terms */
-               $pattern = '/('.implode('|',array_map('htmlspecialchars', $terms)).')/i';
-               $result = preg_replace($pattern, '<strong>\\1</strong>', $text);
-
-               /* Remove highlighting from inside links, loop incase multiple highlights in links */
-               $pattern = '/(href="[^"]*)<strong>('.implode('|',array_map('htmlspecialchars', $terms)).')<\/strong>([^"]*")/iU';
-               do {
-                       $result = preg_replace($pattern, '\\1\\2\\3', $result, -1, $count);
-               } while ($count);
-               return $result;
-       }
+        if ($cnt > 0) {
+            $terms = preg_split('/[\s,]+/', $q);
+            common_element_start('ul', array('id' => 'notices'));
+            for ($i = 0; $i < min($cnt, NOTICES_PER_PAGE); $i++) {
+                if ($notice->fetch()) {
+                    $this->show_notice($notice, $terms);
+                } else {
+                    // shouldn't happen!
+                    break;
+                }
+            }
+            common_element_end('ul');
+        } else {
+            common_element('p', 'error', _('No results'));
+        }
+
+        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'noticesearch', array('q' => $q));
+    }
+
+    function show_header($arr) {
+        if ($arr) {
+            $q = $arr[0];
+        }
+        if ($q) {
+            common_element('link', array('rel' => 'alternate',
+                                         'href' => common_local_url('noticesearchrss',
+                                                                    array('q' => $q)),
+                                         'type' => 'application/rss+xml',
+                                         'title' => _('Search Stream Feed')));
+        }
+    }
+
+    # XXX: refactor and combine with StreamAction::show_notice()
+
+    function show_notice($notice, $terms) {
+        $profile = $notice->getProfile();
+        if (!$profile) {
+            common_log_db_error($notice, 'SELECT', __FILE__);
+            $this->server_error(_('Notice without matching profile'));
+            return;
+        }
+        # XXX: RDFa
+        common_element_start('li', array('class' => 'notice_single',
+                                          'id' => 'notice-' . $notice->id));
+        $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
+        common_element_start('a', array('href' => $profile->profileurl));
+        common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
+                                    'class' => 'avatar stream',
+                                    'width' => AVATAR_STREAM_SIZE,
+                                    'height' => AVATAR_STREAM_SIZE,
+                                    'alt' =>
+                                    ($profile->fullname) ? $profile->fullname :
+                                    $profile->nickname));
+        common_element_end('a');
+        common_element('a', array('href' => $profile->profileurl,
+                                  'class' => 'nickname'),
+                       $profile->nickname);
+        # FIXME: URL, image, video, audio
+        common_element_start('p', array('class' => 'content'));
+        if ($notice->rendered) {
+            common_raw($this->highlight($notice->rendered, $terms));
+        } else {
+            # XXX: may be some uncooked notices in the DB,
+            # we cook them right now. This should probably disappear in future
+            # versions (>> 0.4.x)
+            common_raw($this->highlight(common_render_content($notice->content, $notice), $terms));
+        }
+        common_element_end('p');
+        $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
+        common_element_start('p', 'time');
+        common_element('a', array('class' => 'permalink',
+                                  'href' => $noticeurl,
+                                  'title' => common_exact_date($notice->created)),
+                       common_date_string($notice->created));
+        if ($notice->reply_to) {
+            $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to));
+            common_text(' (');
+            common_element('a', array('class' => 'inreplyto',
+                                      'href' => $replyurl),
+                           _('in reply to...'));
+            common_text(')');
+        }
+        common_element_start('a',
+                             array('href' => common_local_url('newnotice',
+                                                              array('replyto' => $profile->nickname)),
+                                   'onclick' => 'doreply("'.$profile->nickname.'"); return false',
+                                   'title' => _('reply'),
+                                   'class' => 'replybutton'));
+        common_hidden('posttoken', common_session_token());
+        
+        common_raw('&rarr;');
+        common_element_end('a');
+        common_element_end('p');
+        common_element_end('li');
+    }
+
+    function highlight($text, $terms) {
+        /* Highligh serach terms */
+        $pattern = '/('.implode('|',array_map('htmlspecialchars', $terms)).')/i';
+        $result = preg_replace($pattern, '<strong>\\1</strong>', $text);
+
+        /* Remove highlighting from inside links, loop incase multiple highlights in links */
+        $pattern = '/(href="[^"]*)<strong>('.implode('|',array_map('htmlspecialchars', $terms)).')<\/strong>([^"]*")/iU';
+        do {
+            $result = preg_replace($pattern, '\\1\\2\\3', $result, -1, $count);
+        } while ($count);
+        return $result;
+    }
 }
index 0f38515a020f8145fbbd2cd19153e66c60f70f4b..a7df62ca025e89fd1fddb9db3e5d85e4e7abb9b7 100644 (file)
@@ -25,46 +25,46 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class NoticesearchrssAction extends Rss10Action {
 
-       function init() {
-               return true;
-       }
+    function init() {
+        return true;
+    }
 
-       function get_notices($limit=0) {
+    function get_notices($limit=0) {
 
-               $q = $this->trimmed('q');
-               $notices = array();
+        $q = $this->trimmed('q');
+        $notices = array();
 
-               $notice = new Notice();
+        $notice = new Notice();
 
-               # lcase it for comparison
-               $q = strtolower($q);
+        # lcase it for comparison
+        $q = strtolower($q);
 
         $search_engine = $notice->getSearchEngine('identica_notices');
         $search_engine->set_sort_mode('chron');
 
-               if (!$limit) $limit = 20;
+        if (!$limit) $limit = 20;
         $search_engine->limit(0, $limit, true);
         $search_engine->query($q);
-               $notice->find();
+        $notice->find();
 
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
 
-               return $notices;
-       }
+        return $notices;
+    }
 
-       function get_channel() {
-               global $config;
-               $q = $this->trimmed('q');
-               $c = array('url' => common_local_url('noticesearchrss', array('q' => $q)),
-                                  'title' => $config['site']['name'] . sprintf(_(' Search Stream for "%s"'), $q),
-                                  'link' => common_local_url('noticesearch', array('q' => $q)),
-                                  'description' => sprintf(_('All updates matching search term "%s"'), $q));
-               return $c;
-       }
+    function get_channel() {
+        global $config;
+        $q = $this->trimmed('q');
+        $c = array('url' => common_local_url('noticesearchrss', array('q' => $q)),
+                   'title' => $config['site']['name'] . sprintf(_(' Search Stream for "%s"'), $q),
+                   'link' => common_local_url('noticesearch', array('q' => $q)),
+                   'description' => sprintf(_('All updates matching search term "%s"'), $q));
+        return $c;
+    }
 
-       function get_image() {
-               return NULL;
-       }
+    function get_image() {
+        return NULL;
+    }
 }
index 677f58800517244a6ae5a507517cccd34667630c..6f3b4c95c5723aad31185d8df14bc0334737feab 100644 (file)
@@ -23,62 +23,62 @@ require_once(INSTALLDIR.'/lib/mail.php');
 
 class NudgeAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               if (!common_logged_in()) {
-                       $this->client_error(_('Not logged in.'));
-                       return;
-               }
+        if (!common_logged_in()) {
+            $this->client_error(_('Not logged in.'));
+            return;
+        }
 
-               $user = common_current_user();
-               $other = User::staticGet('nickname', $this->arg('nickname'));
+        $user = common_current_user();
+        $other = User::staticGet('nickname', $this->arg('nickname'));
 
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       common_redirect(common_local_url('showstream', array('nickname' => $other->nickname)));
-                       return;
-               }
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            common_redirect(common_local_url('showstream', array('nickname' => $other->nickname)));
+            return;
+        }
 
-               # CSRF protection
+        # CSRF protection
 
-               $token = $this->trimmed('token');
-               
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        $token = $this->trimmed('token');
+        
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
         if (!$other->email || !$other->emailnotifynudge) {
             $this->client_error(_('This user doesn\'t allow nudges or hasn\'t confirmed or set his email yet.'));
             return;
         }
 
-               $this->notify($user, $other);
+        $this->notify($user, $other);
 
-               if ($this->boolean('ajax')) {
-                       common_start_html('text/xml;charset=utf-8', true);
-                       common_element_start('head');
-                       common_element('title', null, _('Nudge sent'));
-                       common_element_end('head');
-                       common_element_start('body');
-                       common_nudge_response();
-                       common_element_end('body');
-                       common_element_end('html');
-               } else {
+        if ($this->boolean('ajax')) {
+            common_start_html('text/xml;charset=utf-8', true);
+            common_element_start('head');
+            common_element('title', null, _('Nudge sent'));
+            common_element_end('head');
+            common_element_start('body');
+            common_nudge_response();
+            common_element_end('body');
+            common_element_end('html');
+        } else {
             // display a confirmation to the user
-                       common_redirect(common_local_url('showstream',
-                                                                                        array('nickname' => $other->nickname)));
-               }
-       }
+            common_redirect(common_local_url('showstream',
+                                             array('nickname' => $other->nickname)));
+        }
+    }
 
-       function notify($user, $other) {
-               if ($other->id != $user->id) {
-                       if ($other->email && $other->emailnotifynudge) {
-                               mail_notify_nudge($user, $other);
-                       }
-                       # XXX: notify by IM
-                       # XXX: notify by SMS
-               }
-       }
+    function notify($user, $other) {
+        if ($other->id != $user->id) {
+            if ($other->email && $other->emailnotifynudge) {
+                mail_notify_nudge($user, $other);
+            }
+            # XXX: notify by IM
+            # XXX: notify by SMS
+        }
+    }
 }
 
index 1b289dbeab3ab8e865be36e190890614685b9677..6192dfc3406824df88671bbfb958f2bf5f984c46 100644 (file)
@@ -23,70 +23,70 @@ require_once(INSTALLDIR.'/lib/openid.php');
 
 class OpenidloginAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-               if (common_logged_in()) {
-                       common_user_error(_('Already logged in.'));
-               } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $openid_url = $this->trimmed('openid_url');
+    function handle($args) {
+        parent::handle($args);
+        if (common_logged_in()) {
+            common_user_error(_('Already logged in.'));
+        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $openid_url = $this->trimmed('openid_url');
 
-                       # CSRF protection
-                       $token = $this->trimmed('token');
-                       if (!$token || $token != common_session_token()) {
-                               $this->show_form(_('There was a problem with your session token. Try again, please.'), $openid_url);
-                               return;
-                       }
+            # CSRF protection
+            $token = $this->trimmed('token');
+            if (!$token || $token != common_session_token()) {
+                $this->show_form(_('There was a problem with your session token. Try again, please.'), $openid_url);
+                return;
+            }
 
-                       $rememberme = $this->boolean('rememberme');
-                       
-                       common_ensure_session();
-                       
-                       $_SESSION['openid_rememberme'] = $rememberme;
-                       
-                       $result = oid_authenticate($openid_url,
-                                                                          'finishopenidlogin');
-                       
-                       if (is_string($result)) { # error message
-                               unset($_SESSION['openid_rememberme']);
-                               $this->show_form($result, $openid_url);
-                       }
-               } else {
-                       $openid_url = oid_get_last();
-                       $this->show_form(NULL, $openid_url);
-               }
-       }
+            $rememberme = $this->boolean('rememberme');
+            
+            common_ensure_session();
+            
+            $_SESSION['openid_rememberme'] = $rememberme;
+            
+            $result = oid_authenticate($openid_url,
+                                       'finishopenidlogin');
+            
+            if (is_string($result)) { # error message
+                unset($_SESSION['openid_rememberme']);
+                $this->show_form($result, $openid_url);
+            }
+        } else {
+            $openid_url = oid_get_last();
+            $this->show_form(NULL, $openid_url);
+        }
+    }
 
-       function get_instructions() {
-               return _('Login with an [OpenID](%%doc.openid%%) account.');
-       }
+    function get_instructions() {
+        return _('Login with an [OpenID](%%doc.openid%%) account.');
+    }
 
-       function show_top($error=NULL) {
-               if ($error) {
-                       common_element('div', array('class' => 'error'), $error);
-               } else {
-                       $instr = $this->get_instructions();
-                       $output = common_markup_to_html($instr);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-               }
-       }
+    function show_top($error=NULL) {
+        if ($error) {
+            common_element('div', array('class' => 'error'), $error);
+        } else {
+            $instr = $this->get_instructions();
+            $output = common_markup_to_html($instr);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('div');
+        }
+    }
 
-       function show_form($error=NULL, $openid_url) {
-               common_show_header(_('OpenID Login'), NULL, $error, array($this, 'show_top'));
-               $formaction = common_local_url('openidlogin');
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'openidlogin',
-                                                                                  'action' => $formaction));
-               common_hidden('token', common_session_token());
-               common_input('openid_url', _('OpenID URL'),
-                                        $openid_url,
-                                        _('Your OpenID URL'));
-               common_checkbox('rememberme', _('Remember me'), false,
-                               _('Automatically login in the future; ' .
-                                  'not for shared computers!'));
-               common_submit('submit', _('Login'));
-               common_element_end('form');
-               common_show_footer();
-       }
+    function show_form($error=NULL, $openid_url) {
+        common_show_header(_('OpenID Login'), NULL, $error, array($this, 'show_top'));
+        $formaction = common_local_url('openidlogin');
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'openidlogin',
+                                           'action' => $formaction));
+        common_hidden('token', common_session_token());
+        common_input('openid_url', _('OpenID URL'),
+                     $openid_url,
+                     _('Your OpenID URL'));
+        common_checkbox('rememberme', _('Remember me'), false,
+                        _('Automatically login in the future; ' .
+                           'not for shared computers!'));
+        common_submit('submit', _('Login'));
+        common_element_end('form');
+        common_show_footer();
+    }
 }
index f539d111f9e302abef5daf1f98c6e5b355839879..dd575bb737837c97b4f1426d38950223ebd037e1 100644 (file)
@@ -24,133 +24,133 @@ require_once(INSTALLDIR.'/lib/openid.php');
 
 class OpenidsettingsAction extends SettingsAction {
 
-       function get_instructions() {
-               return _('[OpenID](%%doc.openid%%) lets you log into many sites ' .
-                         ' with the same user account. '.
-                         ' Manage your associated OpenIDs from here.');
-       }
-
-       function show_form($msg=NULL, $success=false) {
-
-               $user = common_current_user();
-
-               $this->form_header(_('OpenID settings'), $msg, $success);
-
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'openidadd',
-                                                                                  'action' =>
-                                                                                  common_local_url('openidsettings')));
-               common_hidden('token', common_session_token());
-               common_element('h2', NULL, _('Add OpenID'));
-               common_element('p', NULL,
-                                          _('If you want to add an OpenID to your account, ' .
-                                                 'enter it in the box below and click "Add".'));
-               common_element_start('p');
-               common_element('label', array('for' => 'openid_url'),
-                                          _('OpenID URL'));
-               common_element('input', array('name' => 'openid_url',
-                                                                         'type' => 'text',
-                                                                         'id' => 'openid_url'));
-               common_element('input', array('type' => 'submit',
-                                                                         'id' => 'add',
-                                                                         'name' => 'add',
-                                                                         'class' => 'submit',
-                                                                         'value' => _('Add')));
-               common_element_end('p');
-               common_element_end('form');
-
-               $oid = new User_openid();
-               $oid->user_id = $user->id;
-
-               $cnt = $oid->find();
-
-               if ($cnt > 0) {
-
-                       common_element('h2', NULL, _('Remove OpenID'));
-
-                       if ($cnt == 1 && !$user->password) {
-
-                               common_element('p', NULL,
-                                                          _('Removing your only OpenID would make it impossible to log in! ' .
-                                                                 'If you need to remove it, add another OpenID first.'));
-
-                               if ($oid->fetch()) {
-                                       common_element_start('p');
-                                       common_element('a', array('href' => $oid->canonical),
-                                                                  $oid->display);
-                                       common_element_end('p');
-                               }
-
-                       } else {
-
-                               common_element('p', NULL,
-                                                          _('You can remove an OpenID from your account '.
-                                                                 'by clicking the button marked "Remove".'));
-                               $idx = 0;
-
-                               while ($oid->fetch()) {
-                                       common_element_start('form', array('method' => 'POST',
-                                                                                                          'id' => 'openiddelete' . $idx,
-                                                                                                          'action' =>
-                                                                                                          common_local_url('openidsettings')));
-                                       common_element_start('p');
-                                       common_hidden('token', common_session_token());
-                                       common_element('a', array('href' => $oid->canonical),
-                                                                  $oid->display);
-                                       common_element('input', array('type' => 'hidden',
-                                                                                                 'id' => 'openid_url'.$idx,
-                                                                                                 'name' => 'openid_url',
-                                                                                                 'value' => $oid->canonical));
-                                       common_element('input', array('type' => 'submit',
-                                                                                                 'id' => 'remove'.$idx,
-                                                                                                 'name' => 'remove',
-                                                                                                 'class' => 'submit',
-                                                                                                 'value' => _('Remove')));
-                                       common_element_end('p');
-                                       common_element_end('form');
-                                       $idx++;
-                               }
-                       }
-               }
-
-               common_show_footer();
-       }
-
-       function handle_post() {
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               if ($this->arg('add')) {
-                       $result = oid_authenticate($this->trimmed('openid_url'), 'finishaddopenid');
-                       if (is_string($result)) { # error message
-                               $this->show_form($result);
-                       }
-               } else if ($this->arg('remove')) {
-                       $this->remove_openid();
-               } else {
-                       $this->show_form(_('Something weird happened.'));
-               }
-       }
-
-       function remove_openid() {
-
-               $openid_url = $this->trimmed('openid_url');
-               $oid = User_openid::staticGet('canonical', $openid_url);
-               if (!$oid) {
-                       $this->show_form(_('No such OpenID.'));
-                       return;
-               }
-               $cur = common_current_user();
-               if (!$cur || $oid->user_id != $cur->id) {
-                       $this->show_form(_('That OpenID does not belong to you.'));
-                       return;
-               }
-               $oid->delete();
-               $this->show_form(_('OpenID removed.'), true);
-               return;
-       }
+    function get_instructions() {
+        return _('[OpenID](%%doc.openid%%) lets you log into many sites ' .
+                  ' with the same user account. '.
+                  ' Manage your associated OpenIDs from here.');
+    }
+
+    function show_form($msg=NULL, $success=false) {
+
+        $user = common_current_user();
+
+        $this->form_header(_('OpenID settings'), $msg, $success);
+
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'openidadd',
+                                           'action' =>
+                                           common_local_url('openidsettings')));
+        common_hidden('token', common_session_token());
+        common_element('h2', NULL, _('Add OpenID'));
+        common_element('p', NULL,
+                       _('If you want to add an OpenID to your account, ' .
+                          'enter it in the box below and click "Add".'));
+        common_element_start('p');
+        common_element('label', array('for' => 'openid_url'),
+                       _('OpenID URL'));
+        common_element('input', array('name' => 'openid_url',
+                                      'type' => 'text',
+                                      'id' => 'openid_url'));
+        common_element('input', array('type' => 'submit',
+                                      'id' => 'add',
+                                      'name' => 'add',
+                                      'class' => 'submit',
+                                      'value' => _('Add')));
+        common_element_end('p');
+        common_element_end('form');
+
+        $oid = new User_openid();
+        $oid->user_id = $user->id;
+
+        $cnt = $oid->find();
+
+        if ($cnt > 0) {
+
+            common_element('h2', NULL, _('Remove OpenID'));
+
+            if ($cnt == 1 && !$user->password) {
+
+                common_element('p', NULL,
+                               _('Removing your only OpenID would make it impossible to log in! ' .
+                                  'If you need to remove it, add another OpenID first.'));
+
+                if ($oid->fetch()) {
+                    common_element_start('p');
+                    common_element('a', array('href' => $oid->canonical),
+                                   $oid->display);
+                    common_element_end('p');
+                }
+
+            } else {
+
+                common_element('p', NULL,
+                               _('You can remove an OpenID from your account '.
+                                  'by clicking the button marked "Remove".'));
+                $idx = 0;
+
+                while ($oid->fetch()) {
+                    common_element_start('form', array('method' => 'POST',
+                                                       'id' => 'openiddelete' . $idx,
+                                                       'action' =>
+                                                       common_local_url('openidsettings')));
+                    common_element_start('p');
+                    common_hidden('token', common_session_token());
+                    common_element('a', array('href' => $oid->canonical),
+                                   $oid->display);
+                    common_element('input', array('type' => 'hidden',
+                                                  'id' => 'openid_url'.$idx,
+                                                  'name' => 'openid_url',
+                                                  'value' => $oid->canonical));
+                    common_element('input', array('type' => 'submit',
+                                                  'id' => 'remove'.$idx,
+                                                  'name' => 'remove',
+                                                  'class' => 'submit',
+                                                  'value' => _('Remove')));
+                    common_element_end('p');
+                    common_element_end('form');
+                    $idx++;
+                }
+            }
+        }
+
+        common_show_footer();
+    }
+
+    function handle_post() {
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        if ($this->arg('add')) {
+            $result = oid_authenticate($this->trimmed('openid_url'), 'finishaddopenid');
+            if (is_string($result)) { # error message
+                $this->show_form($result);
+            }
+        } else if ($this->arg('remove')) {
+            $this->remove_openid();
+        } else {
+            $this->show_form(_('Something weird happened.'));
+        }
+    }
+
+    function remove_openid() {
+
+        $openid_url = $this->trimmed('openid_url');
+        $oid = User_openid::staticGet('canonical', $openid_url);
+        if (!$oid) {
+            $this->show_form(_('No such OpenID.'));
+            return;
+        }
+        $cur = common_current_user();
+        if (!$cur || $oid->user_id != $cur->id) {
+            $this->show_form(_('That OpenID does not belong to you.'));
+            return;
+        }
+        $oid->delete();
+        $this->show_form(_('OpenID removed.'), true);
+        return;
+    }
 }
index 0f366be4ca6f717126f39d41976a4cce1682348f..707e929fb1fcf5c61f6a33e3cb777a817b3f111d 100644 (file)
@@ -21,39 +21,39 @@ if (!defined('LACONICA')) { exit(1); }
 
 class OpensearchAction extends Action {
 
-       function handle($args) {
-
-               parent::handle($args);
-
-               $type = $this->trimmed('type');
-
-               $short_name = '';
-               if ($type == 'people') {
-                       $type = 'peoplesearch';
-                       $short_name = _('People Search');
-               } else {
-                       $short_name = _('Notice Search');
-                       $type = 'noticesearch';
-               }
-
-               header('Content-Type: text/html');
-
-               common_start_xml();
-               common_element_start('OpenSearchDescription', array('xmlns' => 'http://a9.com/-/spec/opensearch/1.1/'));
-
-               $short_name =  common_config('site', 'name').' '.$short_name;
-               common_element('ShortName', NULL, $short_name);
-               common_element('Contact', NULL, common_config('site', 'email'));
-               common_element('Url', array('type' => 'text/html', 'method' => 'get',
-                                          'template' => str_replace('---', '{searchTerms}', common_local_url($type, array('q' => '---')))));
-               common_element('Image', array('height' => 16, 'width' => 16, 'type' => 'image/vnd.microsoft.icon'), common_path('favicon.ico'));
-               common_element('Image', array('height' => 50, 'width' => 50, 'type' => 'image/png'), theme_path('logo.png'));
-               common_element('AdultContent', NULL, 'false');
-               common_element('Language', NULL, common_language());
-               common_element('OutputEncoding', NULL, 'UTF-8');
-               common_element('InputEncoding', NULL, 'UTF-8');
-
-               common_element_end('OpenSearchDescription');
-               common_end_xml();
-       }
+    function handle($args) {
+
+        parent::handle($args);
+
+        $type = $this->trimmed('type');
+
+        $short_name = '';
+        if ($type == 'people') {
+            $type = 'peoplesearch';
+            $short_name = _('People Search');
+        } else {
+            $short_name = _('Notice Search');
+            $type = 'noticesearch';
+        }
+
+        header('Content-Type: text/html');
+
+        common_start_xml();
+        common_element_start('OpenSearchDescription', array('xmlns' => 'http://a9.com/-/spec/opensearch/1.1/'));
+
+        $short_name =  common_config('site', 'name').' '.$short_name;
+        common_element('ShortName', NULL, $short_name);
+        common_element('Contact', NULL, common_config('site', 'email'));
+        common_element('Url', array('type' => 'text/html', 'method' => 'get',
+                       'template' => str_replace('---', '{searchTerms}', common_local_url($type, array('q' => '---')))));
+        common_element('Image', array('height' => 16, 'width' => 16, 'type' => 'image/vnd.microsoft.icon'), common_path('favicon.ico'));
+        common_element('Image', array('height' => 50, 'width' => 50, 'type' => 'image/png'), theme_path('logo.png'));
+        common_element('AdultContent', NULL, 'false');
+        common_element('Language', NULL, common_language());
+        common_element('OutputEncoding', NULL, 'UTF-8');
+        common_element('InputEncoding', NULL, 'UTF-8');
+
+        common_element_end('OpenSearchDescription');
+        common_end_xml();
+    }
 }
index eccf90e91b3a0d7122036d468873e6ec29523f7c..9b824cea2f39b8efe7952c71d082cc662d03a999 100644 (file)
@@ -23,159 +23,159 @@ require_once(INSTALLDIR.'/lib/settingsaction.php');
 
 class OthersettingsAction extends SettingsAction {
 
-       function get_instructions() {
-               return _('Manage various other options.');
-       }
+    function get_instructions() {
+        return _('Manage various other options.');
+    }
 
-       function show_form($msg=NULL, $success=false) {
-               $user = common_current_user();
+    function show_form($msg=NULL, $success=false) {
+        $user = common_current_user();
 
-               $this->form_header(_('Other Settings'), $msg, $success);
+        $this->form_header(_('Other Settings'), $msg, $success);
 
-               common_element('h2', NULL, _('URL Auto-shortening'));
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'othersettings',
-                                                                                  'action' =>
-                                                                                  common_local_url('othersettings')));
-               common_hidden('token', common_session_token());
+        common_element('h2', NULL, _('URL Auto-shortening'));
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'othersettings',
+                                           'action' =>
+                                           common_local_url('othersettings')));
+        common_hidden('token', common_session_token());
 
-               $services = array(
-                       '' => 'None',
+        $services = array(
+            '' => 'None',
             'ur1.ca' => 'ur1.ca (free service)',
             '2tu.us' => '2tu.us (free service)',
             'ptiturl.com' => 'ptiturl.com',
             'bit.ly' => 'bit.ly',
-                       'tinyurl.com' => 'tinyurl.com',
-                       'is.gd' => 'is.gd',
-                       'snipr.com' => 'snipr.com',
-                       'metamark.net' => 'metamark.net'
-               );
+            'tinyurl.com' => 'tinyurl.com',
+            'is.gd' => 'is.gd',
+            'snipr.com' => 'snipr.com',
+            'metamark.net' => 'metamark.net'
+        );
 
-               common_dropdown('urlshorteningservice', _('Service'), $services, _('Automatic shortening service to use.'), FALSE, $user->urlshorteningservice);
+        common_dropdown('urlshorteningservice', _('Service'), $services, _('Automatic shortening service to use.'), FALSE, $user->urlshorteningservice);
 
-               common_submit('save', _('Save'));
+        common_submit('save', _('Save'));
 
-               common_element_end('form');
+        common_element_end('form');
 
-//             common_element('h2', NULL, _('Delete my account'));
-//             $this->show_delete_form();
+//        common_element('h2', NULL, _('Delete my account'));
+//        $this->show_delete_form();
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function show_feeds_list($feeds) {
-               common_element_start('div', array('class' => 'feedsdel'));
-               common_element('p', null, 'Feeds:');
-               common_element_start('ul', array('class' => 'xoxo'));
+    function show_feeds_list($feeds) {
+        common_element_start('div', array('class' => 'feedsdel'));
+        common_element('p', null, 'Feeds:');
+        common_element_start('ul', array('class' => 'xoxo'));
 
-               foreach ($feeds as $key => $value) {
-                       $this->common_feed_item($feeds[$key]);
-               }
-               common_element_end('ul');
-               common_element_end('div');
-       }
+        foreach ($feeds as $key => $value) {
+            $this->common_feed_item($feeds[$key]);
+        }
+        common_element_end('ul');
+        common_element_end('div');
+    }
 
     //TODO move to common.php (and retrace its origin)
-       function common_feed_item($feed) {
+    function common_feed_item($feed) {
         $user = common_current_user();
-               $nickname = $user->nickname;
-
-               switch($feed['item']) {
-                       case 'notices': default:
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "$nickname's ".$feed['version']." notice feed";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'foaf':
-                               $feed_classname = "foaf";
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "$nickname's FOAF file";
-                               $feed['textContent'] = "FOAF";
-                               break;
-               }
-               common_element_start('li');
-               common_element('a', array('href' => $feed['href'],
-                                                                 'class' => $feed_classname,
-                                                                 'type' => $feed_mimetype,
-                                                                 'title' => $feed_title),
-                                                       $feed['textContent']);
-               common_element_end('li');
-       }
-
-//     function show_delete_form() {
-//             $user = common_current_user();
+        $nickname = $user->nickname;
+
+        switch($feed['item']) {
+            case 'notices': default:
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "$nickname's ".$feed['version']." notice feed";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'foaf':
+                $feed_classname = "foaf";
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "$nickname's FOAF file";
+                $feed['textContent'] = "FOAF";
+                break;
+        }
+        common_element_start('li');
+        common_element('a', array('href' => $feed['href'],
+                                  'class' => $feed_classname,
+                                  'type' => $feed_mimetype,
+                                  'title' => $feed_title),
+                            $feed['textContent']);
+        common_element_end('li');
+    }
+
+//    function show_delete_form() {
+//        $user = common_current_user();
 //      $notices = DB_DataObject::factory('notice');
 //      $notices->profile_id = $user->id;
 //      $notice_count = (int) $notices->count();
 //
-//             common_element_start('form', array('method' => 'POST',
-//                                                                                'id' => 'delete',
-//                                                                                'action' =>
-//                                                                                common_local_url('deleteprofile')));
+//        common_element_start('form', array('method' => 'POST',
+//                                           'id' => 'delete',
+//                                           'action' =>
+//                                           common_local_url('deleteprofile')));
 //
-//             common_hidden('token', common_session_token());
+//        common_hidden('token', common_session_token());
 //      common_element('p', null, "You can copy your notices and contacts by saving the two links below before deleting your account. Be careful, this operation cannot be undone.");
 //
-//             $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('limit' => $notice_count, 'nickname' => $user->nickname)),
-//                                                                                       'type' => 'rss',
-//                                                                                       'version' => 'RSS 1.0',
-//                                                                                       'item' => 'notices'),
-//                                                                      1=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
-//                                                                                       'type' => 'rdf',
-//                                                                                       'version' => 'FOAF',
-//                                                                                       'item' => 'foaf')));
+//        $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('limit' => $notice_count, 'nickname' => $user->nickname)),
+//                                              'type' => 'rss',
+//                                              'version' => 'RSS 1.0',
+//                                              'item' => 'notices'),
+//                                     1=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
+//                                              'type' => 'rdf',
+//                                              'version' => 'FOAF',
+//                                              'item' => 'foaf')));
 //
-//             common_submit('deleteaccount', _('Delete my account'));
-//             common_element_end('form');
-//     }
+//        common_submit('deleteaccount', _('Delete my account'));
+//        common_element_end('form');
+//    }
 
-       function handle_post() {
+    function handle_post() {
 
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
-               if ($this->arg('save')) {
-                       $this->save_preferences();
-               }else {
-                       $this->show_form(_('Unexpected form submission.'));
-               }
-       }
+        if ($this->arg('save')) {
+            $this->save_preferences();
+        }else {
+            $this->show_form(_('Unexpected form submission.'));
+        }
+    }
 
-       function save_preferences() {
+    function save_preferences() {
 
-               $urlshorteningservice = $this->trimmed('urlshorteningservice');
+        $urlshorteningservice = $this->trimmed('urlshorteningservice');
 
-               if (!is_null($urlshorteningservice) && strlen($urlshorteningservice) > 50) {
-                       $this->show_form(_('URL shortening service is too long (max 50 chars).'));
-                       return;
-               }
+        if (!is_null($urlshorteningservice) && strlen($urlshorteningservice) > 50) {
+            $this->show_form(_('URL shortening service is too long (max 50 chars).'));
+            return;
+        }
 
-               $user = common_current_user();
+        $user = common_current_user();
 
-               assert(!is_null($user)); # should already be checked
+        assert(!is_null($user)); # should already be checked
 
-               $user->query('BEGIN');
+        $user->query('BEGIN');
 
-               $original = clone($user);
+        $original = clone($user);
 
-               $user->urlshorteningservice = $urlshorteningservice;
+        $user->urlshorteningservice = $urlshorteningservice;
 
-               $result = $user->update($original);
+        $result = $user->update($original);
 
-               if ($result === FALSE) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t update user.'));
-                       return;
-               }
+        if ($result === FALSE) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t update user.'));
+            return;
+        }
 
-               $user->query('COMMIT');
+        $user->query('COMMIT');
 
-               $this->show_form(_('Preferences saved.'), true);
-       }
+        $this->show_form(_('Preferences saved.'), true);
+    }
 }
index 2e54233ec1c607bb2f112809feec616c0064b450..f89de53f713937dea249c3f6d73c560ee5d25019 100644 (file)
@@ -24,61 +24,61 @@ require_once(INSTALLDIR.'/lib/profilelist.php');
 
 class PeoplesearchAction extends SearchAction {
 
-       function get_instructions() {
-               return _('Search for people on %%site.name%% by their name, location, or interests. ' .
-                                 'Separate the terms by spaces; they must be 3 characters or more.');
-       }
+    function get_instructions() {
+        return _('Search for people on %%site.name%% by their name, location, or interests. ' .
+                  'Separate the terms by spaces; they must be 3 characters or more.');
+    }
 
-       function get_title() {
-               return _('People search');
-       }
+    function get_title() {
+        return _('People search');
+    }
 
-       function show_results($q, $page) {
+    function show_results($q, $page) {
 
-               $profile = new Profile();
+        $profile = new Profile();
 
-               # lcase it for comparison
-               $q = strtolower($q);
+        # lcase it for comparison
+        $q = strtolower($q);
 
         $search_engine = $profile->getSearchEngine('identica_people');
 
         $search_engine->set_sort_mode('chron');
-               # Ask for an extra to see if there's more.
+        # Ask for an extra to see if there's more.
         $search_engine->limit((($page-1)*PROFILES_PER_PAGE), PROFILES_PER_PAGE + 1);
         if (false === $search_engine->query($q)) {
             $cnt = 0;
         }
         else {
-                   $cnt = $profile->find();
+            $cnt = $profile->find();
+        }
+        if ($cnt > 0) {
+            $terms = preg_split('/[\s,]+/', $q);
+            $results = new PeopleSearchResults($profile, $terms);
+            $results->show_list();
+        } else {
+            common_element('p', 'error', _('No results'));
         }
-               if ($cnt > 0) {
-                       $terms = preg_split('/[\s,]+/', $q);
-                       $results = new PeopleSearchResults($profile, $terms);
-                       $results->show_list();
-               } else {
-                       common_element('p', 'error', _('No results'));
-               }
 
-               $profile->free();
-               
-               common_pagination($page > 1, $cnt > PROFILES_PER_PAGE,
-                                                 $page, 'peoplesearch', array('q' => $q));
-       }
+        $profile->free();
+        
+        common_pagination($page > 1, $cnt > PROFILES_PER_PAGE,
+                          $page, 'peoplesearch', array('q' => $q));
+    }
 }
 
 class PeopleSearchResults extends ProfileList {
 
-       var $terms = NULL;
-       var $pattern = NULL;
-       
-       function __construct($profile, $terms) {
-               parent::__construct($profile);
-               $this->terms = array_map('preg_quote', 
-                                                                array_map('htmlspecialchars', $terms));
-               $this->pattern = '/('.implode('|',$terms).')/i';
-       }
-       
-       function highlight($text) {
-               return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
-       }
+    var $terms = NULL;
+    var $pattern = NULL;
+    
+    function __construct($profile, $terms) {
+        parent::__construct($profile);
+        $this->terms = array_map('preg_quote', 
+                                 array_map('htmlspecialchars', $terms));
+        $this->pattern = '/('.implode('|',$terms).')/i';
+    }
+    
+    function highlight($text) {
+        return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
+    }
 }
index c508e05943c50382cb6f9d966a0b7bb31418381a..f03a3c8af463bb548f0abe213e9d64caed0d10f9 100644 (file)
@@ -22,82 +22,82 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/lib/profilelist.php');
 
 class PeopletagAction extends Action {
-       
-       function handle($args) {
+    
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               $tag = $this->trimmed('tag');
-               
-               if (!common_valid_profile_tag($tag)) {
-                       $this->client_error(sprintf(_('Not a valid people tag: %s'), $tag));
-                       return;
-               }
+        $tag = $this->trimmed('tag');
+        
+        if (!common_valid_profile_tag($tag)) {
+            $this->client_error(sprintf(_('Not a valid people tag: %s'), $tag));
+            return;
+        }
 
-               $page = $this->trimmed('page');
-               
-               if (!$page) {
-                       $page = 1;
-               }
-               
-               # Looks like we're good; show the header
+        $page = $this->trimmed('page');
+        
+        if (!$page) {
+            $page = 1;
+        }
+        
+        # Looks like we're good; show the header
 
-               common_show_header(sprintf(_('Users self-tagged with %s - page %d'), $tag, $page),
-                                                  NULL, $tag, array($this, 'show_top'));
+        common_show_header(sprintf(_('Users self-tagged with %s - page %d'), $tag, $page),
+                           NULL, $tag, array($this, 'show_top'));
 
-               $this->show_people($tag, $page);
+        $this->show_people($tag, $page);
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function show_people($tag, $page) {
-               
-               $profile = new Profile();
+    function show_people($tag, $page) {
+        
+        $profile = new Profile();
 
-               $offset = ($page-1)*PROFILES_PER_PAGE;
-               $limit = PROFILES_PER_PAGE + 1;
-               
-               if (common_config('db','type') == 'pgsql') {
-                       $lim = ' LIMIT ' . $limit . ' OFFSET ' . $offset;
-               } else {
-                       $lim = ' LIMIT ' . $offset . ', ' . $limit;
-               }
+        $offset = ($page-1)*PROFILES_PER_PAGE;
+        $limit = PROFILES_PER_PAGE + 1;
+        
+        if (common_config('db','type') == 'pgsql') {
+            $lim = ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+        } else {
+            $lim = ' LIMIT ' . $offset . ', ' . $limit;
+        }
 
-               # XXX: memcached this
-               
-               $profile->query(sprintf('SELECT profile.* ' .
-                                                               'FROM profile JOIN profile_tag ' .
-                                                               'ON profile.id = profile_tag.tagger ' .
-                                                               'WHERE profile_tag.tagger = profile_tag.tagged ' .
-                                                               'AND tag = "%s" ' .
-                                                               'ORDER BY profile_tag.modified DESC ' . 
-                                                               $lim, $tag));
+        # XXX: memcached this
+        
+        $profile->query(sprintf('SELECT profile.* ' .
+                                'FROM profile JOIN profile_tag ' .
+                                'ON profile.id = profile_tag.tagger ' .
+                                'WHERE profile_tag.tagger = profile_tag.tagged ' .
+                                'AND tag = "%s" ' .
+                                'ORDER BY profile_tag.modified DESC ' . 
+                                $lim, $tag));
 
-               $pl = new ProfileList($profile);
-               $cnt = $pl->show_list();
-               
-               common_pagination($page > 1,
-                                                 $cnt > PROFILES_PER_PAGE,
-                                                 $page,
-                                                 $this->trimmed('action'),
-                                                 array('tag' => $tag));
-       }
-       
-       function show_top($tag) {
-               $instr = sprintf(_('These are users who have tagged themselves "%s" ' .
-                                                  'to show a common interest, characteristic, hobby or job.'), $tag);
-               common_element_start('div', 'instructions');
-               common_element_start('p');
-               common_text($instr);
-               common_element_end('p');
-               common_element_end('div');
-       }
+        $pl = new ProfileList($profile);
+        $cnt = $pl->show_list();
+        
+        common_pagination($page > 1,
+                          $cnt > PROFILES_PER_PAGE,
+                          $page,
+                          $this->trimmed('action'),
+                          array('tag' => $tag));
+    }
+    
+    function show_top($tag) {
+        $instr = sprintf(_('These are users who have tagged themselves "%s" ' .
+                           'to show a common interest, characteristic, hobby or job.'), $tag);
+        common_element_start('div', 'instructions');
+        common_element_start('p');
+        common_text($instr);
+        common_element_end('p');
+        common_element_end('div');
+    }
 
-       function get_title() {
-               return NULL;
-       }
+    function get_title() {
+        return NULL;
+    }
 
-       function show_header($arr) {
-               return;
-       }
+    function show_header($arr) {
+        return;
+    }
 }
index 243081f1222540eb00e7a828c1205e881536d4a5..66e4dc806c618088e9417a2c2567098c5259ced9 100644 (file)
@@ -22,67 +22,67 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/lib/omb.php');
 
 class PostnoticeAction extends Action {
-       function handle($args) {
-               parent::handle($args);
-               try {
-                       common_remove_magic_from_request();
-                       $req = OAuthRequest::from_request();
-                       # Note: server-to-server function!
-                       $server = omb_oauth_server();
-                       list($consumer, $token) = $server->verify_request($req);
-                       if ($this->save_notice($req, $consumer, $token)) {
-                               print "omb_version=".OMB_VERSION_01;
-                       }
-               } catch (OAuthException $e) {
-                       common_server_error($e->getMessage());
-                       return;
-               }
-       }
+    function handle($args) {
+        parent::handle($args);
+        try {
+            common_remove_magic_from_request();
+            $req = OAuthRequest::from_request();
+            # Note: server-to-server function!
+            $server = omb_oauth_server();
+            list($consumer, $token) = $server->verify_request($req);
+            if ($this->save_notice($req, $consumer, $token)) {
+                print "omb_version=".OMB_VERSION_01;
+            }
+        } catch (OAuthException $e) {
+            common_server_error($e->getMessage());
+            return;
+        }
+    }
 
-       function save_notice(&$req, &$consumer, &$token) {
-               $version = $req->get_parameter('omb_version');
-               if ($version != OMB_VERSION_01) {
-                       common_user_error(_('Unsupported OMB version'), 400);
-                       return false;
-               }
-               # First, check to see
-               $listenee =  $req->get_parameter('omb_listenee');
-               $remote_profile = Remote_profile::staticGet('uri', $listenee);
-               if (!$remote_profile) {
-                       common_user_error(_('Profile unknown'), 403);
-                       return false;
-               }
-               $sub = Subscription::staticGet('token', $token->key);
-               if (!$sub) {
-                       common_user_error(_('No such subscription'), 403);
-                       return false;
-               }
-               $content = $req->get_parameter('omb_notice_content');
+    function save_notice(&$req, &$consumer, &$token) {
+        $version = $req->get_parameter('omb_version');
+        if ($version != OMB_VERSION_01) {
+            common_user_error(_('Unsupported OMB version'), 400);
+            return false;
+        }
+        # First, check to see
+        $listenee =  $req->get_parameter('omb_listenee');
+        $remote_profile = Remote_profile::staticGet('uri', $listenee);
+        if (!$remote_profile) {
+            common_user_error(_('Profile unknown'), 403);
+            return false;
+        }
+        $sub = Subscription::staticGet('token', $token->key);
+        if (!$sub) {
+            common_user_error(_('No such subscription'), 403);
+            return false;
+        }
+        $content = $req->get_parameter('omb_notice_content');
         $content_shortened = common_shorten_links($content);
         if (mb_strlen($content_shortened) > 140) {
             common_user_error(_('Invalid notice content'), 400);
             return false;
         }
-               $notice_uri = $req->get_parameter('omb_notice');
-               if (!Validate::uri($notice_uri) &&
-                       !common_valid_tag($notice_uri)) {
-                       common_user_error(_('Invalid notice uri'), 400);
-                       return false;
-               }
-               $notice_url = $req->get_parameter('omb_notice_url');
-               if ($notice_url && !common_valid_http_url($notice_url)) {
-                       common_user_error(_('Invalid notice url'), 400);
-                       return false;
-               }
-               $notice = Notice::staticGet('uri', $notice_uri);
-               if (!$notice) {
-                       $notice = Notice::saveNew($remote_profile->id, $content, 'omb', false, 0, $notice_uri);
-                       if (is_string($notice)) {
-                               common_server_serror($notice, 500);
-                               return false;
-                       }
-                       common_broadcast_notice($notice, true);
-               }
-               return true;
-       }
+        $notice_uri = $req->get_parameter('omb_notice');
+        if (!Validate::uri($notice_uri) &&
+            !common_valid_tag($notice_uri)) {
+            common_user_error(_('Invalid notice uri'), 400);
+            return false;
+        }
+        $notice_url = $req->get_parameter('omb_notice_url');
+        if ($notice_url && !common_valid_http_url($notice_url)) {
+            common_user_error(_('Invalid notice url'), 400);
+            return false;
+        }
+        $notice = Notice::staticGet('uri', $notice_uri);
+        if (!$notice) {
+            $notice = Notice::saveNew($remote_profile->id, $content, 'omb', false, 0, $notice_uri);
+            if (is_string($notice)) {
+                common_server_serror($notice, 500);
+                return false;
+            }
+            common_broadcast_notice($notice, true);
+        }
+        return true;
+    }
 }
index ed2623c9bbedce124bcb8661881583904ef141db..3d92161ab13b29a68c6aeae7c254351cfdc9ef4d 100644 (file)
@@ -23,417 +23,417 @@ require_once(INSTALLDIR.'/lib/settingsaction.php');
 
 class ProfilesettingsAction extends SettingsAction {
 
-       function get_instructions() {
-               return _('You can update your personal profile info here '.
-                                 'so people know more about you.');
-       }
-
-       function show_form($msg=NULL, $success=false) {
-               $this->form_header(_('Profile settings'), $msg, $success);
-               $this->show_settings_form();
-               common_element('h2', NULL, _('Avatar'));
-               $this->show_avatar_form();
-               common_element('h2', NULL, _('Change password'));
-               $this->show_password_form();
-//             common_element('h2', NULL, _('Delete my account'));
-//             $this->show_delete_form();
-               common_show_footer();
-       }
-
-       function handle_post() {
-
-               # CSRF protection
-
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               if ($this->arg('save')) {
-                       $this->save_profile();
-               } else if ($this->arg('upload')) {
-                       $this->upload_avatar();
-               } else if ($this->arg('changepass')) {
-                       $this->change_password();
-               }
-
-       }
-
-       function show_settings_form() {
-
-               $user = common_current_user();
-               $profile = $user->getProfile();
-
-               common_element_start('form', array('method' => 'POST',
-                                                                                  'id' => 'profilesettings',
-                                                                                  'action' =>
-                                                                                  common_local_url('profilesettings')));
-               common_hidden('token', common_session_token());
-               
-               # too much common patterns here... abstractable?
-               
-               common_input('nickname', _('Nickname'),
-                                        ($this->arg('nickname')) ? $this->arg('nickname') : $profile->nickname,
-                                        _('1-64 lowercase letters or numbers, no punctuation or spaces'));
-               common_input('fullname', _('Full name'),
-                                        ($this->arg('fullname')) ? $this->arg('fullname') : $profile->fullname);
-               common_input('homepage', _('Homepage'),
-                                        ($this->arg('homepage')) ? $this->arg('homepage') : $profile->homepage,
-                                        _('URL of your homepage, blog, or profile on another site'));
-               common_textarea('bio', _('Bio'),
-                                               ($this->arg('bio')) ? $this->arg('bio') : $profile->bio,
-                                               _('Describe yourself and your interests in 140 chars'));
-               common_input('location', _('Location'),
-                                        ($this->arg('location')) ? $this->arg('location') : $profile->location,
-                                        _('Where you are, like "City, State (or Region), Country"'));
-               common_input('tags', _('Tags'),
-                                        ($this->arg('tags')) ? $this->arg('tags') : implode(' ', $user->getSelfTags()),
-                                        _('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated'));
-
-               $language = common_language();
-               common_dropdown('language', _('Language'), get_nice_language_list(), _('Preferred language'), TRUE, $language);
-               $timezone = common_timezone();
-               $timezones = array();
-               foreach(DateTimeZone::listIdentifiers() as $k => $v) {
-                       $timezones[$v] = $v;
-               }
-               common_dropdown('timezone', _('Timezone'), $timezones, _('What timezone are you normally in?'), TRUE, $timezone);
-
-               common_checkbox('autosubscribe', _('Automatically subscribe to whoever subscribes to me (best for non-humans)'),
-                                               ($this->arg('autosubscribe')) ? $this->boolean('autosubscribe') : $user->autosubscribe);
-
-               common_submit('save', _('Save'));
-
-               common_element_end('form');
-
-
-       }
-
-       function show_avatar_form() {
-
-               $user = common_current_user();
-               $profile = $user->getProfile();
-
-               if (!$profile) {
-                       common_log_db_error($user, 'SELECT', __FILE__);
-                       $this->server_error(_('User without matching profile'));
-                       return;
-               }
-               
-               $original = $profile->getOriginalAvatar();
-
-
-               common_element_start('form', array('enctype' => 'multipart/form-data',
-                                                                                  'method' => 'POST',
-                                                                                  'id' => 'avatar',
-                                                                                  'action' =>
-                                                                                  common_local_url('profilesettings')));
-               common_hidden('token', common_session_token());
-
-               if ($original) {
-                       common_element('img', array('src' => $original->url,
-                                                                               'class' => 'avatar original',
-                                                                               'width' => $original->width,
-                                                                               'height' => $original->height,
-                                                                               'alt' => $user->nickname));
-               }
-
-               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-
-               if ($avatar) {
-                       common_element('img', array('src' => $avatar->url,
-                                                                               'class' => 'avatar profile',
-                                                                               'width' => AVATAR_PROFILE_SIZE,
-                                                                               'height' => AVATAR_PROFILE_SIZE,
-                                                                               'alt' => $user->nickname));
-               }
-
-
-               common_element('input', array('name' => 'MAX_FILE_SIZE',
-                                                                         'type' => 'hidden',
-                                                                         'id' => 'MAX_FILE_SIZE',
-                                                                         'value' => MAX_AVATAR_SIZE));
-
-               common_element_start('p');
-
-
-               common_element('input', array('name' => 'avatarfile',
-                                                                         'type' => 'file',
-                                                                         'id' => 'avatarfile'));
-               common_element_end('p');
-
-               common_submit('upload', _('Upload'));
-               common_element_end('form');
-
-       }
-
-       function show_password_form() {
-
-               $user = common_current_user();
-               common_element_start('form', array('method' => 'POST',
-                                                                                  'id' => 'password',
-                                                                                  'action' =>
-                                                                                  common_local_url('profilesettings')));
-
-               common_hidden('token', common_session_token());
-
-               # Users who logged in with OpenID won't have a pwd
-               if ($user->password) {
-                       common_password('oldpassword', _('Old password'));
-               }
-               common_password('newpassword', _('New password'),
-                                               _('6 or more characters'));
-               common_password('confirm', _('Confirm'),
-                                               _('same as password above'));
-               common_submit('changepass', _('Change'));
-               common_element_end('form');
-       }
-
-       function save_profile() {
-               $nickname = $this->trimmed('nickname');
-               $fullname = $this->trimmed('fullname');
-               $homepage = $this->trimmed('homepage');
-               $bio = $this->trimmed('bio');
-               $location = $this->trimmed('location');
-               $autosubscribe = $this->boolean('autosubscribe');
-               $language = $this->trimmed('language');
-               $timezone = $this->trimmed('timezone');
-               $tagstring = $this->trimmed('tags');
-               
-               # Some validation
-
-               if (!Validate::string($nickname, array('min_length' => 1,
-                                                                                          'max_length' => 64,
-                                                                                          'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
-                       $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
-                       return;
-               } else if (!User::allowed_nickname($nickname)) {
-                       $this->show_form(_('Not a valid nickname.'));
-                       return;
-               } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
-                                  !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) {
-                       $this->show_form(_('Homepage is not a valid URL.'));
-                       return;
-               } else if (!is_null($fullname) && strlen($fullname) > 255) {
-                       $this->show_form(_('Full name is too long (max 255 chars).'));
-                       return;
-               } else if (!is_null($bio) && strlen($bio) > 140) {
-                       $this->show_form(_('Bio is too long (max 140 chars).'));
-                       return;
-               } else if (!is_null($location) && strlen($location) > 255) {
-                       $this->show_form(_('Location is too long (max 255 chars).'));
-                       return;
-               }  else if (is_null($timezone) || !in_array($timezone, DateTimeZone::listIdentifiers())) {
-                       $this->show_form(_('Timezone not selected.'));
-                       return;
-               } else if ($this->nickname_exists($nickname)) {
-                       $this->show_form(_('Nickname already in use. Try another one.'));
-                       return;
+    function get_instructions() {
+        return _('You can update your personal profile info here '.
+                  'so people know more about you.');
+    }
+
+    function show_form($msg=NULL, $success=false) {
+        $this->form_header(_('Profile settings'), $msg, $success);
+        $this->show_settings_form();
+        common_element('h2', NULL, _('Avatar'));
+        $this->show_avatar_form();
+        common_element('h2', NULL, _('Change password'));
+        $this->show_password_form();
+//        common_element('h2', NULL, _('Delete my account'));
+//        $this->show_delete_form();
+        common_show_footer();
+    }
+
+    function handle_post() {
+
+        # CSRF protection
+
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        if ($this->arg('save')) {
+            $this->save_profile();
+        } else if ($this->arg('upload')) {
+            $this->upload_avatar();
+        } else if ($this->arg('changepass')) {
+            $this->change_password();
+        }
+
+    }
+
+    function show_settings_form() {
+
+        $user = common_current_user();
+        $profile = $user->getProfile();
+
+        common_element_start('form', array('method' => 'POST',
+                                           'id' => 'profilesettings',
+                                           'action' =>
+                                           common_local_url('profilesettings')));
+        common_hidden('token', common_session_token());
+        
+        # too much common patterns here... abstractable?
+        
+        common_input('nickname', _('Nickname'),
+                     ($this->arg('nickname')) ? $this->arg('nickname') : $profile->nickname,
+                     _('1-64 lowercase letters or numbers, no punctuation or spaces'));
+        common_input('fullname', _('Full name'),
+                     ($this->arg('fullname')) ? $this->arg('fullname') : $profile->fullname);
+        common_input('homepage', _('Homepage'),
+                     ($this->arg('homepage')) ? $this->arg('homepage') : $profile->homepage,
+                     _('URL of your homepage, blog, or profile on another site'));
+        common_textarea('bio', _('Bio'),
+                        ($this->arg('bio')) ? $this->arg('bio') : $profile->bio,
+                        _('Describe yourself and your interests in 140 chars'));
+        common_input('location', _('Location'),
+                     ($this->arg('location')) ? $this->arg('location') : $profile->location,
+                     _('Where you are, like "City, State (or Region), Country"'));
+        common_input('tags', _('Tags'),
+                     ($this->arg('tags')) ? $this->arg('tags') : implode(' ', $user->getSelfTags()),
+                     _('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated'));
+
+        $language = common_language();
+        common_dropdown('language', _('Language'), get_nice_language_list(), _('Preferred language'), TRUE, $language);
+        $timezone = common_timezone();
+        $timezones = array();
+        foreach(DateTimeZone::listIdentifiers() as $k => $v) {
+            $timezones[$v] = $v;
+        }
+        common_dropdown('timezone', _('Timezone'), $timezones, _('What timezone are you normally in?'), TRUE, $timezone);
+
+        common_checkbox('autosubscribe', _('Automatically subscribe to whoever subscribes to me (best for non-humans)'),
+                        ($this->arg('autosubscribe')) ? $this->boolean('autosubscribe') : $user->autosubscribe);
+
+        common_submit('save', _('Save'));
+
+        common_element_end('form');
+
+
+    }
+
+    function show_avatar_form() {
+
+        $user = common_current_user();
+        $profile = $user->getProfile();
+
+        if (!$profile) {
+            common_log_db_error($user, 'SELECT', __FILE__);
+            $this->server_error(_('User without matching profile'));
+            return;
+        }
+        
+        $original = $profile->getOriginalAvatar();
+
+
+        common_element_start('form', array('enctype' => 'multipart/form-data',
+                                           'method' => 'POST',
+                                           'id' => 'avatar',
+                                           'action' =>
+                                           common_local_url('profilesettings')));
+        common_hidden('token', common_session_token());
+
+        if ($original) {
+            common_element('img', array('src' => $original->url,
+                                        'class' => 'avatar original',
+                                        'width' => $original->width,
+                                        'height' => $original->height,
+                                        'alt' => $user->nickname));
+        }
+
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+
+        if ($avatar) {
+            common_element('img', array('src' => $avatar->url,
+                                        'class' => 'avatar profile',
+                                        'width' => AVATAR_PROFILE_SIZE,
+                                        'height' => AVATAR_PROFILE_SIZE,
+                                        'alt' => $user->nickname));
+        }
+
+
+        common_element('input', array('name' => 'MAX_FILE_SIZE',
+                                      'type' => 'hidden',
+                                      'id' => 'MAX_FILE_SIZE',
+                                      'value' => MAX_AVATAR_SIZE));
+
+        common_element_start('p');
+
+
+        common_element('input', array('name' => 'avatarfile',
+                                      'type' => 'file',
+                                      'id' => 'avatarfile'));
+        common_element_end('p');
+
+        common_submit('upload', _('Upload'));
+        common_element_end('form');
+
+    }
+
+    function show_password_form() {
+
+        $user = common_current_user();
+        common_element_start('form', array('method' => 'POST',
+                                           'id' => 'password',
+                                           'action' =>
+                                           common_local_url('profilesettings')));
+
+        common_hidden('token', common_session_token());
+
+        # Users who logged in with OpenID won't have a pwd
+        if ($user->password) {
+            common_password('oldpassword', _('Old password'));
+        }
+        common_password('newpassword', _('New password'),
+                        _('6 or more characters'));
+        common_password('confirm', _('Confirm'),
+                        _('same as password above'));
+        common_submit('changepass', _('Change'));
+        common_element_end('form');
+    }
+
+    function save_profile() {
+        $nickname = $this->trimmed('nickname');
+        $fullname = $this->trimmed('fullname');
+        $homepage = $this->trimmed('homepage');
+        $bio = $this->trimmed('bio');
+        $location = $this->trimmed('location');
+        $autosubscribe = $this->boolean('autosubscribe');
+        $language = $this->trimmed('language');
+        $timezone = $this->trimmed('timezone');
+        $tagstring = $this->trimmed('tags');
+        
+        # Some validation
+
+        if (!Validate::string($nickname, array('min_length' => 1,
+                                               'max_length' => 64,
+                                               'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+            $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
+            return;
+        } else if (!User::allowed_nickname($nickname)) {
+            $this->show_form(_('Not a valid nickname.'));
+            return;
+        } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
+                   !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) {
+            $this->show_form(_('Homepage is not a valid URL.'));
+            return;
+        } else if (!is_null($fullname) && strlen($fullname) > 255) {
+            $this->show_form(_('Full name is too long (max 255 chars).'));
+            return;
+        } else if (!is_null($bio) && strlen($bio) > 140) {
+            $this->show_form(_('Bio is too long (max 140 chars).'));
+            return;
+        } else if (!is_null($location) && strlen($location) > 255) {
+            $this->show_form(_('Location is too long (max 255 chars).'));
+            return;
+        }  else if (is_null($timezone) || !in_array($timezone, DateTimeZone::listIdentifiers())) {
+            $this->show_form(_('Timezone not selected.'));
+            return;
+        } else if ($this->nickname_exists($nickname)) {
+            $this->show_form(_('Nickname already in use. Try another one.'));
+            return;
         } else if (!is_null($language) && strlen($language) > 50) {
-               $this->show_form(_('Language is too long (max 50 chars).'));
-                       return;
-               }
-
-               if ($tagstring) {
-                       $tags = array_map('common_canonical_tag', preg_split('/[\s,]+/', $tagstring));
-               } else {
-                       $tags = array();
-               }
-                       
-               foreach ($tags as $tag) {
-                       if (!common_valid_profile_tag($tag)) {
-                               $this->show_form(sprintf(_('Invalid tag: "%s"'), $tag));
-                               return;
-                       }
-               }
-               
-               $user = common_current_user();
-
-               $user->query('BEGIN');
-
-               if ($user->nickname != $nickname ||
-                       $user->language != $language ||
-                       $user->timezone != $timezone) {
-
-                       common_debug('Updating user nickname from ' . $user->nickname . ' to ' . $nickname,
-                                                __FILE__);
-                       common_debug('Updating user language from ' . $user->language . ' to ' . $language,
-                                                __FILE__);
-                       common_debug('Updating user timezone from ' . $user->timezone . ' to ' . $timezone,
-                                                __FILE__);
-
-                       $original = clone($user);
-
-                       $user->nickname = $nickname;
-                       $user->language = $language;
-                       $user->timezone = $timezone;
-
-                       $result = $user->updateKeys($original);
-
-                       if ($result === FALSE) {
-                               common_log_db_error($user, 'UPDATE', __FILE__);
-                               common_server_error(_('Couldn\'t update user.'));
-                               return;
-                       } else {
-                               # Re-initialize language environment if it changed
-                               common_init_language();
-                       }
-               }
-
-               # XXX: XOR
-
-               if ($user->autosubscribe ^ $autosubscribe) {
-
-                       $original = clone($user);
-
-                       $user->autosubscribe = $autosubscribe;
-
-                       $result = $user->update($original);
-
-                       if ($result === FALSE) {
-                               common_log_db_error($user, 'UPDATE', __FILE__);
-                               common_server_error(_('Couldn\'t update user for autosubscribe.'));
-                               return;
-                       }
-               }
-
-               $profile = $user->getProfile();
-
-               $orig_profile = clone($profile);
-
-               $profile->nickname = $user->nickname;
-               $profile->fullname = $fullname;
-               $profile->homepage = $homepage;
-               $profile->bio = $bio;
-               $profile->location = $location;
-               $profile->profileurl = common_profile_url($nickname);
-
-               common_debug('Old profile: ' . common_log_objstring($orig_profile), __FILE__);
-               common_debug('New profile: ' . common_log_objstring($profile), __FILE__);
-
-               $result = $profile->update($orig_profile);
-
-               if (!$result) {
-                       common_log_db_error($profile, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t save profile.'));
-                       return;
-               }
-
-               # Set the user tags
-               
-               $result = $user->setSelfTags($tags);
-
-               if (!$result) {
-                       common_server_error(_('Couldn\'t save tags.'));
-                       return;
-               }
-               
-               $user->query('COMMIT');
-
-               common_broadcast_profile($profile);
-
-               $this->show_form(_('Settings saved.'), TRUE);
-       }
-
-
-       function upload_avatar() {
-               switch ($_FILES['avatarfile']['error']) {
-                case UPLOAD_ERR_OK: # success, jump out
-                       break;
-                case UPLOAD_ERR_INI_SIZE:
-                case UPLOAD_ERR_FORM_SIZE:
-                       $this->show_form(_('That file is too big.'));
-                       return;
-                case UPLOAD_ERR_PARTIAL:
-                       @unlink($_FILES['avatarfile']['tmp_name']);
-                       $this->show_form(_('Partial upload.'));
-                       return;
-                default:
-                       $this->show_form(_('System error uploading file.'));
-                       return;
-               }
-
-               $info = @getimagesize($_FILES['avatarfile']['tmp_name']);
-
-               if (!$info) {
-                       @unlink($_FILES['avatarfile']['tmp_name']);
-                       $this->show_form(_('Not an image or corrupt file.'));
-                       return;
-               }
-
-               switch ($info[2]) {
-                case IMAGETYPE_GIF:
-                case IMAGETYPE_JPEG:
-                case IMAGETYPE_PNG:
-                       break;
-                default:
-                       $this->show_form(_('Unsupported image file format.'));
-                       return;
-               }
-
-               $user = common_current_user();
-               $profile = $user->getProfile();
-
-               if ($profile->setOriginal($_FILES['avatarfile']['tmp_name'])) {
-                       $this->show_form(_('Avatar updated.'), true);
-               } else {
-                       $this->show_form(_('Failed updating avatar.'));
-               }
-
-               @unlink($_FILES['avatarfile']['tmp_name']);
-       }
-
-       function nickname_exists($nickname) {
-               $user = common_current_user();
-               $other = User::staticGet('nickname', $nickname);
-               if (!$other) {
-                       return false;
-               } else {
-                       return $other->id != $user->id;
-               }
-       }
-
-       function change_password() {
-
-               $user = common_current_user();
-               assert(!is_null($user)); # should already be checked
-
-               # FIXME: scrub input
-
-               $newpassword = $this->arg('newpassword');
-               $confirm = $this->arg('confirm');
-               $token = $this->arg('token');
-
-               if (0 != strcmp($newpassword, $confirm)) {
-                       $this->show_form(_('Passwords don\'t match.'));
-                       return;
-               }
-
-               if ($user->password) {
-                       $oldpassword = $this->arg('oldpassword');
-
-                       if (!common_check_user($user->nickname, $oldpassword)) {
-                               $this->show_form(_('Incorrect old password'));
-                               return;
-                       }
-               }
-
-               $original = clone($user);
-
-               $user->password = common_munge_password($newpassword, $user->id);
-
-               $val = $user->validate();
-               if ($val !== TRUE) {
-                       $this->show_form(_('Error saving user; invalid.'));
-                       return;
-               }
-
-               if (!$user->update($original)) {
-                       common_server_error(_('Can\'t save new password.'));
-                       return;
-               }
-
-               $this->show_form(_('Password saved.'), true);
-       }
+            $this->show_form(_('Language is too long (max 50 chars).'));
+            return;
+        }
+
+        if ($tagstring) {
+            $tags = array_map('common_canonical_tag', preg_split('/[\s,]+/', $tagstring));
+        } else {
+            $tags = array();
+        }
+            
+        foreach ($tags as $tag) {
+            if (!common_valid_profile_tag($tag)) {
+                $this->show_form(sprintf(_('Invalid tag: "%s"'), $tag));
+                return;
+            }
+        }
+        
+        $user = common_current_user();
+
+        $user->query('BEGIN');
+
+        if ($user->nickname != $nickname ||
+            $user->language != $language ||
+            $user->timezone != $timezone) {
+
+            common_debug('Updating user nickname from ' . $user->nickname . ' to ' . $nickname,
+                         __FILE__);
+            common_debug('Updating user language from ' . $user->language . ' to ' . $language,
+                         __FILE__);
+            common_debug('Updating user timezone from ' . $user->timezone . ' to ' . $timezone,
+                         __FILE__);
+
+            $original = clone($user);
+
+            $user->nickname = $nickname;
+            $user->language = $language;
+            $user->timezone = $timezone;
+
+            $result = $user->updateKeys($original);
+
+            if ($result === FALSE) {
+                common_log_db_error($user, 'UPDATE', __FILE__);
+                common_server_error(_('Couldn\'t update user.'));
+                return;
+            } else {
+                # Re-initialize language environment if it changed
+                common_init_language();
+            }
+        }
+
+        # XXX: XOR
+
+        if ($user->autosubscribe ^ $autosubscribe) {
+
+            $original = clone($user);
+
+            $user->autosubscribe = $autosubscribe;
+
+            $result = $user->update($original);
+
+            if ($result === FALSE) {
+                common_log_db_error($user, 'UPDATE', __FILE__);
+                common_server_error(_('Couldn\'t update user for autosubscribe.'));
+                return;
+            }
+        }
+
+        $profile = $user->getProfile();
+
+        $orig_profile = clone($profile);
+
+        $profile->nickname = $user->nickname;
+        $profile->fullname = $fullname;
+        $profile->homepage = $homepage;
+        $profile->bio = $bio;
+        $profile->location = $location;
+        $profile->profileurl = common_profile_url($nickname);
+
+        common_debug('Old profile: ' . common_log_objstring($orig_profile), __FILE__);
+        common_debug('New profile: ' . common_log_objstring($profile), __FILE__);
+
+        $result = $profile->update($orig_profile);
+
+        if (!$result) {
+            common_log_db_error($profile, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t save profile.'));
+            return;
+        }
+
+        # Set the user tags
+        
+        $result = $user->setSelfTags($tags);
+
+        if (!$result) {
+            common_server_error(_('Couldn\'t save tags.'));
+            return;
+        }
+        
+        $user->query('COMMIT');
+
+        common_broadcast_profile($profile);
+
+        $this->show_form(_('Settings saved.'), TRUE);
+    }
+
+
+    function upload_avatar() {
+        switch ($_FILES['avatarfile']['error']) {
+         case UPLOAD_ERR_OK: # success, jump out
+            break;
+         case UPLOAD_ERR_INI_SIZE:
+         case UPLOAD_ERR_FORM_SIZE:
+            $this->show_form(_('That file is too big.'));
+            return;
+         case UPLOAD_ERR_PARTIAL:
+            @unlink($_FILES['avatarfile']['tmp_name']);
+            $this->show_form(_('Partial upload.'));
+            return;
+         default:
+            $this->show_form(_('System error uploading file.'));
+            return;
+        }
+
+        $info = @getimagesize($_FILES['avatarfile']['tmp_name']);
+
+        if (!$info) {
+            @unlink($_FILES['avatarfile']['tmp_name']);
+            $this->show_form(_('Not an image or corrupt file.'));
+            return;
+        }
+
+        switch ($info[2]) {
+         case IMAGETYPE_GIF:
+         case IMAGETYPE_JPEG:
+         case IMAGETYPE_PNG:
+            break;
+         default:
+            $this->show_form(_('Unsupported image file format.'));
+            return;
+        }
+
+        $user = common_current_user();
+        $profile = $user->getProfile();
+
+        if ($profile->setOriginal($_FILES['avatarfile']['tmp_name'])) {
+            $this->show_form(_('Avatar updated.'), true);
+        } else {
+            $this->show_form(_('Failed updating avatar.'));
+        }
+
+        @unlink($_FILES['avatarfile']['tmp_name']);
+    }
+
+    function nickname_exists($nickname) {
+        $user = common_current_user();
+        $other = User::staticGet('nickname', $nickname);
+        if (!$other) {
+            return false;
+        } else {
+            return $other->id != $user->id;
+        }
+    }
+
+    function change_password() {
+
+        $user = common_current_user();
+        assert(!is_null($user)); # should already be checked
+
+        # FIXME: scrub input
+
+        $newpassword = $this->arg('newpassword');
+        $confirm = $this->arg('confirm');
+        $token = $this->arg('token');
+
+        if (0 != strcmp($newpassword, $confirm)) {
+            $this->show_form(_('Passwords don\'t match.'));
+            return;
+        }
+
+        if ($user->password) {
+            $oldpassword = $this->arg('oldpassword');
+
+            if (!common_check_user($user->nickname, $oldpassword)) {
+                $this->show_form(_('Incorrect old password'));
+                return;
+            }
+        }
+
+        $original = clone($user);
+
+        $user->password = common_munge_password($newpassword, $user->id);
+
+        $val = $user->validate();
+        if ($val !== TRUE) {
+            $this->show_form(_('Error saving user; invalid.'));
+            return;
+        }
+
+        if (!$user->update($original)) {
+            common_server_error(_('Can\'t save new password.'));
+            return;
+        }
+
+        $this->show_form(_('Password saved.'), true);
+    }
 }
index 218f801945d6048a2fab29464ae3e641649971ea..422e4bc98c7fdc815bf80a279eefb48a4dcb63f9 100644 (file)
@@ -23,77 +23,77 @@ require_once(INSTALLDIR.'/lib/stream.php');
 
 class PublicAction extends StreamAction {
 
-       function handle($args) {
-               parent::handle($args);
-
-               $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
-
-               header('X-XRDS-Location: '. common_local_url('publicxrds'));
-
-               common_show_header(_('Public timeline'),
-                                                  array($this, 'show_header'), NULL,
-                                                  array($this, 'show_top'));
-
-               # XXX: Public sidebar here?
-
-               $this->show_notices($page);
-
-               common_show_footer();
-       }
-
-       function show_top() {
-               if (common_logged_in()) {
-                       common_notice_form('public');
-               } else {
-                       $instr = $this->get_instructions();
-                       $output = common_markup_to_html($instr);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-               }
-
-               $this->public_views_menu();
-
-               $this->show_feeds_list(array(0=>array('href'=>common_local_url('publicrss'),
-                                                                                         'type' => 'rss',
-                                                                                         'version' => 'RSS 1.0',
-                                                                                         'item' => 'publicrss'),
-                                                                        1=>array('href'=>common_local_url('publicatom'),
-                                                                                         'type' => 'atom',
-                                                                                         'version' => 'Atom 1.0',
-                                                                                         'item' => 'publicatom')));
-       }
-
-       function get_instructions() {
-               return _('This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
-                                'based on the Free Software [Laconica](http://laconi.ca/) tool. ' .
-                                '[Join now](%%action.register%%) to share notices about yourself with friends, family, and colleagues! ([Read more](%%doc.help%%))');
-       }
-
-       function show_header() {
-               common_element('link', array('rel' => 'alternate',
-                                                                        'href' => common_local_url('publicrss'),
-                                                                        'type' => 'application/rss+xml',
-                                                                        'title' => _('Public Stream Feed')));
-               # for client side of OpenID authentication
-               common_element('meta', array('http-equiv' => 'X-XRDS-Location',
-                                                                        'content' => common_local_url('publicxrds')));
-       }
-
-       function show_notices($page) {
-
-               $cnt = 0;
-               $notice = Notice::publicStream(($page-1)*NOTICES_PER_PAGE,
-                                                                          NOTICES_PER_PAGE + 1);
-
-               if (!$notice) {
+    function handle($args) {
+        parent::handle($args);
+
+        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+
+        header('X-XRDS-Location: '. common_local_url('publicxrds'));
+
+        common_show_header(_('Public timeline'),
+                           array($this, 'show_header'), NULL,
+                           array($this, 'show_top'));
+
+        # XXX: Public sidebar here?
+
+        $this->show_notices($page);
+
+        common_show_footer();
+    }
+
+    function show_top() {
+        if (common_logged_in()) {
+            common_notice_form('public');
+        } else {
+            $instr = $this->get_instructions();
+            $output = common_markup_to_html($instr);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('div');
+        }
+
+        $this->public_views_menu();
+
+        $this->show_feeds_list(array(0=>array('href'=>common_local_url('publicrss'),
+                                              'type' => 'rss',
+                                              'version' => 'RSS 1.0',
+                                              'item' => 'publicrss'),
+                                     1=>array('href'=>common_local_url('publicatom'),
+                                              'type' => 'atom',
+                                              'version' => 'Atom 1.0',
+                                              'item' => 'publicatom')));
+    }
+
+    function get_instructions() {
+        return _('This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
+                 'based on the Free Software [Laconica](http://laconi.ca/) tool. ' .
+                 '[Join now](%%action.register%%) to share notices about yourself with friends, family, and colleagues! ([Read more](%%doc.help%%))');
+    }
+
+    function show_header() {
+        common_element('link', array('rel' => 'alternate',
+                                     'href' => common_local_url('publicrss'),
+                                     'type' => 'application/rss+xml',
+                                     'title' => _('Public Stream Feed')));
+        # for client side of OpenID authentication
+        common_element('meta', array('http-equiv' => 'X-XRDS-Location',
+                                     'content' => common_local_url('publicxrds')));
+    }
+
+    function show_notices($page) {
+
+        $cnt = 0;
+        $notice = Notice::publicStream(($page-1)*NOTICES_PER_PAGE,
+                                       NOTICES_PER_PAGE + 1);
+
+        if (!$notice) {
             $this->server_error(_('Could not retrieve public stream.'));
             return;
-               }
+        }
 
         $cnt = $this->show_notice_list($notice);
 
-               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'public');
-       }
+        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'public');
+    }
 }
index 1ab6a8be06aa4214397ce5844a5d536e23fed535..fa86de1d96edaaa8167f59676effaf109bd63d1e 100644 (file)
@@ -25,33 +25,33 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class PublicrssAction extends Rss10Action {
 
-       function init() {
-               return true;
-       }
-
-       function get_notices($limit=0) {
-               
-               $notices = array();
-               
-               $notice = Notice::publicStream(0, ($limit == 0) ? 48 : $limit);
-               
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
-               
-               return $notices;
-       }
-
-       function get_channel() {
-               global $config;
-               $c = array('url' => common_local_url('publicrss'),
-                                  'title' => sprintf(_('%s Public Stream'), $config['site']['name']),
-                                  'link' => common_local_url('public'),
-                                  'description' => sprintf(_('All updates for %s'), $config['site']['name']));
-               return $c;
-       }
-
-       function get_image() {
-               return NULL;
-       }
+    function init() {
+        return true;
+    }
+
+    function get_notices($limit=0) {
+        
+        $notices = array();
+        
+        $notice = Notice::publicStream(0, ($limit == 0) ? 48 : $limit);
+        
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
+        
+        return $notices;
+    }
+
+    function get_channel() {
+        global $config;
+        $c = array('url' => common_local_url('publicrss'),
+                   'title' => sprintf(_('%s Public Stream'), $config['site']['name']),
+                   'link' => common_local_url('public'),
+                   'description' => sprintf(_('All updates for %s'), $config['site']['name']));
+        return $c;
+    }
+
+    function get_image() {
+        return NULL;
+    }
 }
\ No newline at end of file
index 951434c8783015f114079d75fd038cfd85e75522..ffd65c8c94f13228ce28d84dfe6b5d3a5028def7 100644 (file)
@@ -25,55 +25,55 @@ require_once(INSTALLDIR.'/lib/openid.php');
 
 class PublicxrdsAction extends Action {
 
-       function is_readonly() {
-               return true;
-       }
+    function is_readonly() {
+        return true;
+    }
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               header('Content-Type: application/xrds+xml');
+        header('Content-Type: application/xrds+xml');
 
-               common_start_xml();
-               common_element_start('XRDS', array('xmlns' => 'xri://$xrds'));
+        common_start_xml();
+        common_element_start('XRDS', array('xmlns' => 'xri://$xrds'));
 
-               common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
-                                                                                 'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
-                                                                                 'version' => '2.0'));
+        common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
+                                          'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
+                                          'version' => '2.0'));
 
-               common_element('Type', NULL, 'xri://$xrds*simple');
+        common_element('Type', NULL, 'xri://$xrds*simple');
 
-               foreach (array('finishopenidlogin', 'finishaddopenid', 'finishimmediate') as $finish) {
-                       $this->show_service(Auth_OpenID_RP_RETURN_TO_URL_TYPE,
-                                                               common_local_url($finish));
-               }
+        foreach (array('finishopenidlogin', 'finishaddopenid', 'finishimmediate') as $finish) {
+            $this->show_service(Auth_OpenID_RP_RETURN_TO_URL_TYPE,
+                                common_local_url($finish));
+        }
 
-               common_element_end('XRD');
+        common_element_end('XRD');
 
-               common_element_end('XRDS');
-               common_end_xml();
-       }
+        common_element_end('XRDS');
+        common_end_xml();
+    }
 
-       function show_service($type, $uri, $params=NULL, $sigs=NULL, $localId=NULL) {
-               common_element_start('Service');
-               if ($uri) {
-                       common_element('URI', NULL, $uri);
-               }
-               common_element('Type', NULL, $type);
-               if ($params) {
-                       foreach ($params as $param) {
-                               common_element('Type', NULL, $param);
-                       }
-               }
-               if ($sigs) {
-                       foreach ($sigs as $sig) {
-                               common_element('Type', NULL, $sig);
-                       }
-               }
-               if ($localId) {
-                       common_element('LocalID', NULL, $localId);
-               }
-               common_element_end('Service');
-       }
+    function show_service($type, $uri, $params=NULL, $sigs=NULL, $localId=NULL) {
+        common_element_start('Service');
+        if ($uri) {
+            common_element('URI', NULL, $uri);
+        }
+        common_element('Type', NULL, $type);
+        if ($params) {
+            foreach ($params as $param) {
+                common_element('Type', NULL, $param);
+            }
+        }
+        if ($sigs) {
+            foreach ($sigs as $sig) {
+                common_element('Type', NULL, $sig);
+            }
+        }
+        if ($localId) {
+            common_element('LocalID', NULL, $localId);
+        }
+        common_element_end('Service');
+    }
 }
\ No newline at end of file
index 38c42f41d1b056ac303f723dd324ce7391d3fd82..1263fee9b41a912036f0f5e742faa791cdb5c57c 100644 (file)
@@ -28,304 +28,304 @@ class RecoverpasswordAction extends Action {
     function handle($args) {
         parent::handle($args);
         if (common_logged_in()) {
-                       $this->client_error(_('You are already logged in!'));
+            $this->client_error(_('You are already logged in!'));
             return;
         } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-               if ($this->arg('recover')) {
-               $this->recover_password();
+            if ($this->arg('recover')) {
+                $this->recover_password();
             } else if ($this->arg('reset')) {
-               $this->reset_password();
-                       } else {
-                               $this->client_error(_('Unexpected form submission.'));
-                       }
-               } else {
-                       if ($this->trimmed('code')) {
-                       $this->check_code();
-               } else {
-                       $this->show_form();
-                       }
-               }
-       }
-
-       function check_code() {
-
-               $code = $this->trimmed('code');
-               $confirm = Confirm_address::staticGet('code', $code);
-
-               if (!$confirm) {
-                       $this->client_error(_('No such recovery code.'));
-                       return;
-               }
-               if ($confirm->address_type != 'recover') {
-                       $this->client_error(_('Not a recovery code.'));
-                       return;
-               }
-
-               $user = User::staticGet($confirm->user_id);
-
-               if (!$user) {
-                       $this->server_error(_('Recovery code for unknown user.'));
-                       return;
-               }
-
-               $touched = strtotime($confirm->modified);
-               $email = $confirm->address;
-
-               # Burn this code
-
-               $result = $confirm->delete();
-
-               if (!$result) {
-                       common_log_db_error($confirm, 'DELETE', __FILE__);
-                       common_server_error(_('Error with confirmation code.'));
-                       return;
-               }
-
-               # These should be reaped, but for now we just check mod time
-               # Note: it's still deleted; let's avoid a second attempt!
-
-               if ((time() - $touched) > MAX_RECOVERY_TIME) {
-                       common_log(LOG_WARNING, 
-                                          'Attempted redemption on recovery code ' .
-                                          'that is ' . $touched . ' seconds old. ');
-                       $this->client_error(_('This confirmation code is too old. ' .
-                                              'Please start again.'));
-                       return;
-               }
-
-               # If we used an outstanding confirmation to send the email,
-               # it's been confirmed at this point.
-
-               if (!$user->email) {
-                       $orig = clone($user);
-                       $user->email = $email;
-                       $result = $user->updateKeys($orig);
-                       if (!$result) {
-                               common_log_db_error($user, 'UPDATE', __FILE__);
-                               $this->server_error(_('Could not update user with confirmed email address.'));
-                               return;
-                       }
-               }
-
-               # Success!
-
-               $this->set_temp_user($user);
-               $this->show_password_form();
-       }
-
-       function set_temp_user(&$user) {
-               common_ensure_session();
-               $_SESSION['tempuser'] = $user->id;
-       }
-
-       function get_temp_user() {
-               common_ensure_session();
-               $user_id = $_SESSION['tempuser'];
-               if ($user_id) {
-                       $user = User::staticGet($user_id);
-               }
-               return $user;
-       }
-
-       function clear_temp_user() {
-               common_ensure_session();
-               unset($_SESSION['tempuser']);
-       }
-
-       function show_top($msg=NULL) {
-               if ($msg) {
+                $this->reset_password();
+            } else {
+                $this->client_error(_('Unexpected form submission.'));
+            }
+        } else {
+            if ($this->trimmed('code')) {
+                $this->check_code();
+            } else {
+                $this->show_form();
+            }
+        }
+    }
+
+    function check_code() {
+
+        $code = $this->trimmed('code');
+        $confirm = Confirm_address::staticGet('code', $code);
+
+        if (!$confirm) {
+            $this->client_error(_('No such recovery code.'));
+            return;
+        }
+        if ($confirm->address_type != 'recover') {
+            $this->client_error(_('Not a recovery code.'));
+            return;
+        }
+
+        $user = User::staticGet($confirm->user_id);
+
+        if (!$user) {
+            $this->server_error(_('Recovery code for unknown user.'));
+            return;
+        }
+
+        $touched = strtotime($confirm->modified);
+        $email = $confirm->address;
+
+        # Burn this code
+
+        $result = $confirm->delete();
+
+        if (!$result) {
+            common_log_db_error($confirm, 'DELETE', __FILE__);
+            common_server_error(_('Error with confirmation code.'));
+            return;
+        }
+
+        # These should be reaped, but for now we just check mod time
+        # Note: it's still deleted; let's avoid a second attempt!
+
+        if ((time() - $touched) > MAX_RECOVERY_TIME) {
+            common_log(LOG_WARNING, 
+                       'Attempted redemption on recovery code ' .
+                       'that is ' . $touched . ' seconds old. ');
+            $this->client_error(_('This confirmation code is too old. ' .
+                                   'Please start again.'));
+            return;
+        }
+
+        # If we used an outstanding confirmation to send the email,
+        # it's been confirmed at this point.
+
+        if (!$user->email) {
+            $orig = clone($user);
+            $user->email = $email;
+            $result = $user->updateKeys($orig);
+            if (!$result) {
+                common_log_db_error($user, 'UPDATE', __FILE__);
+                $this->server_error(_('Could not update user with confirmed email address.'));
+                return;
+            }
+        }
+
+        # Success!
+
+        $this->set_temp_user($user);
+        $this->show_password_form();
+    }
+
+    function set_temp_user(&$user) {
+        common_ensure_session();
+        $_SESSION['tempuser'] = $user->id;
+    }
+
+    function get_temp_user() {
+        common_ensure_session();
+        $user_id = $_SESSION['tempuser'];
+        if ($user_id) {
+            $user = User::staticGet($user_id);
+        }
+        return $user;
+    }
+
+    function clear_temp_user() {
+        common_ensure_session();
+        unset($_SESSION['tempuser']);
+    }
+
+    function show_top($msg=NULL) {
+        if ($msg) {
             common_element('div', 'error', $msg);
-               } else {
-                       common_element_start('div', 'instructions');
-                       common_element('p', NULL, 
-                                                  _('If you\'ve forgotten or lost your' .
-                                                     ' password, you can get a new one sent to' .
-                                                     ' the email address you have stored ' .
-                                                     ' in your account.'));
-                       common_element_end('div');
-               }
-       }
-
-       function show_password_top($msg=NULL) {
-               if ($msg) {
+        } else {
+            common_element_start('div', 'instructions');
+            common_element('p', NULL, 
+                           _('If you\'ve forgotten or lost your' .
+                              ' password, you can get a new one sent to' .
+                              ' the email address you have stored ' .
+                              ' in your account.'));
+            common_element_end('div');
+        }
+    }
+
+    function show_password_top($msg=NULL) {
+        if ($msg) {
             common_element('div', 'error', $msg);
-               } else {
-                       common_element('div', 'instructions',
-                                                  _('You\'ve been identified. Enter a ' .
-                                                     ' new password below. '));
-               }
-       }
-
-       function show_form($msg=NULL) {
-
-               common_show_header(_('Recover password'), NULL,
-               $msg, array($this, 'show_top'));
-
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'recoverpassword',
-                                                                                  'action' => common_local_url('recoverpassword')));
-               common_input('nicknameoremail', _('Nickname or email'),
-                                        $this->trimmed('nicknameoremail'),
-                            _('Your nickname on this server, ' .
-                               'or your registered email address.'));
-               common_submit('recover', _('Recover'));
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function show_password_form($msg=NULL) {
-
-               common_show_header(_('Reset password'), NULL,
-               $msg, array($this, 'show_password_top'));
-
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'recoverpassword',
-                                                                                  'action' => common_local_url('recoverpassword')));
-               common_hidden('token', common_session_token());
-               common_password('newpassword', _('New password'),
-                                               _('6 or more characters, and don\'t forget it!'));
-               common_password('confirm', _('Confirm'),
-                                               _('Same as password above'));
-               common_submit('reset', _('Reset'));
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function recover_password() {
-               $nore = $this->trimmed('nicknameoremail');
-               if (!$nore) {
-                       $this->show_form(_('Enter a nickname or email address.'));
-                       return;
-               }
-
-               $user = User::staticGet('email', common_canonical_email($nore));
-
-               if (!$user) {
-                       $user = User::staticGet('nickname', common_canonical_nickname($nore));
-               }
-
-               # See if it's an unconfirmed email address
-
-               if (!$user) {
-                       $confirm_email = Confirm_address::staticGet('address', common_canonical_email($nore));
-                       if ($confirm_email && $confirm_email->address_type == 'email') {
-                               $user = User::staticGet($confirm_email->user_id);
-                       }
-               }
-
-               if (!$user) {
-                       $this->show_form(_('No user with that email address or username.'));
-                       return;
-               }
-
-               # Try to get an unconfirmed email address if they used a user name
-
-               if (!$user->email && !$confirm_email) {
-                       $confirm_email = Confirm_address::staticGet('user_id', $user->id);
-                       if ($confirm_email && $confirm_email->address_type != 'email') {
-                               # Skip non-email confirmations
-                               $confirm_email = NULL;
-                       }
-               }
-
-               if (!$user->email && !$confirm_email) {
-                       $this->client_error(_('No registered email address for that user.'));
-                       return;
-               }
-
-               # Success! We have a valid user and a confirmed or unconfirmed email address
-
-               $confirm = new Confirm_address();
-               $confirm->code = common_confirmation_code(128);
-               $confirm->address_type = 'recover';
-               $confirm->user_id = $user->id;
-               $confirm->address = (isset($user->email)) ? $user->email : $confirm_email->address;
-
-               if (!$confirm->insert()) {
-                       common_log_db_error($confirm, 'INSERT', __FILE__);
-                       $this->server_error(_('Error saving address confirmation.'));
-                       return;
-               }
-
-               $body = "Hey, $user->nickname.";
-               $body .= "\n\n";
-               $body .= 'Someone just asked for a new password ' .
-                        'for this account on ' . common_config('site', 'name') . '.';
-               $body .= "\n\n";
-               $body .= 'If it was you, and you want to confirm, use the URL below:';
-               $body .= "\n\n";
-               $body .= "\t".common_local_url('recoverpassword',
-                                                                  array('code' => $confirm->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";
-
-               mail_to_user($user, _('Password recovery requested'), $body, $confirm->address);
-
-               common_show_header(_('Password recovery requested'));
-               common_element('p', NULL,
-                              _('Instructions for recovering your password ' .
-                                 'have been sent to the email address registered to your ' .
-                                 'account.'));
-               common_show_footer();
-       }
-
-       function reset_password() {
-
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               $user = $this->get_temp_user();
-
-               if (!$user) {
-                       $this->client_error(_('Unexpected password reset.'));
-                       return;
-               }
-
-               $newpassword = $this->trimmed('newpassword');
-               $confirm = $this->trimmed('confirm');
-
-               if (!$newpassword || strlen($newpassword) < 6) {
-                       $this->show_password_form(_('Password must be 6 chars or more.'));
-                       return;
-               }
-               if ($newpassword != $confirm) {
-                       $this->show_password_form(_('Password and confirmation do not match.'));
-                       return;
-               }
-
-               # OK, we're ready to go
-
-               $original = clone($user);
-
-               $user->password = common_munge_password($newpassword, $user->id);
-
-               if (!$user->update($original)) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Can\'t save new password.'));
-                       return;
-               }
-
-               $this->clear_temp_user();
-
-               if (!common_set_user($user->nickname)) {
-                       common_server_error(_('Error setting user.'));
-                       return;
-               }
-
-               common_real_login(true);
-
-               common_show_header(_('Password saved.'));
-               common_element('p', NULL, _('New password successfully saved. ' .
-                                            'You are now logged in.'));
-               common_show_footer();
-       }
+        } else {
+            common_element('div', 'instructions',
+                           _('You\'ve been identified. Enter a ' .
+                              ' new password below. '));
+        }
+    }
+
+    function show_form($msg=NULL) {
+
+        common_show_header(_('Recover password'), NULL,
+        $msg, array($this, 'show_top'));
+
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'recoverpassword',
+                                           'action' => common_local_url('recoverpassword')));
+        common_input('nicknameoremail', _('Nickname or email'),
+                     $this->trimmed('nicknameoremail'),
+                     _('Your nickname on this server, ' .
+                        'or your registered email address.'));
+        common_submit('recover', _('Recover'));
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function show_password_form($msg=NULL) {
+
+        common_show_header(_('Reset password'), NULL,
+        $msg, array($this, 'show_password_top'));
+
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'recoverpassword',
+                                           'action' => common_local_url('recoverpassword')));
+        common_hidden('token', common_session_token());
+        common_password('newpassword', _('New password'),
+                        _('6 or more characters, and don\'t forget it!'));
+        common_password('confirm', _('Confirm'),
+                        _('Same as password above'));
+        common_submit('reset', _('Reset'));
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function recover_password() {
+        $nore = $this->trimmed('nicknameoremail');
+        if (!$nore) {
+            $this->show_form(_('Enter a nickname or email address.'));
+            return;
+        }
+
+        $user = User::staticGet('email', common_canonical_email($nore));
+
+        if (!$user) {
+            $user = User::staticGet('nickname', common_canonical_nickname($nore));
+        }
+
+        # See if it's an unconfirmed email address
+
+        if (!$user) {
+            $confirm_email = Confirm_address::staticGet('address', common_canonical_email($nore));
+            if ($confirm_email && $confirm_email->address_type == 'email') {
+                $user = User::staticGet($confirm_email->user_id);
+            }
+        }
+
+        if (!$user) {
+            $this->show_form(_('No user with that email address or username.'));
+            return;
+        }
+
+        # Try to get an unconfirmed email address if they used a user name
+
+        if (!$user->email && !$confirm_email) {
+            $confirm_email = Confirm_address::staticGet('user_id', $user->id);
+            if ($confirm_email && $confirm_email->address_type != 'email') {
+                # Skip non-email confirmations
+                $confirm_email = NULL;
+            }
+        }
+
+        if (!$user->email && !$confirm_email) {
+            $this->client_error(_('No registered email address for that user.'));
+            return;
+        }
+
+        # Success! We have a valid user and a confirmed or unconfirmed email address
+
+        $confirm = new Confirm_address();
+        $confirm->code = common_confirmation_code(128);
+        $confirm->address_type = 'recover';
+        $confirm->user_id = $user->id;
+        $confirm->address = (isset($user->email)) ? $user->email : $confirm_email->address;
+
+        if (!$confirm->insert()) {
+            common_log_db_error($confirm, 'INSERT', __FILE__);
+            $this->server_error(_('Error saving address confirmation.'));
+            return;
+        }
+
+        $body = "Hey, $user->nickname.";
+        $body .= "\n\n";
+        $body .= 'Someone just asked for a new password ' .
+                 'for this account on ' . common_config('site', 'name') . '.';
+        $body .= "\n\n";
+        $body .= 'If it was you, and you want to confirm, use the URL below:';
+        $body .= "\n\n";
+        $body .= "\t".common_local_url('recoverpassword',
+                                   array('code' => $confirm->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";
+
+        mail_to_user($user, _('Password recovery requested'), $body, $confirm->address);
+
+        common_show_header(_('Password recovery requested'));
+        common_element('p', NULL,
+                       _('Instructions for recovering your password ' .
+                          'have been sent to the email address registered to your ' .
+                          'account.'));
+        common_show_footer();
+    }
+
+    function reset_password() {
+
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        $user = $this->get_temp_user();
+
+        if (!$user) {
+            $this->client_error(_('Unexpected password reset.'));
+            return;
+        }
+
+        $newpassword = $this->trimmed('newpassword');
+        $confirm = $this->trimmed('confirm');
+
+        if (!$newpassword || strlen($newpassword) < 6) {
+            $this->show_password_form(_('Password must be 6 chars or more.'));
+            return;
+        }
+        if ($newpassword != $confirm) {
+            $this->show_password_form(_('Password and confirmation do not match.'));
+            return;
+        }
+
+        # OK, we're ready to go
+
+        $original = clone($user);
+
+        $user->password = common_munge_password($newpassword, $user->id);
+
+        if (!$user->update($original)) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Can\'t save new password.'));
+            return;
+        }
+
+        $this->clear_temp_user();
+
+        if (!common_set_user($user->nickname)) {
+            common_server_error(_('Error setting user.'));
+            return;
+        }
+
+        common_real_login(true);
+
+        common_show_header(_('Password saved.'));
+        common_element('p', NULL, _('New password successfully saved. ' .
+                                     'You are now logged in.'));
+        common_show_footer();
+    }
 }
index a22ffca28e8b53b8cecba0419deb3f5722e20a77..011aa3f090c54d78f1d9f92c7d37174b68b25fbc 100644 (file)
@@ -21,242 +21,242 @@ if (!defined('LACONICA')) { exit(1); }
 
 class RegisterAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-
-               if (common_config('site', 'closed')) {
-                       common_user_error(_('Registration not allowed.'));
-               } else if (common_logged_in()) {
-                       common_user_error(_('Already logged in.'));
-               } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $this->try_register();
-               } else {
-                       $this->show_form();
-               }
-       }
-
-       function try_register() {
-
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               $nickname = $this->trimmed('nickname');
-               $email = $this->trimmed('email');
-               $fullname = $this->trimmed('fullname');
-               $homepage = $this->trimmed('homepage');
-               $bio = $this->trimmed('bio');
-               $location = $this->trimmed('location');
-
-               # We don't trim these... whitespace is OK in a password!
-
-               $password = $this->arg('password');
-               $confirm = $this->arg('confirm');
-
-               # invitation code, if any
-
-               $code = $this->trimmed('code');
-
-               if ($code) {
-                       $invite = Invitation::staticGet($code);
-               }
-
-               if (common_config('site', 'inviteonly') && !($code && $invite)) {
-                       $this->client_error(_('Sorry, only invited people can register.'));
-                       return;
-               }
-
-               # Input scrubbing
-
-               $nickname = common_canonical_nickname($nickname);
-               $email = common_canonical_email($email);
-
-               if (!$this->boolean('license')) {
-                       $this->show_form(_('You can\'t register if you don\'t agree to the license.'));
-               } else if ($email && !Validate::email($email, true)) {
-                       $this->show_form(_('Not a valid email address.'));
-               } else if (!Validate::string($nickname, array('min_length' => 1,
-                                                                                                         'max_length' => 64,
-                                                                                                         'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
-                       $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
-               } else if ($this->nickname_exists($nickname)) {
-                       $this->show_form(_('Nickname already in use. Try another one.'));
-               } else if (!User::allowed_nickname($nickname)) {
-                       $this->show_form(_('Not a valid nickname.'));
-               } else if ($this->email_exists($email)) {
-                       $this->show_form(_('Email address already exists.'));
-               } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
-                                  !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) {
-                       $this->show_form(_('Homepage is not a valid URL.'));
-                       return;
-               } else if (!is_null($fullname) && strlen($fullname) > 255) {
-                       $this->show_form(_('Full name is too long (max 255 chars).'));
-                       return;
-               } else if (!is_null($bio) && strlen($bio) > 140) {
-                       $this->show_form(_('Bio is too long (max 140 chars).'));
-                       return;
-               } else if (!is_null($location) && strlen($location) > 255) {
-                       $this->show_form(_('Location is too long (max 255 chars).'));
-                       return;
-               } else if (strlen($password) < 6) {
-                       $this->show_form(_('Password must be 6 or more characters.'));
-                       return;
-               } else if ($password != $confirm) {
-                       $this->show_form(_('Passwords don\'t match.'));
-               } else if ($user = User::register(array('nickname' => $nickname, 'password' => $password, 'email' => $email,
-                                                                                               'fullname' => $fullname, 'homepage' => $homepage, 'bio' => $bio,
-                                                                                               'location' => $location, 'code' => $code))) {
-                       if (!$user) {
-                               $this->show_form(_('Invalid username or password.'));
-                               return;
-                       }
-                       # success!
-                       if (!common_set_user($user)) {
-                               common_server_error(_('Error setting user.'));
-                               return;
-                       }
-                       # this is a real login
-                       common_real_login(true);
-                       if ($this->boolean('rememberme')) {
-                               common_debug('Adding rememberme cookie for ' . $nickname);
-                               common_rememberme($user);
-                       }
-                       # Re-init language env in case it changed (not yet, but soon)
-                       common_init_language();
-                       $this->show_success();
-               } else {
-                       $this->show_form(_('Invalid username or password.'));
-               }
-       }
-
-       # checks if *CANONICAL* nickname exists
-
-       function nickname_exists($nickname) {
-               $user = User::staticGet('nickname', $nickname);
-               return ($user !== false);
-       }
-
-       # checks if *CANONICAL* email exists
-
-       function email_exists($email) {
-               $email = common_canonical_email($email);
-               if (!$email || strlen($email) == 0) {
-                       return false;
-               }
-               $user = User::staticGet('email', $email);
-               return ($user !== false);
-       }
-
-       function show_top($error=NULL) {
-               if ($error) {
-                       common_element('p', 'error', $error);
-               } else {
-                       $instr = common_markup_to_html(_('With this form you can create a new account. ' .
-                                                                                        'You can then post notices and link up to friends and colleagues. '.
-                                                                                        '(Have an [OpenID](http://openid.net/)? ' .
-                                                                                        'Try our [OpenID registration](%%action.openidlogin%%)!)'));
-
-                       common_element_start('div', 'instructions');
-                       common_raw($instr);
-                       common_element_end('div');
-               }
-       }
-
-       function show_form($error=NULL) {
-               global $config;
-
-               $code = $this->trimmed('code');
-
-               if ($code) {
-                       $invite = Invitation::staticGet($code);
-               }
-
-               if (common_config('site', 'inviteonly') && !($code && $invite)) {
-                       $this->client_error(_('Sorry, only invited people can register.'));
-                       return;
-               }
-
-               common_show_header(_('Register'), NULL, $error, array($this, 'show_top'));
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'login',
-                                                                                  'action' => common_local_url('register')));
-
-               common_hidden('token', common_session_token());
-
-               if ($code) {
-                       common_hidden('code', $code);
-               }
-
-               common_input('nickname', _('Nickname'), $this->trimmed('nickname'),
-                                        _('1-64 lowercase letters or numbers, no punctuation or spaces. Required.'));
-               common_password('password', _('Password'),
-                                               _('6 or more characters. Required.'));
-               common_password('confirm', _('Confirm'),
-                                               _('Same as password above. Required.'));
-               if ($invite && $invite->address_type == 'email') {
-                       common_input('email', _('Email'), $invite->address,
-                                        _('Used only for updates, announcements, and password recovery'));
-               } else {
-                       common_input('email', _('Email'), $this->trimmed('email'),
-                                                _('Used only for updates, announcements, and password recovery'));
-               }
-               common_input('fullname', _('Full name'),
-                                        $this->trimmed('fullname'),
-                                         _('Longer name, preferably your "real" name'));
-               common_input('homepage', _('Homepage'),
-                                        $this->trimmed('homepage'),
-                                        _('URL of your homepage, blog, or profile on another site'));
-               common_textarea('bio', _('Bio'),
-                                               $this->trimmed('bio'),
-                                                _('Describe yourself and your interests in 140 chars'));
-               common_input('location', _('Location'),
-                                        $this->trimmed('location'),
-                                        _('Where you are, like "City, State (or Region), Country"'));
-               common_checkbox('rememberme', _('Remember me'),
-                                               $this->boolean('rememberme'),
-                               _('Automatically login in the future; not for shared computers!'));
-               common_element_start('p');
-               $attrs = array('type' => 'checkbox',
-                                          'id' => 'license',
-                                          'name' => 'license',
-                                          'value' => 'true');
-               if ($this->boolean('license')) {
-                       $attrs['checked'] = 'checked';
-               }
-               common_element('input', $attrs);
-           common_text(_('My text and files are available under '));
-               common_element('a', array('href' => $config['license']['url']),
-                                          $config['license']['title']);
-               common_text(_(' except this private data: password, email address, IM address, phone number.'));
-               common_element_end('p');
-               common_submit('submit', _('Register'));
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function show_success() {
-               $nickname = $this->arg('nickname');
-               common_show_header(_('Registration successful'));
-               common_element_start('div', 'success');
-               $instr = sprintf(_('Congratulations, %s! And welcome to %%%%site.name%%%%. From here, you may want to...'. "\n\n" .
-                                                  '* Go to [your profile](%s) and post your first message.' .  "\n" .
-                                                  '* Add a [Jabber/GTalk address](%%%%action.imsettings%%%%) so you can send notices through instant messages.' . "\n" .
-                                                  '* [Search for people](%%%%action.peoplesearch%%%%) that you may know or that share your interests. ' . "\n" .
-                                                  '* Update your [profile settings](%%%%action.profilesettings%%%%) to tell others more about you. ' . "\n" .
-                                                  '* Read over the [online docs](%%%%doc.help%%%%) for features you may have missed. ' . "\n\n" .
-                                                  'Thanks for signing up and we hope you enjoy using this service.'),
-                                                $nickname, common_local_url('showstream', array('nickname' => $nickname)));
-               common_raw(common_markup_to_html($instr));
-               $have_email = $this->trimmed('email');
-               if ($have_email) {
-                       $emailinstr = _('(You should receive a message by email momentarily, with ' .
-                                                       'instructions on how to confirm your email address.)');
-                       common_raw(common_markup_to_html($emailinstr));
-               }
-               common_element_end('div');
-               common_show_footer();
-       }
+    function handle($args) {
+        parent::handle($args);
+
+        if (common_config('site', 'closed')) {
+            common_user_error(_('Registration not allowed.'));
+        } else if (common_logged_in()) {
+            common_user_error(_('Already logged in.'));
+        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->try_register();
+        } else {
+            $this->show_form();
+        }
+    }
+
+    function try_register() {
+
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        $nickname = $this->trimmed('nickname');
+        $email = $this->trimmed('email');
+        $fullname = $this->trimmed('fullname');
+        $homepage = $this->trimmed('homepage');
+        $bio = $this->trimmed('bio');
+        $location = $this->trimmed('location');
+
+        # We don't trim these... whitespace is OK in a password!
+
+        $password = $this->arg('password');
+        $confirm = $this->arg('confirm');
+
+        # invitation code, if any
+
+        $code = $this->trimmed('code');
+
+        if ($code) {
+            $invite = Invitation::staticGet($code);
+        }
+
+        if (common_config('site', 'inviteonly') && !($code && $invite)) {
+            $this->client_error(_('Sorry, only invited people can register.'));
+            return;
+        }
+
+        # Input scrubbing
+
+        $nickname = common_canonical_nickname($nickname);
+        $email = common_canonical_email($email);
+
+        if (!$this->boolean('license')) {
+            $this->show_form(_('You can\'t register if you don\'t agree to the license.'));
+        } else if ($email && !Validate::email($email, true)) {
+            $this->show_form(_('Not a valid email address.'));
+        } else if (!Validate::string($nickname, array('min_length' => 1,
+                                                      'max_length' => 64,
+                                                      'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+            $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
+        } else if ($this->nickname_exists($nickname)) {
+            $this->show_form(_('Nickname already in use. Try another one.'));
+        } else if (!User::allowed_nickname($nickname)) {
+            $this->show_form(_('Not a valid nickname.'));
+        } else if ($this->email_exists($email)) {
+            $this->show_form(_('Email address already exists.'));
+        } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
+                   !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) {
+            $this->show_form(_('Homepage is not a valid URL.'));
+            return;
+        } else if (!is_null($fullname) && strlen($fullname) > 255) {
+            $this->show_form(_('Full name is too long (max 255 chars).'));
+            return;
+        } else if (!is_null($bio) && strlen($bio) > 140) {
+            $this->show_form(_('Bio is too long (max 140 chars).'));
+            return;
+        } else if (!is_null($location) && strlen($location) > 255) {
+            $this->show_form(_('Location is too long (max 255 chars).'));
+            return;
+        } else if (strlen($password) < 6) {
+            $this->show_form(_('Password must be 6 or more characters.'));
+            return;
+        } else if ($password != $confirm) {
+            $this->show_form(_('Passwords don\'t match.'));
+        } else if ($user = User::register(array('nickname' => $nickname, 'password' => $password, 'email' => $email,
+                                                'fullname' => $fullname, 'homepage' => $homepage, 'bio' => $bio,
+                                                'location' => $location, 'code' => $code))) {
+            if (!$user) {
+                $this->show_form(_('Invalid username or password.'));
+                return;
+            }
+            # success!
+            if (!common_set_user($user)) {
+                common_server_error(_('Error setting user.'));
+                return;
+            }
+            # this is a real login
+            common_real_login(true);
+            if ($this->boolean('rememberme')) {
+                common_debug('Adding rememberme cookie for ' . $nickname);
+                common_rememberme($user);
+            }
+            # Re-init language env in case it changed (not yet, but soon)
+            common_init_language();
+            $this->show_success();
+        } else {
+            $this->show_form(_('Invalid username or password.'));
+        }
+    }
+
+    # checks if *CANONICAL* nickname exists
+
+    function nickname_exists($nickname) {
+        $user = User::staticGet('nickname', $nickname);
+        return ($user !== false);
+    }
+
+    # checks if *CANONICAL* email exists
+
+    function email_exists($email) {
+        $email = common_canonical_email($email);
+        if (!$email || strlen($email) == 0) {
+            return false;
+        }
+        $user = User::staticGet('email', $email);
+        return ($user !== false);
+    }
+
+    function show_top($error=NULL) {
+        if ($error) {
+            common_element('p', 'error', $error);
+        } else {
+            $instr = common_markup_to_html(_('With this form you can create a new account. ' .
+                                             'You can then post notices and link up to friends and colleagues. '.
+                                             '(Have an [OpenID](http://openid.net/)? ' .
+                                             'Try our [OpenID registration](%%action.openidlogin%%)!)'));
+
+            common_element_start('div', 'instructions');
+            common_raw($instr);
+            common_element_end('div');
+        }
+    }
+
+    function show_form($error=NULL) {
+        global $config;
+
+        $code = $this->trimmed('code');
+
+        if ($code) {
+            $invite = Invitation::staticGet($code);
+        }
+
+        if (common_config('site', 'inviteonly') && !($code && $invite)) {
+            $this->client_error(_('Sorry, only invited people can register.'));
+            return;
+        }
+
+        common_show_header(_('Register'), NULL, $error, array($this, 'show_top'));
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'login',
+                                           'action' => common_local_url('register')));
+
+        common_hidden('token', common_session_token());
+
+        if ($code) {
+            common_hidden('code', $code);
+        }
+
+        common_input('nickname', _('Nickname'), $this->trimmed('nickname'),
+                     _('1-64 lowercase letters or numbers, no punctuation or spaces. Required.'));
+        common_password('password', _('Password'),
+                        _('6 or more characters. Required.'));
+        common_password('confirm', _('Confirm'),
+                        _('Same as password above. Required.'));
+        if ($invite && $invite->address_type == 'email') {
+            common_input('email', _('Email'), $invite->address,
+                     _('Used only for updates, announcements, and password recovery'));
+        } else {
+            common_input('email', _('Email'), $this->trimmed('email'),
+                         _('Used only for updates, announcements, and password recovery'));
+        }
+        common_input('fullname', _('Full name'),
+                     $this->trimmed('fullname'),
+                      _('Longer name, preferably your "real" name'));
+        common_input('homepage', _('Homepage'),
+                     $this->trimmed('homepage'),
+                     _('URL of your homepage, blog, or profile on another site'));
+        common_textarea('bio', _('Bio'),
+                        $this->trimmed('bio'),
+                         _('Describe yourself and your interests in 140 chars'));
+        common_input('location', _('Location'),
+                     $this->trimmed('location'),
+                     _('Where you are, like "City, State (or Region), Country"'));
+        common_checkbox('rememberme', _('Remember me'),
+                        $this->boolean('rememberme'),
+                        _('Automatically login in the future; not for shared computers!'));
+        common_element_start('p');
+        $attrs = array('type' => 'checkbox',
+                       'id' => 'license',
+                       'name' => 'license',
+                       'value' => 'true');
+        if ($this->boolean('license')) {
+            $attrs['checked'] = 'checked';
+        }
+        common_element('input', $attrs);
+        common_text(_('My text and files are available under '));
+        common_element('a', array('href' => $config['license']['url']),
+                       $config['license']['title']);
+        common_text(_(' except this private data: password, email address, IM address, phone number.'));
+        common_element_end('p');
+        common_submit('submit', _('Register'));
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function show_success() {
+        $nickname = $this->arg('nickname');
+        common_show_header(_('Registration successful'));
+        common_element_start('div', 'success');
+        $instr = sprintf(_('Congratulations, %s! And welcome to %%%%site.name%%%%. From here, you may want to...'. "\n\n" .
+                           '* Go to [your profile](%s) and post your first message.' .  "\n" .
+                           '* Add a [Jabber/GTalk address](%%%%action.imsettings%%%%) so you can send notices through instant messages.' . "\n" .
+                           '* [Search for people](%%%%action.peoplesearch%%%%) that you may know or that share your interests. ' . "\n" .
+                           '* Update your [profile settings](%%%%action.profilesettings%%%%) to tell others more about you. ' . "\n" .
+                           '* Read over the [online docs](%%%%doc.help%%%%) for features you may have missed. ' . "\n\n" .
+                           'Thanks for signing up and we hope you enjoy using this service.'),
+                         $nickname, common_local_url('showstream', array('nickname' => $nickname)));
+        common_raw(common_markup_to_html($instr));
+        $have_email = $this->trimmed('email');
+        if ($have_email) {
+            $emailinstr = _('(You should receive a message by email momentarily, with ' .
+                            'instructions on how to confirm your email address.)');
+            common_raw(common_markup_to_html($emailinstr));
+        }
+        common_element_end('div');
+        common_show_footer();
+    }
 
 }
index c3a09bcfc247272676f432dd36dcdc7f11f14c96..14e8cb0683f1bcc20fc2ad6e04fe1ecf35aa0352 100644 (file)
@@ -23,364 +23,364 @@ require_once(INSTALLDIR.'/lib/omb.php');
 
 class RemotesubscribeAction extends Action {
 
-       function handle($args) {
-
-               parent::handle($args);
-
-               if (common_logged_in()) {
-                       common_user_error(_('You can use the local subscription!'));
-                   return;
-               }
-
-               if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-
-                       # CSRF protection
-                       $token = $this->trimmed('token');
-                       if (!$token || $token != common_session_token()) {
-                               $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                               return;
-                       }
-
-                       $this->remote_subscription();
-               } else {
-                       $this->show_form();
-               }
-       }
-
-       function get_instructions() {
-               return _('To subscribe, you can [login](%%action.login%%),' .
-                         ' or [register](%%action.register%%) a new ' .
-                         ' account. If you already have an account ' .
-                         ' on a [compatible microblogging site](%%doc.openmublog%%), ' .
-                         ' enter your profile URL below.');
-       }
-
-       function show_top($err=NULL) {
-               if ($err) {
-                       common_element('div', 'error', $err);
-               } else {
-                       $instructions = $this->get_instructions();
-                       $output = common_markup_to_html($instructions);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('p');
-               }
-       }
-
-       function show_form($err=NULL) {
-               $nickname = $this->trimmed('nickname');
-               $profile = $this->trimmed('profile_url');
-               common_show_header(_('Remote subscribe'), NULL, $err,
-                                                  array($this, 'show_top'));
-               # id = remotesubscribe conflicts with the
-               # button on profile page
-               common_element_start('form', array('id' => 'remsub', 'method' => 'post',
-                                                                                  'action' => common_local_url('remotesubscribe')));
-               common_hidden('token', common_session_token());
-               common_input('nickname', _('User nickname'), $nickname,
-                                        _('Nickname of the user you want to follow'));
-               common_input('profile_url', _('Profile URL'), $profile,
-                                        _('URL of your profile on another compatible microblogging service'));
-               common_submit('submit', _('Subscribe'));
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function remote_subscription() {
-               $user = $this->get_user();
-
-               if (!$user) {
-                       $this->show_form(_('No such user.'));
-                       return;
-               }
-
-               $profile = $this->trimmed('profile_url');
-
-               if (!$profile) {
-                       $this->show_form(_('No such user.'));
-                       return;
-               }
-
-               if (!Validate::uri($profile, array('allowed_schemes' => array('http', 'https')))) {
-                       $this->show_form(_('Invalid profile URL (bad format)'));
-                       return;
-               }
-
-               $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
-               $yadis = Auth_Yadis_Yadis::discover($profile, $fetcher);
-
-               if (!$yadis || $yadis->failed) {
-                       $this->show_form(_('Not a valid profile URL (no YADIS document).'));
-                       return;
-               }
-
-               # XXX: a little liberal for sites that accidentally put whitespace before the xml declaration
+    function handle($args) {
+
+        parent::handle($args);
+
+        if (common_logged_in()) {
+            common_user_error(_('You can use the local subscription!'));
+            return;
+        }
+
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+
+            # CSRF protection
+            $token = $this->trimmed('token');
+            if (!$token || $token != common_session_token()) {
+                $this->show_form(_('There was a problem with your session token. Try again, please.'));
+                return;
+            }
+
+            $this->remote_subscription();
+        } else {
+            $this->show_form();
+        }
+    }
+
+    function get_instructions() {
+        return _('To subscribe, you can [login](%%action.login%%),' .
+                  ' or [register](%%action.register%%) a new ' .
+                  ' account. If you already have an account ' .
+                  ' on a [compatible microblogging site](%%doc.openmublog%%), ' .
+                  ' enter your profile URL below.');
+    }
+
+    function show_top($err=NULL) {
+        if ($err) {
+            common_element('div', 'error', $err);
+        } else {
+            $instructions = $this->get_instructions();
+            $output = common_markup_to_html($instructions);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('p');
+        }
+    }
+
+    function show_form($err=NULL) {
+        $nickname = $this->trimmed('nickname');
+        $profile = $this->trimmed('profile_url');
+        common_show_header(_('Remote subscribe'), NULL, $err,
+                           array($this, 'show_top'));
+        # id = remotesubscribe conflicts with the
+        # button on profile page
+        common_element_start('form', array('id' => 'remsub', 'method' => 'post',
+                                           'action' => common_local_url('remotesubscribe')));
+        common_hidden('token', common_session_token());
+        common_input('nickname', _('User nickname'), $nickname,
+                     _('Nickname of the user you want to follow'));
+        common_input('profile_url', _('Profile URL'), $profile,
+                     _('URL of your profile on another compatible microblogging service'));
+        common_submit('submit', _('Subscribe'));
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function remote_subscription() {
+        $user = $this->get_user();
+
+        if (!$user) {
+            $this->show_form(_('No such user.'));
+            return;
+        }
+
+        $profile = $this->trimmed('profile_url');
+
+        if (!$profile) {
+            $this->show_form(_('No such user.'));
+            return;
+        }
+
+        if (!Validate::uri($profile, array('allowed_schemes' => array('http', 'https')))) {
+            $this->show_form(_('Invalid profile URL (bad format)'));
+            return;
+        }
+
+        $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+        $yadis = Auth_Yadis_Yadis::discover($profile, $fetcher);
+
+        if (!$yadis || $yadis->failed) {
+            $this->show_form(_('Not a valid profile URL (no YADIS document).'));
+            return;
+        }
+
+        # XXX: a little liberal for sites that accidentally put whitespace before the xml declaration
 
         $xrds =& Auth_Yadis_XRDS::parseXRDS(trim($yadis->response_text));
 
-               if (!$xrds) {
-                       $this->show_form(_('Not a valid profile URL (no XRDS defined).'));
-                       return;
-               }
+        if (!$xrds) {
+            $this->show_form(_('Not a valid profile URL (no XRDS defined).'));
+            return;
+        }
 
-               $omb = $this->getOmb($xrds);
+        $omb = $this->getOmb($xrds);
 
-               if (!$omb) {
-                       $this->show_form(_('Not a valid profile URL (incorrect services).'));
-                       return;
-               }
+        if (!$omb) {
+            $this->show_form(_('Not a valid profile URL (incorrect services).'));
+            return;
+        }
 
-               if (omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]) ==
-                       common_local_url('requesttoken'))
-               {
-                       $this->show_form(_('That\'s a local profile! Login to subscribe.'));
-                       return;
-               }
-
-               if (User::staticGet('uri', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]))) {
-                       $this->show_form(_('That\'s a local profile! Login to subscribe.'));
-                       return;
-               }
-
-               list($token, $secret) = $this->request_token($omb);
-
-               if (!$token || !$secret) {
-                       $this->show_form(_('Couldn\'t get a request token.'));
-                       return;
-               }
-
-               $this->request_authorization($user, $omb, $token, $secret);
-       }
-
-       function get_user() {
-               $user = NULL;
-               $nickname = $this->trimmed('nickname');
-               if ($nickname) {
-                       $user = User::staticGet('nickname', $nickname);
-               }
-               return $user;
-       }
-
-       function getOmb($xrds) {
-
-           static $omb_endpoints = array(OMB_ENDPOINT_UPDATEPROFILE, OMB_ENDPOINT_POSTNOTICE);
-               static $oauth_endpoints = array(OAUTH_ENDPOINT_REQUEST, OAUTH_ENDPOINT_AUTHORIZE,
-                                                                               OAUTH_ENDPOINT_ACCESS);
-               $omb = array();
-
-               # XXX: the following code could probably be refactored to eliminate dupes
-
-               $oauth_services = omb_get_services($xrds, OAUTH_DISCOVERY);
-
-               if (!$oauth_services) {
-                       return NULL;
-               }
-
-               $oauth_service = $oauth_services[0];
-
-               $oauth_xrd = $this->getXRD($oauth_service, $xrds);
+        if (omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]) ==
+            common_local_url('requesttoken'))
+        {
+            $this->show_form(_('That\'s a local profile! Login to subscribe.'));
+            return;
+        }
+
+        if (User::staticGet('uri', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]))) {
+            $this->show_form(_('That\'s a local profile! Login to subscribe.'));
+            return;
+        }
+
+        list($token, $secret) = $this->request_token($omb);
+
+        if (!$token || !$secret) {
+            $this->show_form(_('Couldn\'t get a request token.'));
+            return;
+        }
+
+        $this->request_authorization($user, $omb, $token, $secret);
+    }
+
+    function get_user() {
+        $user = NULL;
+        $nickname = $this->trimmed('nickname');
+        if ($nickname) {
+            $user = User::staticGet('nickname', $nickname);
+        }
+        return $user;
+    }
+
+    function getOmb($xrds) {
+
+        static $omb_endpoints = array(OMB_ENDPOINT_UPDATEPROFILE, OMB_ENDPOINT_POSTNOTICE);
+        static $oauth_endpoints = array(OAUTH_ENDPOINT_REQUEST, OAUTH_ENDPOINT_AUTHORIZE,
+                                        OAUTH_ENDPOINT_ACCESS);
+        $omb = array();
+
+        # XXX: the following code could probably be refactored to eliminate dupes
+
+        $oauth_services = omb_get_services($xrds, OAUTH_DISCOVERY);
+
+        if (!$oauth_services) {
+            return NULL;
+        }
+
+        $oauth_service = $oauth_services[0];
+
+        $oauth_xrd = $this->getXRD($oauth_service, $xrds);
 
-               if (!$oauth_xrd) {
-                       return NULL;
-               }
+        if (!$oauth_xrd) {
+            return NULL;
+        }
 
-               if (!$this->addServices($oauth_xrd, $oauth_endpoints, $omb)) {
-                       return NULL;
-               }
+        if (!$this->addServices($oauth_xrd, $oauth_endpoints, $omb)) {
+            return NULL;
+        }
 
-               $omb_services = omb_get_services($xrds, OMB_NAMESPACE);
+        $omb_services = omb_get_services($xrds, OMB_NAMESPACE);
 
-               if (!$omb_services) {
-                       return NULL;
-               }
+        if (!$omb_services) {
+            return NULL;
+        }
 
-               $omb_service = $omb_services[0];
+        $omb_service = $omb_services[0];
 
-               $omb_xrd = $this->getXRD($omb_service, $xrds);
+        $omb_xrd = $this->getXRD($omb_service, $xrds);
 
-               if (!$omb_xrd) {
-                       return NULL;
-               }
+        if (!$omb_xrd) {
+            return NULL;
+        }
 
-               if (!$this->addServices($omb_xrd, $omb_endpoints, $omb)) {
-                       return NULL;
-               }
+        if (!$this->addServices($omb_xrd, $omb_endpoints, $omb)) {
+            return NULL;
+        }
 
-               # XXX: check that we got all the services we needed
+        # XXX: check that we got all the services we needed
 
-               foreach (array_merge($omb_endpoints, $oauth_endpoints) as $type) {
-                       if (!array_key_exists($type, $omb) || !$omb[$type]) {
-                               return NULL;
-                       }
-               }
+        foreach (array_merge($omb_endpoints, $oauth_endpoints) as $type) {
+            if (!array_key_exists($type, $omb) || !$omb[$type]) {
+                return NULL;
+            }
+        }
 
-               if (!omb_local_id($omb[OAUTH_ENDPOINT_REQUEST])) {
-                       return NULL;
-               }
+        if (!omb_local_id($omb[OAUTH_ENDPOINT_REQUEST])) {
+            return NULL;
+        }
 
-               return $omb;
-       }
+        return $omb;
+    }
 
-       function getXRD($main_service, $main_xrds) {
-               $uri = omb_service_uri($main_service);
-               if (strpos($uri, "#") !== 0) {
-                       # FIXME: more rigorous handling of external service definitions
-                       return NULL;
-               }
-               $id = substr($uri, 1);
-               $nodes = $main_xrds->allXrdNodes;
-               $parser = $main_xrds->parser;
-               foreach ($nodes as $node) {
-                       $attrs = $parser->attributes($node);
-                       if (array_key_exists('xml:id', $attrs) &&
-                               $attrs['xml:id'] == $id) {
-                               # XXX: trick the constructor into thinking this is the only node
-                               $bogus_nodes = array($node);
-                               return new Auth_Yadis_XRDS($parser, $bogus_nodes);
-                       }
-               }
-               return NULL;
-       }
+    function getXRD($main_service, $main_xrds) {
+        $uri = omb_service_uri($main_service);
+        if (strpos($uri, "#") !== 0) {
+            # FIXME: more rigorous handling of external service definitions
+            return NULL;
+        }
+        $id = substr($uri, 1);
+        $nodes = $main_xrds->allXrdNodes;
+        $parser = $main_xrds->parser;
+        foreach ($nodes as $node) {
+            $attrs = $parser->attributes($node);
+            if (array_key_exists('xml:id', $attrs) &&
+                $attrs['xml:id'] == $id) {
+                # XXX: trick the constructor into thinking this is the only node
+                $bogus_nodes = array($node);
+                return new Auth_Yadis_XRDS($parser, $bogus_nodes);
+            }
+        }
+        return NULL;
+    }
 
-       function addServices($xrd, $types, &$omb) {
-               foreach ($types as $type) {
-                       $matches = omb_get_services($xrd, $type);
-                       if ($matches) {
-                               $omb[$type] = $matches[0];
-                       } else {
-                               # no match for type
-                               return false;
-                       }
-               }
-               return true;
-       }
+    function addServices($xrd, $types, &$omb) {
+        foreach ($types as $type) {
+            $matches = omb_get_services($xrd, $type);
+            if ($matches) {
+                $omb[$type] = $matches[0];
+            } else {
+                # no match for type
+                return false;
+            }
+        }
+        return true;
+    }
 
-       function request_token($omb) {
-               $con = omb_oauth_consumer();
+    function request_token($omb) {
+        $con = omb_oauth_consumer();
 
-               $url = omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]);
+        $url = omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]);
 
-               # XXX: Is this the right thing to do? Strip off GET params and make them
-               # POST params? Seems wrong to me.
+        # XXX: Is this the right thing to do? Strip off GET params and make them
+        # POST params? Seems wrong to me.
 
-               $parsed = parse_url($url);
-               $params = array();
-               parse_str($parsed['query'], $params);
+        $parsed = parse_url($url);
+        $params = array();
+        parse_str($parsed['query'], $params);
 
-               $req = OAuthRequest::from_consumer_and_token($con, NULL, "POST", $url, $params);
+        $req = OAuthRequest::from_consumer_and_token($con, NULL, "POST", $url, $params);
 
-               $listener = omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]);
+        $listener = omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]);
 
-               if (!$listener) {
-                       return NULL;
-               }
+        if (!$listener) {
+            return NULL;
+        }
 
-               $req->set_parameter('omb_listener', $listener);
-               $req->set_parameter('omb_version', OMB_VERSION_01);
+        $req->set_parameter('omb_listener', $listener);
+        $req->set_parameter('omb_version', OMB_VERSION_01);
 
-               # XXX: test to see if endpoint accepts this signature method
+        # XXX: test to see if endpoint accepts this signature method
 
-               $req->sign_request(omb_hmac_sha1(), $con, NULL);
+        $req->sign_request(omb_hmac_sha1(), $con, NULL);
 
-               # We re-use this tool's fetcher, since it's pretty good
+        # We re-use this tool's fetcher, since it's pretty good
 
-               $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+        $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
 
-               $result = $fetcher->post($req->get_normalized_http_url(),
-                                                                $req->to_postdata(),
+        $result = $fetcher->post($req->get_normalized_http_url(),
+                                 $req->to_postdata(),
                                  array('User-Agent' => 'Laconica/' . LACONICA_VERSION));
 
-               if ($result->status != 200) {
-                       return NULL;
-               }
+        if ($result->status != 200) {
+            return NULL;
+        }
 
-               parse_str($result->body, $return);
+        parse_str($result->body, $return);
 
-               return array($return['oauth_token'], $return['oauth_token_secret']);
-       }
+        return array($return['oauth_token'], $return['oauth_token_secret']);
+    }
 
-       function request_authorization($user, $omb, $token, $secret) {
-               global $config; # for license URL
+    function request_authorization($user, $omb, $token, $secret) {
+        global $config; # for license URL
 
-               $con = omb_oauth_consumer();
-               $tok = new OAuthToken($token, $secret);
+        $con = omb_oauth_consumer();
+        $tok = new OAuthToken($token, $secret);
 
-               $url = omb_service_uri($omb[OAUTH_ENDPOINT_AUTHORIZE]);
+        $url = omb_service_uri($omb[OAUTH_ENDPOINT_AUTHORIZE]);
 
-               # XXX: Is this the right thing to do? Strip off GET params and make them
-               # POST params? Seems wrong to me.
+        # XXX: Is this the right thing to do? Strip off GET params and make them
+        # POST params? Seems wrong to me.
 
-               $parsed = parse_url($url);
-               $params = array();
-               parse_str($parsed['query'], $params);
+        $parsed = parse_url($url);
+        $params = array();
+        parse_str($parsed['query'], $params);
 
-               $req = OAuthRequest::from_consumer_and_token($con, $tok, 'GET', $url, $params);
+        $req = OAuthRequest::from_consumer_and_token($con, $tok, 'GET', $url, $params);
 
-               # We send over a ton of information. This lets the other
-               # server store info about our user, and it lets the current
-               # user decide if they really want to authorize the subscription.
+        # We send over a ton of information. This lets the other
+        # server store info about our user, and it lets the current
+        # user decide if they really want to authorize the subscription.
 
-               $req->set_parameter('omb_version', OMB_VERSION_01);
-               $req->set_parameter('omb_listener', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]));
-               $req->set_parameter('omb_listenee', $user->uri);
-               $req->set_parameter('omb_listenee_profile', common_profile_url($user->nickname));
-               $req->set_parameter('omb_listenee_nickname', $user->nickname);
-               $req->set_parameter('omb_listenee_license', $config['license']['url']);
+        $req->set_parameter('omb_version', OMB_VERSION_01);
+        $req->set_parameter('omb_listener', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]));
+        $req->set_parameter('omb_listenee', $user->uri);
+        $req->set_parameter('omb_listenee_profile', common_profile_url($user->nickname));
+        $req->set_parameter('omb_listenee_nickname', $user->nickname);
+        $req->set_parameter('omb_listenee_license', $config['license']['url']);
 
-               $profile = $user->getProfile();
-               if (!$profile) {
-                       common_log_db_error($user, 'SELECT', __FILE__);
-                       $this->server_error(_('User without matching profile'));
-                       return;
-               }
+        $profile = $user->getProfile();
+        if (!$profile) {
+            common_log_db_error($user, 'SELECT', __FILE__);
+            $this->server_error(_('User without matching profile'));
+            return;
+        }
 
-               if ($profile->fullname) {
-                       $req->set_parameter('omb_listenee_fullname', $profile->fullname);
-               }
-               if ($profile->homepage) {
-                       $req->set_parameter('omb_listenee_homepage', $profile->homepage);
-               }
-               if ($profile->bio) {
-                       $req->set_parameter('omb_listenee_bio', $profile->bio);
-               }
-               if ($profile->location) {
-                       $req->set_parameter('omb_listenee_location', $profile->location);
-               }
-               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-               if ($avatar) {
-                       $req->set_parameter('omb_listenee_avatar', $avatar->url);
-               }
+        if ($profile->fullname) {
+            $req->set_parameter('omb_listenee_fullname', $profile->fullname);
+        }
+        if ($profile->homepage) {
+            $req->set_parameter('omb_listenee_homepage', $profile->homepage);
+        }
+        if ($profile->bio) {
+            $req->set_parameter('omb_listenee_bio', $profile->bio);
+        }
+        if ($profile->location) {
+            $req->set_parameter('omb_listenee_location', $profile->location);
+        }
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+        if ($avatar) {
+            $req->set_parameter('omb_listenee_avatar', $avatar->url);
+        }
 
-               # XXX: add a nonce to prevent replay attacks
+        # XXX: add a nonce to prevent replay attacks
 
-               $req->set_parameter('oauth_callback', common_local_url('finishremotesubscribe'));
+        $req->set_parameter('oauth_callback', common_local_url('finishremotesubscribe'));
 
-               # XXX: test to see if endpoint accepts this signature method
+        # XXX: test to see if endpoint accepts this signature method
 
-               $req->sign_request(omb_hmac_sha1(), $con, $tok);
+        $req->sign_request(omb_hmac_sha1(), $con, $tok);
 
-               # store all our info here
+        # store all our info here
 
-               $omb['listenee'] = $user->nickname;
-               $omb['listener'] = omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]);
-               $omb['token'] = $token;
-               $omb['secret'] = $secret;
-               # call doesn't work after bounce back so we cache; maybe serialization issue...?
-               $omb['access_token_url'] = omb_service_uri($omb[OAUTH_ENDPOINT_ACCESS]);
-               $omb['post_notice_url'] = omb_service_uri($omb[OMB_ENDPOINT_POSTNOTICE]);
-               $omb['update_profile_url'] = omb_service_uri($omb[OMB_ENDPOINT_UPDATEPROFILE]);
+        $omb['listenee'] = $user->nickname;
+        $omb['listener'] = omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]);
+        $omb['token'] = $token;
+        $omb['secret'] = $secret;
+        # call doesn't work after bounce back so we cache; maybe serialization issue...?
+        $omb['access_token_url'] = omb_service_uri($omb[OAUTH_ENDPOINT_ACCESS]);
+        $omb['post_notice_url'] = omb_service_uri($omb[OMB_ENDPOINT_POSTNOTICE]);
+        $omb['update_profile_url'] = omb_service_uri($omb[OMB_ENDPOINT_UPDATEPROFILE]);
 
-               common_ensure_session();
+        common_ensure_session();
 
-               $_SESSION['oauth_authorization_request'] = $omb;
+        $_SESSION['oauth_authorization_request'] = $omb;
 
-               # Redirect to authorization service
+        # Redirect to authorization service
 
-               common_redirect($req->to_url());
-               return;
-       }
+        common_redirect($req->to_url());
+        return;
+    }
 
-       function make_nonce() {
-               return common_good_rand(16);
-       }
+    function make_nonce() {
+        return common_good_rand(16);
+    }
 }
index 835871ffc17b704485390539e88b99571be53d62..be80fae79eb2decdd4ef971d94205044243c2eab 100644 (file)
@@ -23,72 +23,72 @@ require_once(INSTALLDIR.'/actions/showstream.php');
 
 class RepliesAction extends StreamAction {
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               $nickname = common_canonical_nickname($this->arg('nickname'));
-               $user = User::staticGet('nickname', $nickname);
+        $nickname = common_canonical_nickname($this->arg('nickname'));
+        $user = User::staticGet('nickname', $nickname);
 
-               if (!$user) {
-                       $this->no_such_user();
-                       return;
-               }
+        if (!$user) {
+            $this->no_such_user();
+            return;
+        }
 
-               $profile = $user->getProfile();
+        $profile = $user->getProfile();
 
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
 
-               # Looks like we're good; show the header
+        # Looks like we're good; show the header
 
-               common_show_header(sprintf(_("Replies to %s"), $profile->nickname),
-                                                  array($this, 'show_header'), $user,
-                                                  array($this, 'show_top'));
+        common_show_header(sprintf(_("Replies to %s"), $profile->nickname),
+                           array($this, 'show_header'), $user,
+                           array($this, 'show_top'));
 
-               $this->show_replies($user);
+        $this->show_replies($user);
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function no_such_user() {
-               common_user_error(_('No such user.'));
-       }
+    function no_such_user() {
+        common_user_error(_('No such user.'));
+    }
 
-       function show_header($user) {
-               common_element('link', array('rel' => 'alternate',
-                                                                        'href' => common_local_url('repliesrss', array('nickname' =>
-                                                                                                                                                                       $user->nickname)),
-                                                                        'type' => 'application/rss+xml',
-                                                                        'title' => sprintf(_('Feed for replies to %s'), $user->nickname)));
-       }
+    function show_header($user) {
+        common_element('link', array('rel' => 'alternate',
+                                     'href' => common_local_url('repliesrss', array('nickname' =>
+                                                                                    $user->nickname)),
+                                     'type' => 'application/rss+xml',
+                                     'title' => sprintf(_('Feed for replies to %s'), $user->nickname)));
+    }
 
-       function show_top($user) {
-               $cur = common_current_user();
+    function show_top($user) {
+        $cur = common_current_user();
 
-               if ($cur && $cur->id == $user->id) {
-                       common_notice_form('replies');
-               }
+        if ($cur && $cur->id == $user->id) {
+            common_notice_form('replies');
+        }
 
-               $this->views_menu();
+        $this->views_menu();
 
-               $this->show_feeds_list(array(0=>array('href'=>common_local_url('repliesrss', array('nickname' => $user->nickname)),
-                                                                                         'type' => 'rss',
-                                                                                         'version' => 'RSS 1.0',
-                                                                                         'item' => 'repliesrss')));
-       }
+        $this->show_feeds_list(array(0=>array('href'=>common_local_url('repliesrss', array('nickname' => $user->nickname)),
+                                              'type' => 'rss',
+                                              'version' => 'RSS 1.0',
+                                              'item' => 'repliesrss')));
+    }
 
-       function show_replies($user) {
+    function show_replies($user) {
 
-               $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
 
-               $notice = $user->getReplies(($page-1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+        $notice = $user->getReplies(($page-1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
 
-               $cnt = $this->show_notice_list($notice);
+        $cnt = $this->show_notice_list($notice);
 
-               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'replies', array('nickname' => $user->nickname));
-       }
+        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'replies', array('nickname' => $user->nickname));
+    }
 }
index 7369db5e047ae6f16d8ddbf17f53f512512d0a86..3689ea1f8ffd95cc19d4c7f61f8804dbe9283ca1 100644 (file)
@@ -25,55 +25,55 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class RepliesrssAction extends Rss10Action {
 
-       var $user = NULL;
+    var $user = NULL;
 
-       function init() {
-               $nickname = $this->trimmed('nickname');
-               $this->user = User::staticGet('nickname', $nickname);
+    function init() {
+        $nickname = $this->trimmed('nickname');
+        $this->user = User::staticGet('nickname', $nickname);
 
-               if (!$this->user) {
-                       common_user_error(_('No such user.'));
-                       return false;
-               } else {
-                       return true;
-               }
-       }
+        if (!$this->user) {
+            common_user_error(_('No such user.'));
+            return false;
+        } else {
+            return true;
+        }
+    }
 
-       function get_notices($limit=0) {
+    function get_notices($limit=0) {
 
-               $user = $this->user;
+        $user = $this->user;
 
-               $notice = $user->getReplies(0, ($limit == 0) ? 48 : $limit);
+        $notice = $user->getReplies(0, ($limit == 0) ? 48 : $limit);
 
-               $notices = array();
-               
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
+        $notices = array();
+        
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
 
-               return $notices;
-       }
+        return $notices;
+    }
 
-       function get_channel() {
-               $user = $this->user;
-               $c = array('url' => common_local_url('repliesrss',
-                                                                                        array('nickname' =>
-                                                                                                  $user->nickname)),
-                                  'title' => sprintf(_("Replies to %s"), $user->nickname),
-                                  'link' => common_local_url('replies',
-                                                                                         array('nickname' =>
-                                                                                                       $user->nickname)),
-                                  'description' => sprintf(_('Feed for replies to %s'), $user->nickname));
-               return $c;
-       }
+    function get_channel() {
+        $user = $this->user;
+        $c = array('url' => common_local_url('repliesrss',
+                                             array('nickname' =>
+                                                   $user->nickname)),
+                   'title' => sprintf(_("Replies to %s"), $user->nickname),
+                   'link' => common_local_url('replies',
+                                              array('nickname' =>
+                                                    $user->nickname)),
+                   'description' => sprintf(_('Feed for replies to %s'), $user->nickname));
+        return $c;
+    }
 
-       function get_image() {
-               $user = $this->user;
-               $profile = $user->getProfile();
-               if (!$profile) {
-                       return NULL;
-               }
-               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-               return ($avatar) ? $avatar->url : NULL;
-       }
+    function get_image() {
+        $user = $this->user;
+        $profile = $user->getProfile();
+        if (!$profile) {
+            return NULL;
+        }
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+        return ($avatar) ? $avatar->url : NULL;
+    }
 }
\ No newline at end of file
index 76019a92995126db827b7394ed55bf3588235166..4950d93c06addede2a77b54e636d45fa33a133a1 100644 (file)
@@ -22,21 +22,21 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/lib/omb.php');
 
 class RequesttokenAction extends Action {
-       
-       function is_readonly() {
-               return false;
-       }
-       
-       function handle($args) {
-               parent::handle($args);
-               try {
-                       common_remove_magic_from_request();
-                       $req = OAuthRequest::from_request();
-                       $server = omb_oauth_server();
-                       $token = $server->fetch_request_token($req);
-                       print $token;
-               } catch (OAuthException $e) {
-                       common_server_error($e->getMessage());
-               }
-       }
+    
+    function is_readonly() {
+        return false;
+    }
+    
+    function handle($args) {
+        parent::handle($args);
+        try {
+            common_remove_magic_from_request();
+            $req = OAuthRequest::from_request();
+            $server = omb_oauth_server();
+            $token = $server->fetch_request_token($req);
+            print $token;
+        } catch (OAuthException $e) {
+            common_server_error($e->getMessage());
+        }
+    }
 }
index 4de4b12716be71327727deeefa893b49853af4de..2fd1e586d4d074ebcd2f2bfa655bc1c4d3b274e7 100644 (file)
@@ -23,75 +23,75 @@ require_once(INSTALLDIR.'/actions/showstream.php');
 
 class ShowfavoritesAction extends StreamAction {
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               $nickname = common_canonical_nickname($this->arg('nickname'));
-               $user = User::staticGet('nickname', $nickname);
+        $nickname = common_canonical_nickname($this->arg('nickname'));
+        $user = User::staticGet('nickname', $nickname);
 
-               if (!$user) {
-                       $this->client_error(_('No such user.'));
-                       return;
-               }
+        if (!$user) {
+            $this->client_error(_('No such user.'));
+            return;
+        }
 
-               $profile = $user->getProfile();
+        $profile = $user->getProfile();
 
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
 
-               # Looks like we're good; show the header
+        # Looks like we're good; show the header
 
-               common_show_header(sprintf(_("%s favorite notices"), $profile->nickname),
-                                                  array($this, 'show_header'), $user,
-                                                  array($this, 'show_top'));
+        common_show_header(sprintf(_("%s favorite notices"), $profile->nickname),
+                           array($this, 'show_header'), $user,
+                           array($this, 'show_top'));
 
-               $this->show_notices($user);
+        $this->show_notices($user);
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function show_header($user) {
-               common_element('link', array('rel' => 'alternate',
-                                                                        'href' => common_local_url('favoritesrss', array('nickname' =>
-                                                                                                                                                                         $user->nickname)),
-                                                                        'type' => 'application/rss+xml',
-                                                                        'title' => sprintf(_('Feed for favorites of %s'), $user->nickname)));
-       }
+    function show_header($user) {
+        common_element('link', array('rel' => 'alternate',
+                                     'href' => common_local_url('favoritesrss', array('nickname' =>
+                                                                                      $user->nickname)),
+                                     'type' => 'application/rss+xml',
+                                     'title' => sprintf(_('Feed for favorites of %s'), $user->nickname)));
+    }
 
-       function show_top($user) {
-               $cur = common_current_user();
+    function show_top($user) {
+        $cur = common_current_user();
 
-               if ($cur && $cur->id == $user->id) {
-                       common_notice_form('all');
-               }
+        if ($cur && $cur->id == $user->id) {
+            common_notice_form('all');
+        }
 
-               $this->show_feeds_list(array(0=>array('href'=>common_local_url('favoritesrss', array('nickname' => $user->nickname)),
-                                                                                         'type' => 'rss',
-                                                                                         'version' => 'RSS 1.0',
-                                                                                         'item' => 'Favorites')));
-               $this->views_menu();
-       }
+        $this->show_feeds_list(array(0=>array('href'=>common_local_url('favoritesrss', array('nickname' => $user->nickname)),
+                                              'type' => 'rss',
+                                              'version' => 'RSS 1.0',
+                                              'item' => 'Favorites')));
+        $this->views_menu();
+    }
 
-       function show_notices($user) {
+    function show_notices($user) {
 
-               $page = $this->trimmed('page');
-               if (!$page) {
-                       $page = 1;
-               }
+        $page = $this->trimmed('page');
+        if (!$page) {
+            $page = 1;
+        }
 
-               $notice = $user->favoriteNotices(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+        $notice = $user->favoriteNotices(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
 
-               if (!$notice) {
-                       $this->server_error(_('Could not retrieve favorite notices.'));
-                       return;
-               }
+        if (!$notice) {
+            $this->server_error(_('Could not retrieve favorite notices.'));
+            return;
+        }
 
         $cnt = $this->show_notice_list($notice);
 
-               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'showfavorites', array('nickname' => $user->nickname));
-       }
+        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'showfavorites', array('nickname' => $user->nickname));
+    }
 }
index c171ffe0b596b790bd5b458dbcae1a0393ed9026..f35f3eedeab424d2ce4393a110b3d20456980f3d 100644 (file)
@@ -23,78 +23,78 @@ require_once(INSTALLDIR.'/lib/mailbox.php');
 
 class ShowmessageAction extends MailboxAction {
 
-       function handle($args) {
+    function handle($args) {
 
-               Action::handle($args);
+        Action::handle($args);
 
-               $message = $this->get_message();
+        $message = $this->get_message();
 
-               if (!$message) {
-                       $this->client_error(_('No such message.'), 404);
-                       return;
-               }
-               
-               $cur = common_current_user();
-               
-               if ($cur && ($cur->id == $message->from_profile || $cur->id == $message->to_profile)) {
-                       $this->show_page($cur, 1);
-               } else {
-                       $this->client_error(_('Only the sender and recipient may read this message.'), 403);
-                       return;
-               }
-       }
-       
-       function get_message() {
-               $id = $this->trimmed('message');
-               $message = Message::staticGet('id', $id);
-               return $message;
-       }
-       
-       function get_title($user, $page) {
-               $message = $this->get_message();
-               if (!$message) {
-                       return NULL;
-               }
-               
-               if ($user->id == $message->from_profile) {
-                       $to = $message->getTo();
-                       $title = sprintf(_("Message to %1\$s on %2\$s"),
-                                                        $to->nickname,
-                                                        common_exact_date($message->created));
-               } else if ($user->id == $message->to_profile) {
-                       $from = $message->getFrom();
-                       $title = sprintf(_("Message from %1\$s on %2\$s"),
-                                                        $from->nickname,
-                                                        common_exact_date($message->created));
-               }
-               return $title;
-       }
+        if (!$message) {
+            $this->client_error(_('No such message.'), 404);
+            return;
+        }
+        
+        $cur = common_current_user();
+        
+        if ($cur && ($cur->id == $message->from_profile || $cur->id == $message->to_profile)) {
+            $this->show_page($cur, 1);
+        } else {
+            $this->client_error(_('Only the sender and recipient may read this message.'), 403);
+            return;
+        }
+    }
+    
+    function get_message() {
+        $id = $this->trimmed('message');
+        $message = Message::staticGet('id', $id);
+        return $message;
+    }
+    
+    function get_title($user, $page) {
+        $message = $this->get_message();
+        if (!$message) {
+            return NULL;
+        }
+        
+        if ($user->id == $message->from_profile) {
+            $to = $message->getTo();
+            $title = sprintf(_("Message to %1\$s on %2\$s"),
+                             $to->nickname,
+                             common_exact_date($message->created));
+        } else if ($user->id == $message->to_profile) {
+            $from = $message->getFrom();
+            $title = sprintf(_("Message from %1\$s on %2\$s"),
+                             $from->nickname,
+                             common_exact_date($message->created));
+        }
+        return $title;
+    }
 
-       function get_messages($user, $page) {
-               $message = new Message();
-               $message->id = $this->trimmed('message');
-               $message->find();
-               return $message;
-       }
-       
-       function get_message_profile($message) {
-               $user = common_current_user();
-               if ($user->id == $message->from_profile) {
-                       return $message->getTo();
-               } else if ($user->id == $message->to_profile) {
-                       return $message->getFrom();
-               } else {
-                       # This shouldn't happen
-                       return NULL;
-               }
-       }
-       
-       function get_instructions() {
-               return '';
-       }
-       
-       function views_menu() {
-               return;
-       }
+    function get_messages($user, $page) {
+        $message = new Message();
+        $message->id = $this->trimmed('message');
+        $message->find();
+        return $message;
+    }
+    
+    function get_message_profile($message) {
+        $user = common_current_user();
+        if ($user->id == $message->from_profile) {
+            return $message->getTo();
+        } else if ($user->id == $message->to_profile) {
+            return $message->getFrom();
+        } else {
+            # This shouldn't happen
+            return NULL;
+        }
+    }
+    
+    function get_instructions() {
+        return '';
+    }
+    
+    function views_menu() {
+        return;
+    }
 }
-       
\ No newline at end of file
+    
\ No newline at end of file
index 6dea6d7bba69fbe9405c92c6f4744d7ee86a11b3..74d197ed1f3b7ac69bec0918408ef6ea8f0b4058 100644 (file)
@@ -23,94 +23,94 @@ require_once(INSTALLDIR.'/lib/stream.php');
 
 class ShownoticeAction extends StreamAction {
 
-       var $notice = NULL;
-       var $profile = NULL;
-       var $avatar = NULL;
+    var $notice = NULL;
+    var $profile = NULL;
+    var $avatar = NULL;
 
-       function prepare($args) {
+    function prepare($args) {
 
-               parent::prepare($args);
+        parent::prepare($args);
 
-               $id = $this->arg('notice');
-               $this->notice = Notice::staticGet($id);
+        $id = $this->arg('notice');
+        $this->notice = Notice::staticGet($id);
 
-               if (!$this->notice) {
-                       $this->client_error(_('No such notice.'), 404);
-                       return false;
-               }
+        if (!$this->notice) {
+            $this->client_error(_('No such notice.'), 404);
+            return false;
+        }
 
-               $this->profile = $this->notice->getProfile();
+        $this->profile = $this->notice->getProfile();
 
-               if (!$this->profile) {
-                       $this->server_error(_('Notice has no profile'), 500);
-                       return false;
-               }
+        if (!$this->profile) {
+            $this->server_error(_('Notice has no profile'), 500);
+            return false;
+        }
 
-               $this->avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
+        $this->avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
 
-               return true;
-       }
+        return true;
+    }
 
-       function last_modified() {
-               return max(strtotime($this->notice->created),
-                                  strtotime($this->profile->modified),
-                                  ($this->avatar) ? strtotime($this->avatar->modified) : 0);
-       }
+    function last_modified() {
+        return max(strtotime($this->notice->created),
+                   strtotime($this->profile->modified),
+                   ($this->avatar) ? strtotime($this->avatar->modified) : 0);
+    }
 
-       function etag() {
-               return 'W/"' . implode(':', array($this->arg('action'),
-                                                                                 common_language(),
-                                                                                 $this->notice->id,
-                                                                                 strtotime($this->notice->created),
-                                                                                 strtotime($this->profile->modified),
-                                                                                 ($this->avatar) ? strtotime($this->avatar->modified) : 0)) . '"';
-       }
+    function etag() {
+        return 'W/"' . implode(':', array($this->arg('action'),
+                                          common_language(),
+                                          $this->notice->id,
+                                          strtotime($this->notice->created),
+                                          strtotime($this->profile->modified),
+                                          ($this->avatar) ? strtotime($this->avatar->modified) : 0)) . '"';
+    }
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               common_show_header(sprintf(_('%1$s\'s status on %2$s'),
-                                                                  $this->profile->nickname,
-                                                                  common_exact_date($this->notice->created)),
-                                                  array($this, 'show_header'), NULL,
-                                                  array($this, 'show_top'));
+        common_show_header(sprintf(_('%1$s\'s status on %2$s'),
+                                   $this->profile->nickname,
+                                   common_exact_date($this->notice->created)),
+                           array($this, 'show_header'), NULL,
+                           array($this, 'show_top'));
 
-               common_element_start('ul', array('id' => 'notices'));
+        common_element_start('ul', array('id' => 'notices'));
         $nli = new NoticeListItem($this->notice);
         $nli->show();
-               common_element_end('ul');
+        common_element_end('ul');
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function show_header() {
+    function show_header() {
 
-               $user = User::staticGet($this->profile->id);
+        $user = User::staticGet($this->profile->id);
 
-               if (!$user) {
-                       return;
-               }
+        if (!$user) {
+            return;
+        }
 
-               if ($user->emailmicroid && $user->email && $this->notice->uri) {
-                       common_element('meta', array('name' => 'microid',
-                                                                                'content' => "mailto+http:sha1:" . sha1(sha1('mailto:' . $user->email) . sha1($this->notice->uri))));
-               }
+        if ($user->emailmicroid && $user->email && $this->notice->uri) {
+            common_element('meta', array('name' => 'microid',
+                                         'content' => "mailto+http:sha1:" . sha1(sha1('mailto:' . $user->email) . sha1($this->notice->uri))));
+        }
 
-               if ($user->jabbermicroid && $user->jabber && $this->notice->uri) {
-                       common_element('meta', array('name' => 'microid',
-                                                                                'content' => "xmpp+http:sha1:" . sha1(sha1('xmpp:' . $user->jabber) . sha1($this->notice->uri))));
-               }
-       }
+        if ($user->jabbermicroid && $user->jabber && $this->notice->uri) {
+            common_element('meta', array('name' => 'microid',
+                                         'content' => "xmpp+http:sha1:" . sha1(sha1('xmpp:' . $user->jabber) . sha1($this->notice->uri))));
+        }
+    }
 
-       function show_top() {
-               $cur = common_current_user();
-               if ($cur && $cur->id == $this->profile->id) {
-                       common_notice_form();
-               }
-       }
+    function show_top() {
+        $cur = common_current_user();
+        if ($cur && $cur->id == $this->profile->id) {
+            common_notice_form();
+        }
+    }
 
-       function no_such_notice() {
-               common_user_error(_('No such notice.'));
-       }
+    function no_such_notice() {
+        common_user_error(_('No such notice.'));
+    }
 }
index 61fdec3fedcb3182eeb19b5114cbee4e6b1b124b..f8525348d3383ad98ee0c5e6f4feeb55feffc396 100644 (file)
@@ -26,12 +26,12 @@ define('SUBSCRIPTIONS', 80);
 
 class ShowstreamAction extends StreamAction {
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
         $nickname_arg = $this->arg('nickname');
-               $nickname = common_canonical_nickname($nickname_arg);
+        $nickname = common_canonical_nickname($nickname_arg);
 
         # Permanent redirect on non-canonical nickname
 
@@ -44,163 +44,163 @@ class ShowstreamAction extends StreamAction {
             return;
         }
 
-               $user = User::staticGet('nickname', $nickname);
-
-               if (!$user) {
-                       $this->no_such_user();
-                       return;
-               }
-
-               $profile = $user->getProfile();
-
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
-
-               # Looks like we're good; start output
-
-               # For YADIS discovery, we also have a <meta> tag
-
-               header('X-XRDS-Location: '. common_local_url('xrds', array('nickname' =>
-                                                                                                                                  $user->nickname)));
-
-               common_show_header($profile->nickname,
-                                                  array($this, 'show_header'), $user,
-                                                  array($this, 'show_top'));
-
-               $this->show_profile($profile);
-
-               $this->show_notices($user);
-
-               common_show_footer();
-       }
-
-       function show_top($user) {
-               $cur = common_current_user();
-
-               if ($cur && $cur->id == $user->id) {
-                       common_notice_form('showstream');
-               }
-
-               $this->views_menu();
-
-               $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('nickname' => $user->nickname)),
-                                                                                         'type' => 'rss',
-                                                                                         'version' => 'RSS 1.0',
-                                                                                         'item' => 'notices'),
-                                                                        1=>array('href'=>common_local_url('usertimeline', array('nickname' => $user->nickname)),
-                                                                                         'type' => 'atom',
-                                                                                         'version' => 'Atom 1.0',
-                                                                                         'item' => 'usertimeline'),
-
-                                                                        2=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
-                                                                                         'type' => 'rdf',
-                                                                                         'version' => 'FOAF',
-                                                                                         'item' => 'foaf')));
-       }
-
-       function show_header($user) {
-               # Feeds
-               common_element('link', array('rel' => 'alternate',
-                                                                        'href' => common_local_url('api',
-                                                                                                                               array('apiaction' => 'statuses',
-                                                                                                                                         'method' => 'user_timeline.rss',
-                                                                                                                                         'argument' => $user->nickname)),
-                                                                        'type' => 'application/rss+xml',
-                                                                        'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
-               common_element('link', array('rel' => 'alternate feed',
-                                                                        'href' => common_local_url('api',
-                                                                                                                               array('apiaction' => 'statuses',
-                                                                                                                                         'method' => 'user_timeline.atom',
-                                                                                                                                         'argument' => $user->nickname)),
-                                                                        'type' => 'application/atom+xml',
-                                                                        'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
-               common_element('link', array('rel' => 'alternate',
-                                                                        'href' => common_local_url('userrss', array('nickname' =>
-                                                                                                                                                          $user->nickname)),
-                                                                        'type' => 'application/rdf+xml',
-                                                                        'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
-               # FOAF
-               common_element('link', array('rel' => 'meta',
-                                                                        'href' => common_local_url('foaf', array('nickname' =>
-                                                                                                                                                         $user->nickname)),
-                                                                        'type' => 'application/rdf+xml',
-                                                                        'title' => 'FOAF'));
-               # for remote subscriptions etc.
-               common_element('meta', array('http-equiv' => 'X-XRDS-Location',
-                                                                        'content' => common_local_url('xrds', array('nickname' =>
-                                                                                                                                                          $user->nickname))));
-               $profile = $user->getProfile();
-               if ($profile->bio) {
-                       common_element('meta', array('name' => 'description',
-                                                                                'content' => $profile->bio));
-               }
-
-               if ($user->emailmicroid && $user->email && $profile->profileurl) {
-                       common_element('meta', array('name' => 'microid',
-                                                                                'content' => "mailto+http:sha1:" . sha1(sha1('mailto:' . $user->email) . sha1($profile->profileurl))));
-               }
-               if ($user->jabbermicroid && $user->jabber && $profile->profileurl) {
-                       common_element('meta', array('name' => 'microid',
-                                                                                'content' => "xmpp+http:sha1:" . sha1(sha1('xmpp:' . $user->jabber) . sha1($profile->profileurl))));
-               }
-
-               # See https://wiki.mozilla.org/Microsummaries
-
-               common_element('link', array('rel' => 'microsummary',
-                                                                        'href' => common_local_url('microsummary',
-                                                                                                                               array('nickname' => $profile->nickname))));
-       }
-
-       function no_such_user() {
-               $this->client_error(_('No such user.'), 404);
-       }
-
-       function show_profile($profile) {
-
-               common_element_start('div', array('id' => 'profile', 'class' => 'vcard'));
-
-               $this->show_personal($profile);
-
-               $this->show_last_notice($profile);
-
-               $cur = common_current_user();
-
-               $this->show_subscriptions($profile);
-
-               common_element_end('div');
-       }
-
-       function show_personal($profile) {
-
-               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-               common_element_start('div', array('id' => 'profile_avatar'));
-               common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
-                                                                       'class' => 'avatar profile photo',
-                                                                       'width' => AVATAR_PROFILE_SIZE,
-                                                                       'height' => AVATAR_PROFILE_SIZE,
-                                                                       'alt' => $profile->nickname));
+        $user = User::staticGet('nickname', $nickname);
+
+        if (!$user) {
+            $this->no_such_user();
+            return;
+        }
+
+        $profile = $user->getProfile();
+
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
+
+        # Looks like we're good; start output
+
+        # For YADIS discovery, we also have a <meta> tag
+
+        header('X-XRDS-Location: '. common_local_url('xrds', array('nickname' =>
+                                                                   $user->nickname)));
+
+        common_show_header($profile->nickname,
+                           array($this, 'show_header'), $user,
+                           array($this, 'show_top'));
+
+        $this->show_profile($profile);
+
+        $this->show_notices($user);
+
+        common_show_footer();
+    }
+
+    function show_top($user) {
+        $cur = common_current_user();
+
+        if ($cur && $cur->id == $user->id) {
+            common_notice_form('showstream');
+        }
+
+        $this->views_menu();
+
+        $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('nickname' => $user->nickname)),
+                                              'type' => 'rss',
+                                              'version' => 'RSS 1.0',
+                                              'item' => 'notices'),
+                                     1=>array('href'=>common_local_url('usertimeline', array('nickname' => $user->nickname)),
+                                              'type' => 'atom',
+                                              'version' => 'Atom 1.0',
+                                              'item' => 'usertimeline'),
+
+                                     2=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
+                                              'type' => 'rdf',
+                                              'version' => 'FOAF',
+                                              'item' => 'foaf')));
+    }
+
+    function show_header($user) {
+        # Feeds
+        common_element('link', array('rel' => 'alternate',
+                                     'href' => common_local_url('api',
+                                                                array('apiaction' => 'statuses',
+                                                                      'method' => 'user_timeline.rss',
+                                                                      'argument' => $user->nickname)),
+                                     'type' => 'application/rss+xml',
+                                     'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
+        common_element('link', array('rel' => 'alternate feed',
+                                     'href' => common_local_url('api',
+                                                                array('apiaction' => 'statuses',
+                                                                      'method' => 'user_timeline.atom',
+                                                                      'argument' => $user->nickname)),
+                                     'type' => 'application/atom+xml',
+                                     'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
+        common_element('link', array('rel' => 'alternate',
+                                     'href' => common_local_url('userrss', array('nickname' =>
+                                                                               $user->nickname)),
+                                     'type' => 'application/rdf+xml',
+                                     'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
+        # FOAF
+        common_element('link', array('rel' => 'meta',
+                                     'href' => common_local_url('foaf', array('nickname' =>
+                                                                              $user->nickname)),
+                                     'type' => 'application/rdf+xml',
+                                     'title' => 'FOAF'));
+        # for remote subscriptions etc.
+        common_element('meta', array('http-equiv' => 'X-XRDS-Location',
+                                     'content' => common_local_url('xrds', array('nickname' =>
+                                                                               $user->nickname))));
+        $profile = $user->getProfile();
+        if ($profile->bio) {
+            common_element('meta', array('name' => 'description',
+                                         'content' => $profile->bio));
+        }
+
+        if ($user->emailmicroid && $user->email && $profile->profileurl) {
+            common_element('meta', array('name' => 'microid',
+                                         'content' => "mailto+http:sha1:" . sha1(sha1('mailto:' . $user->email) . sha1($profile->profileurl))));
+        }
+        if ($user->jabbermicroid && $user->jabber && $profile->profileurl) {
+            common_element('meta', array('name' => 'microid',
+                                         'content' => "xmpp+http:sha1:" . sha1(sha1('xmpp:' . $user->jabber) . sha1($profile->profileurl))));
+        }
+
+        # See https://wiki.mozilla.org/Microsummaries
+
+        common_element('link', array('rel' => 'microsummary',
+                                     'href' => common_local_url('microsummary',
+                                                                array('nickname' => $profile->nickname))));
+    }
+
+    function no_such_user() {
+        $this->client_error(_('No such user.'), 404);
+    }
+
+    function show_profile($profile) {
+
+        common_element_start('div', array('id' => 'profile', 'class' => 'vcard'));
+
+        $this->show_personal($profile);
+
+        $this->show_last_notice($profile);
+
+        $cur = common_current_user();
+
+        $this->show_subscriptions($profile);
+
+        common_element_end('div');
+    }
+
+    function show_personal($profile) {
+
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+        common_element_start('div', array('id' => 'profile_avatar'));
+        common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
+                                    'class' => 'avatar profile photo',
+                                    'width' => AVATAR_PROFILE_SIZE,
+                                    'height' => AVATAR_PROFILE_SIZE,
+                                    'alt' => $profile->nickname));
 
         common_element_start('ul', array('id' => 'profile_actions'));
 
         common_element_start('li', array('id' => 'profile_subscribe'));
-               $cur = common_current_user();
-               if ($cur) {
-                       if ($cur->id != $profile->id) {
-                               if ($cur->isSubscribed($profile)) {
-                                       common_unsubscribe_form($profile);
-                               } else {
-                                       common_subscribe_form($profile);
-                               }
-                       }
-               } else {
-                       $this->show_remote_subscribe_link($profile);
-               }
+        $cur = common_current_user();
+        if ($cur) {
+            if ($cur->id != $profile->id) {
+                if ($cur->isSubscribed($profile)) {
+                    common_unsubscribe_form($profile);
+                } else {
+                    common_subscribe_form($profile);
+                }
+            }
+        } else {
+            $this->show_remote_subscribe_link($profile);
+        }
         common_element_end('li');
 
-               $user = User::staticGet('id', $profile->id);
-               common_profile_new_message_nudge($cur, $user, $profile);
+        $user = User::staticGet('id', $profile->id);
+        common_profile_new_message_nudge($cur, $user, $profile);
 
         if ($cur && $cur->id != $profile->id) {
             $blocked = $cur->hasBlocked($profile);
@@ -215,224 +215,224 @@ class ShowstreamAction extends StreamAction {
             common_element_end('li');
         }
 
-               common_element_end('ul');
-
-               common_element_end('div');
-
-               common_element_start('div', array('id' => 'profile_information'));
-
-               if ($profile->fullname) {
-                       common_element('h1', array('class' => 'fn'), $profile->fullname . ' (' . $profile->nickname . ')');
-               } else {
-                       common_element('h1', array('class' => 'fn nickname'), $profile->nickname);
-               }
-
-               if ($profile->location) {
-                       common_element('p', 'location', $profile->location);
-               }
-               if ($profile->bio) {
-                       common_element('p', 'description note', $profile->bio);
-               }
-               if ($profile->homepage) {
-                       common_element_start('p', 'website');
-                       common_element('a', array('href' => $profile->homepage,
-                                                                         'rel' => 'me', 'class' => 'url'),
-                                                  $profile->homepage);
-                       common_element_end('p');
-               }
-
-               $this->show_statistics($profile);
-
-               common_element_end('div');
-       }
-
-       function show_remote_subscribe_link($profile) {
-               $url = common_local_url('remotesubscribe',
-                                       array('nickname' => $profile->nickname));
-               common_element('a', array('href' => $url,
-                                                                 'id' => 'remotesubscribe'),
-                                          _('Subscribe'));
-       }
-
-       function show_unsubscribe_form($profile) {
-               common_element_start('form', array('id' => 'unsubscribe', 'method' => 'post',
-                                                                                  'action' => common_local_url('unsubscribe')));
-               common_hidden('token', common_session_token());
-               common_element('input', array('id' => 'unsubscribeto',
-                                                                         'name' => 'unsubscribeto',
-                                                                         'type' => 'hidden',
-                                                                         'value' => $profile->nickname));
-               common_element('input', array('type' => 'submit',
-                                                                         'class' => 'submit',
-                                                                         'value' => _('Unsubscribe')));
-               common_element_end('form');
-       }
-
-       function show_subscriptions($profile) {
-               global $config;
-
-               $subs = DB_DataObject::factory('subscription');
-               $subs->subscriber = $profile->id;
-               $subs->whereAdd('subscribed != ' . $profile->id);
-
-               $subs->orderBy('created DESC');
-
-               # We ask for an extra one to know if we need to do another page
-
-               $subs->limit(0, SUBSCRIPTIONS + 1);
-
-               $subs_count = $subs->find();
-
-               common_element_start('div', array('id' => 'subscriptions'));
-
-               common_element('h2', NULL, _('Subscriptions'));
-
-               if ($subs_count > 0) {
-
-                       common_element_start('ul', array('id' => 'subscriptions_avatars'));
-
-                       for ($i = 0; $i < min($subs_count, SUBSCRIPTIONS); $i++) {
-
-                               if (!$subs->fetch()) {
-                                       common_debug('Weirdly, broke out of subscriptions loop early', __FILE__);
-                                       break;
-                               }
-
-                               $other = Profile::staticGet($subs->subscribed);
-
-                               if (!$other) {
-                                       common_log_db_error($subs, 'SELECT', __FILE__);
-                                       continue;
-                               }
-
-                               common_element_start('li', 'vcard');
-                               common_element_start('a', array('title' => ($other->fullname) ?
-                                                                                               $other->fullname :
-                                                                                               $other->nickname,
-                                                                                               'href' => $other->profileurl,
-                                                                                               'rel' => 'contact',
-                                                                                               'class' => 'subscription fn url'));
-                               $avatar = $other->getAvatar(AVATAR_MINI_SIZE);
-                               common_element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
-                                                                                       'width' => AVATAR_MINI_SIZE,
-                                                                                       'height' => AVATAR_MINI_SIZE,
-                                                                                       'class' => 'avatar mini photo',
-                                                                                       'alt' =>  ($other->fullname) ?
-                                                                                       $other->fullname :
-                                                                                       $other->nickname));
-                               common_element_end('a');
-                               common_element_end('li');
-                       }
-
-                       common_element_end('ul');
-               }
-
-               if ($subs_count > SUBSCRIPTIONS) {
-                       common_element_start('p', array('id' => 'subscriptions_viewall'));
-
-                       common_element('a', array('href' => common_local_url('subscriptions',
-                                                                                                                                array('nickname' => $profile->nickname)),
-                                                                         'class' => 'moresubscriptions'),
-                                                  _('All subscriptions'));
-                       common_element_end('p');
-               }
-
-               common_element_end('div');
-       }
-
-       function show_statistics($profile) {
-
-               // XXX: WORM cache this
-               $subs = DB_DataObject::factory('subscription');
-               $subs->subscriber = $profile->id;
-               $subs_count = (int) $subs->count() - 1;
-
-               $subbed = DB_DataObject::factory('subscription');
-               $subbed->subscribed = $profile->id;
-               $subbed_count = (int) $subbed->count() - 1;
-
-               $notices = DB_DataObject::factory('notice');
-               $notices->profile_id = $profile->id;
-               $notice_count = (int) $notices->count();
-
-               common_element_start('div', 'statistics');
-               common_element('h2', 'statistics', _('Statistics'));
-
-               # Other stats...?
-               common_element_start('dl', 'statistics');
-               common_element('dt', 'membersince', _('Member since'));
-               common_element('dd', 'membersince', date('j M Y',
-                                                                                                strtotime($profile->created)));
-
-               common_element_start('dt', 'subscriptions');
-               common_element('a', array('href' => common_local_url('subscriptions',
-                                                                                                                        array('nickname' => $profile->nickname))),
-                                          _('Subscriptions'));
-               common_element_end('dt');
-               common_element('dd', 'subscriptions', (is_int($subs_count)) ? $subs_count : '0');
-               common_element_start('dt', 'subscribers');
-               common_element('a', array('href' => common_local_url('subscribers',
-                                                                                                                        array('nickname' => $profile->nickname))),
-                                          _('Subscribers'));
-               common_element_end('dt');
-               common_element('dd', 'subscribers', (is_int($subbed_count)) ? $subbed_count : '0');
-               common_element('dt', 'notices', _('Notices'));
-               common_element('dd', 'notices', (is_int($notice_count)) ? $notice_count : '0');
-               # XXX: link these to something
-               common_element('dt', 'tags', _('Tags'));
-               common_element_start('dd', 'tags');
-               $tags = Profile_tag::getTags($profile->id, $profile->id);
-
-               common_element_start('ul', 'tags xoxo');
-               foreach ($tags as $tag) {
-                       common_element_start('li');
-                       common_element('a', array('rel' => 'bookmark tag',
-                                                                         'href' => common_local_url('peopletag',
-                                                                                                                                array('tag' => $tag))),
-                                                  $tag);
-                       common_element_end('li');
-               }
-               common_element_end('ul');
-           common_element_end('dd');
-
-               common_element_end('dl');
-
-               common_element_end('div');
-       }
-
-       function show_notices($user) {
-
-               $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
-
-               $notice = $user->getNotices(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+        common_element_end('ul');
+
+        common_element_end('div');
+
+        common_element_start('div', array('id' => 'profile_information'));
+
+        if ($profile->fullname) {
+            common_element('h1', array('class' => 'fn'), $profile->fullname . ' (' . $profile->nickname . ')');
+        } else {
+            common_element('h1', array('class' => 'fn nickname'), $profile->nickname);
+        }
+
+        if ($profile->location) {
+            common_element('p', 'location', $profile->location);
+        }
+        if ($profile->bio) {
+            common_element('p', 'description note', $profile->bio);
+        }
+        if ($profile->homepage) {
+            common_element_start('p', 'website');
+            common_element('a', array('href' => $profile->homepage,
+                                      'rel' => 'me', 'class' => 'url'),
+                           $profile->homepage);
+            common_element_end('p');
+        }
+
+        $this->show_statistics($profile);
+
+        common_element_end('div');
+    }
+
+    function show_remote_subscribe_link($profile) {
+        $url = common_local_url('remotesubscribe',
+                                array('nickname' => $profile->nickname));
+        common_element('a', array('href' => $url,
+                                  'id' => 'remotesubscribe'),
+                       _('Subscribe'));
+    }
+
+    function show_unsubscribe_form($profile) {
+        common_element_start('form', array('id' => 'unsubscribe', 'method' => 'post',
+                                           'action' => common_local_url('unsubscribe')));
+        common_hidden('token', common_session_token());
+        common_element('input', array('id' => 'unsubscribeto',
+                                      'name' => 'unsubscribeto',
+                                      'type' => 'hidden',
+                                      'value' => $profile->nickname));
+        common_element('input', array('type' => 'submit',
+                                      'class' => 'submit',
+                                      'value' => _('Unsubscribe')));
+        common_element_end('form');
+    }
+
+    function show_subscriptions($profile) {
+        global $config;
+
+        $subs = DB_DataObject::factory('subscription');
+        $subs->subscriber = $profile->id;
+        $subs->whereAdd('subscribed != ' . $profile->id);
+
+        $subs->orderBy('created DESC');
+
+        # We ask for an extra one to know if we need to do another page
+
+        $subs->limit(0, SUBSCRIPTIONS + 1);
+
+        $subs_count = $subs->find();
+
+        common_element_start('div', array('id' => 'subscriptions'));
+
+        common_element('h2', NULL, _('Subscriptions'));
+
+        if ($subs_count > 0) {
+
+            common_element_start('ul', array('id' => 'subscriptions_avatars'));
+
+            for ($i = 0; $i < min($subs_count, SUBSCRIPTIONS); $i++) {
+
+                if (!$subs->fetch()) {
+                    common_debug('Weirdly, broke out of subscriptions loop early', __FILE__);
+                    break;
+                }
+
+                $other = Profile::staticGet($subs->subscribed);
+
+                if (!$other) {
+                    common_log_db_error($subs, 'SELECT', __FILE__);
+                    continue;
+                }
+
+                common_element_start('li', 'vcard');
+                common_element_start('a', array('title' => ($other->fullname) ?
+                                                $other->fullname :
+                                                $other->nickname,
+                                                'href' => $other->profileurl,
+                                                'rel' => 'contact',
+                                                 'class' => 'subscription fn url'));
+                $avatar = $other->getAvatar(AVATAR_MINI_SIZE);
+                common_element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
+                                            'width' => AVATAR_MINI_SIZE,
+                                            'height' => AVATAR_MINI_SIZE,
+                                            'class' => 'avatar mini photo',
+                                            'alt' =>  ($other->fullname) ?
+                                            $other->fullname :
+                                            $other->nickname));
+                common_element_end('a');
+                common_element_end('li');
+            }
+
+            common_element_end('ul');
+        }
+
+        if ($subs_count > SUBSCRIPTIONS) {
+            common_element_start('p', array('id' => 'subscriptions_viewall'));
+
+            common_element('a', array('href' => common_local_url('subscriptions',
+                                                                 array('nickname' => $profile->nickname)),
+                                      'class' => 'moresubscriptions'),
+                           _('All subscriptions'));
+            common_element_end('p');
+        }
+
+        common_element_end('div');
+    }
+
+    function show_statistics($profile) {
+
+        // XXX: WORM cache this
+        $subs = DB_DataObject::factory('subscription');
+        $subs->subscriber = $profile->id;
+        $subs_count = (int) $subs->count() - 1;
+
+        $subbed = DB_DataObject::factory('subscription');
+        $subbed->subscribed = $profile->id;
+        $subbed_count = (int) $subbed->count() - 1;
+
+        $notices = DB_DataObject::factory('notice');
+        $notices->profile_id = $profile->id;
+        $notice_count = (int) $notices->count();
+
+        common_element_start('div', 'statistics');
+        common_element('h2', 'statistics', _('Statistics'));
+
+        # Other stats...?
+        common_element_start('dl', 'statistics');
+        common_element('dt', 'membersince', _('Member since'));
+        common_element('dd', 'membersince', date('j M Y',
+                                                 strtotime($profile->created)));
+
+        common_element_start('dt', 'subscriptions');
+        common_element('a', array('href' => common_local_url('subscriptions',
+                                                             array('nickname' => $profile->nickname))),
+                       _('Subscriptions'));
+        common_element_end('dt');
+        common_element('dd', 'subscriptions', (is_int($subs_count)) ? $subs_count : '0');
+        common_element_start('dt', 'subscribers');
+        common_element('a', array('href' => common_local_url('subscribers',
+                                                             array('nickname' => $profile->nickname))),
+                       _('Subscribers'));
+        common_element_end('dt');
+        common_element('dd', 'subscribers', (is_int($subbed_count)) ? $subbed_count : '0');
+        common_element('dt', 'notices', _('Notices'));
+        common_element('dd', 'notices', (is_int($notice_count)) ? $notice_count : '0');
+        # XXX: link these to something
+        common_element('dt', 'tags', _('Tags'));
+        common_element_start('dd', 'tags');
+        $tags = Profile_tag::getTags($profile->id, $profile->id);
+
+        common_element_start('ul', 'tags xoxo');
+        foreach ($tags as $tag) {
+            common_element_start('li');
+            common_element('a', array('rel' => 'bookmark tag',
+                                      'href' => common_local_url('peopletag',
+                                                                 array('tag' => $tag))),
+                           $tag);
+            common_element_end('li');
+        }
+        common_element_end('ul');
+        common_element_end('dd');
+
+        common_element_end('dl');
+
+        common_element_end('div');
+    }
+
+    function show_notices($user) {
+
+        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+
+        $notice = $user->getNotices(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
 
         $pnl = new ProfileNoticeList($notice);
         $cnt = $pnl->show();
 
-               common_pagination($page>1, $cnt>NOTICES_PER_PAGE, $page,
-                                                 'showstream', array('nickname' => $user->nickname));
-       }
-
-       function show_last_notice($profile) {
-
-               common_element('h2', NULL, _('Currently'));
-
-               $notice = $profile->getCurrentNotice();
-
-               if ($notice) {
-                       # FIXME: URL, image, video, audio
-                       common_element_start('p', array('class' => 'notice_current'));
-                       if ($notice->rendered) {
-                               common_raw($notice->rendered);
-                       } else {
-                               # XXX: may be some uncooked notices in the DB,
-                               # we cook them right now. This can probably disappear in future
-                               # versions (>> 0.4.x)
-                               common_raw(common_render_content($notice->content, $notice));
-                       }
-                       common_element_end('p');
-               }
-       }
+        common_pagination($page>1, $cnt>NOTICES_PER_PAGE, $page,
+                          'showstream', array('nickname' => $user->nickname));
+    }
+
+    function show_last_notice($profile) {
+
+        common_element('h2', NULL, _('Currently'));
+
+        $notice = $profile->getCurrentNotice();
+
+        if ($notice) {
+            # FIXME: URL, image, video, audio
+            common_element_start('p', array('class' => 'notice_current'));
+            if ($notice->rendered) {
+                common_raw($notice->rendered);
+            } else {
+                # XXX: may be some uncooked notices in the DB,
+                # we cook them right now. This can probably disappear in future
+                # versions (>> 0.4.x)
+                common_raw(common_render_content($notice->content, $notice));
+            }
+            common_element_end('p');
+        }
+    }
 }
 
 # We don't show the author for a profile, since we already know who it is!
index 5db26730a50b1c5f05ccb314dc4dab33c3adba7b..506801e9759b701883794a13e30f33a8b8811ce2 100644 (file)
@@ -24,308 +24,308 @@ require_once(INSTALLDIR.'/actions/emailsettings.php');
 
 class SmssettingsAction extends EmailsettingsAction {
 
-       function get_instructions() {
-               return _('You can receive SMS messages through email from %%site.name%%.');
-       }
-
-       function show_form($msg=NULL, $success=false) {
-               $user = common_current_user();
-               $this->form_header(_('SMS Settings'), $msg, $success);
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'smssettings',
-                                                                                  'action' =>
-                                                                                  common_local_url('smssettings')));
-               common_hidden('token', common_session_token());
-               common_element('h2', NULL, _('Address'));
-
-               if ($user->sms) {
-                       common_element_start('p');
-                       $carrier = $user->getCarrier();
-                       common_element('span', 'address confirmed', $user->sms . ' (' . $carrier->name . ')');
-                       common_element('span', 'input_instructions',
-                                      _('Current confirmed SMS-enabled phone number.'));
-                       common_hidden('sms', $user->sms);
-                       common_hidden('carrier', $user->carrier);
-                       common_element_end('p');
-                       common_submit('remove', _('Remove'));
-               } else {
-                       $confirm = $this->get_confirmation();
-                       if ($confirm) {
-                               $carrier = Sms_carrier::staticGet($confirm->address_extra);
-                               common_element_start('p');
-                               common_element('span', 'address unconfirmed', $confirm->address . ' (' . $carrier->name . ')');
-                               common_element('span', 'input_instructions',
-                                                          _('Awaiting confirmation on this phone number.'));
-                               common_hidden('sms', $confirm->address);
-                               common_hidden('carrier', $confirm->address_extra);
-                               common_element_end('p');
-                               common_submit('cancel', _('Cancel'));
-                               common_input('code', _('Confirmation code'), NULL,
-                                                        _('Enter the code you received on your phone.'));
-                               common_submit('confirm', _('Confirm'));
-                       } else {
-                               common_input('sms', _('SMS Phone number'),
-                                                        ($this->arg('sms')) ? $this->arg('sms') : NULL,
-                                                        _('Phone number, no punctuation or spaces, with area code'));
-                               $this->carrier_select();
-                               common_submit('add', _('Add'));
-                       }
-               }
-
-               if ($user->sms) {
-                       common_element('h2', NULL, _('Incoming email'));
-                       
-                       if ($user->incomingemail) {
-                               common_element_start('p');
-                               common_element('span', 'address', $user->incomingemail);
-                               common_element('span', 'input_instructions',
-                                                          _('Send email to this address to post new notices.'));
-                               common_element_end('p');
-                               common_submit('removeincoming', _('Remove'));
-                       }
-                       
-                       common_element_start('p');
-                       common_element('span', 'input_instructions',
-                                                  _('Make a new email address for posting to; cancels the old one.'));
-                       common_element_end('p');
-                       common_submit('newincoming', _('New'));
-               }
-               
-               common_element('h2', NULL, _('Preferences'));
-               
-               common_checkbox('smsnotify',
-                                               _('Send me notices through SMS; I understand I may incur exorbitant charges from my carrier.'),
-                                               $user->smsnotify);
-                       
-               common_submit('save', _('Save'));
-               
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function get_confirmation() {
-               $user = common_current_user();
-               $confirm = new Confirm_address();
-               $confirm->user_id = $user->id;
-               $confirm->address_type = 'sms';
-               if ($confirm->find(TRUE)) {
-                       return $confirm;
-               } else {
-                       return NULL;
-               }
-       }
-
-       function handle_post() {
-
-               # CSRF protection
-
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               if ($this->arg('save')) {
-                       $this->save_preferences();
-               } else if ($this->arg('add')) {
-                       $this->add_address();
-               } else if ($this->arg('cancel')) {
-                       $this->cancel_confirmation();
-               } else if ($this->arg('remove')) {
-                       $this->remove_address();
-               } else if ($this->arg('removeincoming')) {
-                       $this->remove_incoming();
-               } else if ($this->arg('newincoming')) {
-                       $this->new_incoming();
-               } else if ($this->arg('confirm')) {
-                       $this->confirm_code();
-               } else {
-                       $this->show_form(_('Unexpected form submission.'));
-               }
-       }
-
-       function save_preferences() {
-
-               $smsnotify = $this->boolean('smsnotify');
-               
-               $user = common_current_user();
-
-               assert(!is_null($user)); # should already be checked
-
-               $user->query('BEGIN');
-
-               $original = clone($user);
-
-               $user->smsnotify = $smsnotify;
-
-               $result = $user->update($original);
-
-               if ($result === FALSE) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t update user.'));
-                       return;
-               }
-
-               $user->query('COMMIT');
-
-               $this->show_form(_('Preferences saved.'), true);
-       }
-
-       function add_address() {
-
-               $user = common_current_user();
-
-               $sms = $this->trimmed('sms');
-               $carrier_id = $this->trimmed('carrier');
-               
-               # Some validation
-
-               if (!$sms) {
-                       $this->show_form(_('No phone number.'));
-                       return;
-               }
-
-               if (!$carrier_id) {
-                       $this->show_form(_('No carrier selected.'));
-                       return;
-               }
-               
-               $sms = common_canonical_sms($sms);
-               
-               if ($user->sms == $sms) {
-                   $this->show_form(_('That is already your phone number.'));
-                   return;
-               } else if ($this->sms_exists($sms)) {
-                   $this->show_form(_('That phone number already belongs to another user.'));
-                   return;
-               }
-
-               $confirm = new Confirm_address();
-               $confirm->address = $sms;
-               $confirm->address_extra = $carrier_id;
-               $confirm->address_type = 'sms';
-               $confirm->user_id = $user->id;
-               $confirm->code = common_confirmation_code(40);
-
-               $result = $confirm->insert();
-
-               if ($result === FALSE) {
-                       common_log_db_error($confirm, 'INSERT', __FILE__);
-                       common_server_error(_('Couldn\'t insert confirmation code.'));
-                       return;
-               }
-
-               $carrier = Sms_carrier::staticGet($carrier_id);
-               
-               mail_confirm_sms($confirm->code,
-                                                $user->nickname,
-                                                $carrier->toEmailAddress($sms));
-
-               $msg = _('A confirmation code was sent to the phone number you added. Check your inbox (and spam box!) for the code and instructions on how to use it.');
-
-               $this->show_form($msg, TRUE);
-       }
-
-       function cancel_confirmation() {
-               
-               $sms = $this->trimmed('sms');
-               $carrier = $this->trimmed('carrier');
-               
-               $confirm = $this->get_confirmation();
-               
-               if (!$confirm) {
-                       $this->show_form(_('No pending confirmation to cancel.'));
-                       return;
-               }
-               if ($confirm->address != $sms) {
-                       $this->show_form(_('That is the wrong confirmation number.'));
-                       return;
-               }
+    function get_instructions() {
+        return _('You can receive SMS messages through email from %%site.name%%.');
+    }
+
+    function show_form($msg=NULL, $success=false) {
+        $user = common_current_user();
+        $this->form_header(_('SMS Settings'), $msg, $success);
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'smssettings',
+                                           'action' =>
+                                           common_local_url('smssettings')));
+        common_hidden('token', common_session_token());
+        common_element('h2', NULL, _('Address'));
+
+        if ($user->sms) {
+            common_element_start('p');
+            $carrier = $user->getCarrier();
+            common_element('span', 'address confirmed', $user->sms . ' (' . $carrier->name . ')');
+            common_element('span', 'input_instructions',
+                           _('Current confirmed SMS-enabled phone number.'));
+            common_hidden('sms', $user->sms);
+            common_hidden('carrier', $user->carrier);
+            common_element_end('p');
+            common_submit('remove', _('Remove'));
+        } else {
+            $confirm = $this->get_confirmation();
+            if ($confirm) {
+                $carrier = Sms_carrier::staticGet($confirm->address_extra);
+                common_element_start('p');
+                common_element('span', 'address unconfirmed', $confirm->address . ' (' . $carrier->name . ')');
+                common_element('span', 'input_instructions',
+                               _('Awaiting confirmation on this phone number.'));
+                common_hidden('sms', $confirm->address);
+                common_hidden('carrier', $confirm->address_extra);
+                common_element_end('p');
+                common_submit('cancel', _('Cancel'));
+                common_input('code', _('Confirmation code'), NULL,
+                             _('Enter the code you received on your phone.'));
+                common_submit('confirm', _('Confirm'));
+            } else {
+                common_input('sms', _('SMS Phone number'),
+                             ($this->arg('sms')) ? $this->arg('sms') : NULL,
+                             _('Phone number, no punctuation or spaces, with area code'));
+                $this->carrier_select();
+                common_submit('add', _('Add'));
+            }
+        }
+
+        if ($user->sms) {
+            common_element('h2', NULL, _('Incoming email'));
+            
+            if ($user->incomingemail) {
+                common_element_start('p');
+                common_element('span', 'address', $user->incomingemail);
+                common_element('span', 'input_instructions',
+                               _('Send email to this address to post new notices.'));
+                common_element_end('p');
+                common_submit('removeincoming', _('Remove'));
+            }
+            
+            common_element_start('p');
+            common_element('span', 'input_instructions',
+                           _('Make a new email address for posting to; cancels the old one.'));
+            common_element_end('p');
+            common_submit('newincoming', _('New'));
+        }
+        
+        common_element('h2', NULL, _('Preferences'));
+        
+        common_checkbox('smsnotify',
+                        _('Send me notices through SMS; I understand I may incur exorbitant charges from my carrier.'),
+                        $user->smsnotify);
+            
+        common_submit('save', _('Save'));
+        
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function get_confirmation() {
+        $user = common_current_user();
+        $confirm = new Confirm_address();
+        $confirm->user_id = $user->id;
+        $confirm->address_type = 'sms';
+        if ($confirm->find(TRUE)) {
+            return $confirm;
+        } else {
+            return NULL;
+        }
+    }
+
+    function handle_post() {
+
+        # CSRF protection
+
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        if ($this->arg('save')) {
+            $this->save_preferences();
+        } else if ($this->arg('add')) {
+            $this->add_address();
+        } else if ($this->arg('cancel')) {
+            $this->cancel_confirmation();
+        } else if ($this->arg('remove')) {
+            $this->remove_address();
+        } else if ($this->arg('removeincoming')) {
+            $this->remove_incoming();
+        } else if ($this->arg('newincoming')) {
+            $this->new_incoming();
+        } else if ($this->arg('confirm')) {
+            $this->confirm_code();
+        } else {
+            $this->show_form(_('Unexpected form submission.'));
+        }
+    }
+
+    function save_preferences() {
+
+        $smsnotify = $this->boolean('smsnotify');
+        
+        $user = common_current_user();
+
+        assert(!is_null($user)); # should already be checked
+
+        $user->query('BEGIN');
+
+        $original = clone($user);
+
+        $user->smsnotify = $smsnotify;
+
+        $result = $user->update($original);
+
+        if ($result === FALSE) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t update user.'));
+            return;
+        }
+
+        $user->query('COMMIT');
+
+        $this->show_form(_('Preferences saved.'), true);
+    }
+
+    function add_address() {
+
+        $user = common_current_user();
+
+        $sms = $this->trimmed('sms');
+        $carrier_id = $this->trimmed('carrier');
+        
+        # Some validation
+
+        if (!$sms) {
+            $this->show_form(_('No phone number.'));
+            return;
+        }
+
+        if (!$carrier_id) {
+            $this->show_form(_('No carrier selected.'));
+            return;
+        }
+        
+        $sms = common_canonical_sms($sms);
+        
+        if ($user->sms == $sms) {
+            $this->show_form(_('That is already your phone number.'));
+            return;
+        } else if ($this->sms_exists($sms)) {
+            $this->show_form(_('That phone number already belongs to another user.'));
+            return;
+        }
+
+          $confirm = new Confirm_address();
+           $confirm->address = $sms;
+           $confirm->address_extra = $carrier_id;
+           $confirm->address_type = 'sms';
+           $confirm->user_id = $user->id;
+           $confirm->code = common_confirmation_code(40);
+
+        $result = $confirm->insert();
+
+        if ($result === FALSE) {
+            common_log_db_error($confirm, 'INSERT', __FILE__);
+            common_server_error(_('Couldn\'t insert confirmation code.'));
+            return;
+        }
+
+        $carrier = Sms_carrier::staticGet($carrier_id);
+        
+        mail_confirm_sms($confirm->code,
+                         $user->nickname,
+                         $carrier->toEmailAddress($sms));
+
+        $msg = _('A confirmation code was sent to the phone number you added. Check your inbox (and spam box!) for the code and instructions on how to use it.');
+
+        $this->show_form($msg, TRUE);
+    }
+
+    function cancel_confirmation() {
+        
+        $sms = $this->trimmed('sms');
+        $carrier = $this->trimmed('carrier');
+        
+        $confirm = $this->get_confirmation();
+        
+        if (!$confirm) {
+            $this->show_form(_('No pending confirmation to cancel.'));
+            return;
+        }
+        if ($confirm->address != $sms) {
+            $this->show_form(_('That is the wrong confirmation number.'));
+            return;
+        }
 
         $result = $confirm->delete();
 
         if (!$result) {
-                       common_log_db_error($confirm, 'DELETE', __FILE__);
+            common_log_db_error($confirm, 'DELETE', __FILE__);
             $this->server_error(_('Couldn\'t delete email confirmation.'));
             return;
         }
 
         $this->show_form(_('Confirmation cancelled.'), TRUE);
-       }
-
-       function remove_address() {
-
-               $user = common_current_user();
-               $sms = $this->arg('sms');
-               $carrier = $this->arg('carrier');
-               
-               # Maybe an old tab open...?
-
-               if ($user->sms != $sms) {
-                   $this->show_form(_('That is not your phone number.'));
-                   return;
-               }
-
-               $user->query('BEGIN');
-               $original = clone($user);
-               $user->sms = NULL;
-               $user->carrier = NULL;          
-               $user->smsemail = NULL;         
-               $result = $user->updateKeys($original);
-               if (!$result) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t update user.'));
-                       return;
-               }
-               $user->query('COMMIT');
-
-               $this->show_form(_('The address was removed.'), TRUE);
-       }
-       
-       function sms_exists($sms) {
-               $user = common_current_user();
-               $other = User::staticGet('sms', $sms);
-               if (!$other) {
-                       return false;
-               } else {
-                       return $other->id != $user->id;
-               }
-       }
-
-       function carrier_select() {
-               $carrier = new Sms_carrier();
-               $cnt = $carrier->find();
-
-               common_element_start('p');
-               common_element('label', array('for' => 'carrier'));
-               common_element_start('select', array('name' => 'carrier',
-                                                                                        'id' => 'carrier'));
-               common_element('option', array('value' => 0),
-                                          _('Select a carrier'));
-               while ($carrier->fetch()) {
-                       common_element('option', array('value' => $carrier->id),
-                                                  $carrier->name);
-               }
-               common_element_end('select');
-               common_element_end('p');
-               common_element('span', 'input_instructions',
-                                          sprintf(_('Mobile carrier for your phone. '.
-                                                                'If you know a carrier that accepts ' . 
-                                                                'SMS over email but isn\'t listed here, ' .
-                                                                'send email to let us know at %s.'),
-                                                          common_config('site', 'email')));
-       }
-
-       function confirm_code() {
-               
-               $code = $this->trimmed('code');
-               
-               if (!$code) {
-                       $this->show_form(_('No code entered'));
-                       return;
-               }
-               
-               common_redirect(common_local_url('confirmaddress', 
-                                                                                array('code' => $code)));
-       }
+    }
+
+    function remove_address() {
+
+        $user = common_current_user();
+        $sms = $this->arg('sms');
+        $carrier = $this->arg('carrier');
+        
+        # Maybe an old tab open...?
+
+        if ($user->sms != $sms) {
+            $this->show_form(_('That is not your phone number.'));
+            return;
+        }
+
+        $user->query('BEGIN');
+        $original = clone($user);
+        $user->sms = NULL;
+        $user->carrier = NULL;        
+        $user->smsemail = NULL;        
+        $result = $user->updateKeys($original);
+        if (!$result) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t update user.'));
+            return;
+        }
+        $user->query('COMMIT');
+
+        $this->show_form(_('The address was removed.'), TRUE);
+    }
+    
+    function sms_exists($sms) {
+        $user = common_current_user();
+        $other = User::staticGet('sms', $sms);
+        if (!$other) {
+            return false;
+        } else {
+            return $other->id != $user->id;
+        }
+    }
+
+    function carrier_select() {
+        $carrier = new Sms_carrier();
+        $cnt = $carrier->find();
+
+        common_element_start('p');
+        common_element('label', array('for' => 'carrier'));
+        common_element_start('select', array('name' => 'carrier',
+                                             'id' => 'carrier'));
+        common_element('option', array('value' => 0),
+                       _('Select a carrier'));
+        while ($carrier->fetch()) {
+            common_element('option', array('value' => $carrier->id),
+                           $carrier->name);
+        }
+        common_element_end('select');
+        common_element_end('p');
+        common_element('span', 'input_instructions',
+                       sprintf(_('Mobile carrier for your phone. '.
+                                 'If you know a carrier that accepts ' . 
+                                 'SMS over email but isn\'t listed here, ' .
+                                 'send email to let us know at %s.'),
+                               common_config('site', 'email')));
+    }
+
+    function confirm_code() {
+        
+        $code = $this->trimmed('code');
+        
+        if (!$code) {
+            $this->show_form(_('No code entered'));
+            return;
+        }
+        
+        common_redirect(common_local_url('confirmaddress', 
+                                         array('code' => $code)));
+    }
 }
index e7505e3fef44f1c137878c8efa82e6a132720138..1d095ab9a50b9b5dd050b2b0052d9c6fc730d345 100644 (file)
@@ -32,12 +32,12 @@ class SubeditAction extends Action {
             return false;
         }
 
-               $token = $this->trimmed('token');
+        $token = $this->trimmed('token');
 
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
         $id = $this->trimmed('profile');
 
index 64abda00431c0d9fbcf3a060f17510ade1a44849..c94c4d7eb755ed9e9aaccd9651aa6b1af852c038 100644 (file)
@@ -21,58 +21,58 @@ if (!defined('LACONICA')) { exit(1); }
 
 class SubscribeAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-                       return;
-               }
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+            return;
+        }
 
-               $user = common_current_user();
+        $user = common_current_user();
 
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname)));
-                       return;
-               }
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname)));
+            return;
+        }
 
-               # CSRF protection
+        # CSRF protection
 
-               $token = $this->trimmed('token');
+        $token = $this->trimmed('token');
 
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
-               $other_id = $this->arg('subscribeto');
+        $other_id = $this->arg('subscribeto');
 
         $other = User::staticGet('id', $other_id);
 
         if (!$other) {
-                       $this->client_error(_('Not a local user.'));
-                       return;
+            $this->client_error(_('Not a local user.'));
+            return;
         }
 
-               $result = subs_subscribe_to($user, $other);
+        $result = subs_subscribe_to($user, $other);
 
-               if($result != true) {
-                       common_user_error($result);
-                       return;
-               }
+        if($result != true) {
+            common_user_error($result);
+            return;
+        }
 
-               if ($this->boolean('ajax')) {
-                       common_start_html('text/xml;charset=utf-8', true);
-                       common_element_start('head');
-                       common_element('title', null, _('Subscribed'));
-                       common_element_end('head');
-                       common_element_start('body');
-                       common_unsubscribe_form($other->getProfile());
-                       common_element_end('body');
-                       common_element_end('html');
-               } else {
-                   common_redirect(common_local_url('subscriptions', array('nickname' =>
-                                                                                                                               $user->nickname)));
+        if ($this->boolean('ajax')) {
+            common_start_html('text/xml;charset=utf-8', true);
+            common_element_start('head');
+            common_element('title', null, _('Subscribed'));
+            common_element_end('head');
+            common_element_start('body');
+            common_unsubscribe_form($other->getProfile());
+            common_element_end('body');
+            common_element_end('html');
+        } else {
+            common_redirect(common_local_url('subscriptions', array('nickname' =>
+                                                                $user->nickname)));
         }
-       }
+    }
 }
index ae52526e199115ac2d5aae511fe459fdc302be80..b9ca92af39915001bb792aaa4514d5fd90d31be7 100644 (file)
@@ -23,30 +23,30 @@ require_once(INSTALLDIR.'/lib/gallery.php');
 
 class SubscribersAction extends GalleryAction {
 
-       function gallery_type() {
-               return _('Subscribers');
-       }
-
-       function get_instructions(&$profile) {
-               $user =& common_current_user();
-               if ($user && ($user->id == $profile->id)) {
-                       return _('These are the people who listen to your notices.');
-               } else {
-                       return sprintf(_('These are the people who listen to %s\'s notices.'), $profile->nickname);
-               }
-       }
-
-       function fields() {
-               return array('subscriber', 'subscribed');
-       }
-
-       function div_class() {
-               return 'subscribers';
-       }
-
-       function get_other(&$subs) {
-               return $subs->subscriber;
-       }
+    function gallery_type() {
+        return _('Subscribers');
+    }
+
+    function get_instructions(&$profile) {
+        $user =& common_current_user();
+        if ($user && ($user->id == $profile->id)) {
+            return _('These are the people who listen to your notices.');
+        } else {
+            return sprintf(_('These are the people who listen to %s\'s notices.'), $profile->nickname);
+        }
+    }
+
+    function fields() {
+        return array('subscriber', 'subscribed');
+    }
+
+    function div_class() {
+        return 'subscribers';
+    }
+
+    function get_other(&$subs) {
+        return $subs->subscriber;
+    }
 
     function profile_list_class() {
         return 'SubscribersList';
index f518a1f92deac061e950a6b4730c11356067bc3f..c24f23a0781af44706ebd6ff6f3fc6aec5fc6e93 100644 (file)
@@ -23,30 +23,30 @@ require_once(INSTALLDIR.'/lib/gallery.php');
 
 class SubscriptionsAction extends GalleryAction {
 
-       function gallery_type() {
-               return _('Subscriptions');
-       }
+    function gallery_type() {
+        return _('Subscriptions');
+    }
 
-       function get_instructions(&$profile) {
-               $user =& common_current_user();
-               if ($user && ($user->id == $profile->id)) {
-                       return _('These are the people whose notices you listen to.');
-               } else {
-                       return sprintf(_('These are the people whose notices %s listens to.'), $profile->nickname);
-               }
-       }
+    function get_instructions(&$profile) {
+        $user =& common_current_user();
+        if ($user && ($user->id == $profile->id)) {
+            return _('These are the people whose notices you listen to.');
+        } else {
+            return sprintf(_('These are the people whose notices %s listens to.'), $profile->nickname);
+        }
+    }
 
-       function fields() {
-               return array('subscribed', 'subscriber');
-       }
+    function fields() {
+        return array('subscribed', 'subscriber');
+    }
 
-       function div_class() {
-               return 'subscriptions';
-       }
+    function div_class() {
+        return 'subscriptions';
+    }
 
-       function get_other(&$subs) {
-               return $subs->subscribed;
-       }
+    function get_other(&$subs) {
+        return $subs->subscribed;
+    }
 
     function profile_list_class() {
         return 'SubscriptionsList';
@@ -57,8 +57,8 @@ class SubscriptionsList extends ProfileList {
 
     function show_owner_controls($profile) {
 
-               $sub = Subscription::pkeyGet(array('subscriber' => $this->owner->id,
-                                                                                  'subscribed' => $profile->id));
+        $sub = Subscription::pkeyGet(array('subscriber' => $this->owner->id,
+                                           'subscribed' => $profile->id));
         if (!$sub) {
             return;
         }
index 887017b2a44b222ad6ac47f78a79d761027f87ec..3c9cbea2cb6cc73a500112b986f2811c941829c2 100644 (file)
 if (!defined('LACONICA')) { exit(1); }
 
 class SupAction extends Action {
-       
-       function handle($args) {
-               
-               parent::handle($args);
-               
-               $seconds = $this->trimmed('seconds');
-               
-               if (!$seconds) {
-                       $seconds = 15;
-               }
+    
+    function handle($args) {
+        
+        parent::handle($args);
+        
+        $seconds = $this->trimmed('seconds');
+        
+        if (!$seconds) {
+            $seconds = 15;
+        }
 
-               $updates = $this->get_updates($seconds);
-               
-               header('Content-Type: application/json; charset=utf-8');
-               
-               print json_encode(array('updated_time' => date('c'),
-                                                               'since_time' => date('c', time() - $seconds),
-                                                               'available_periods' => $this->available_periods(),
-                                                               'period' => $seconds,
-                                                               'updates' => $updates));
-       }
-       
-       function available_periods() {
-               static $periods = array(86400, 43200, 21600, 7200,
-                                                               3600, 1800,     600, 300, 120,
-                                                               60, 30, 15); 
-               $available = array();
-               foreach ($periods as $period) {
-                       $available[$period] = common_local_url('sup',
-                                                                                                  array('seconds' => $period));
-               }
-               
-               return $available;
-       }
-       
-       function get_updates($seconds) {
-               $notice = new Notice();
+        $updates = $this->get_updates($seconds);
+        
+        header('Content-Type: application/json; charset=utf-8');
+        
+        print json_encode(array('updated_time' => date('c'),
+                                'since_time' => date('c', time() - $seconds),
+                                'available_periods' => $this->available_periods(),
+                                'period' => $seconds,
+                                'updates' => $updates));
+    }
+    
+    function available_periods() {
+        static $periods = array(86400, 43200, 21600, 7200,
+                                3600, 1800,    600, 300, 120,
+                                60, 30, 15); 
+        $available = array();
+        foreach ($periods as $period) {
+            $available[$period] = common_local_url('sup',
+                                                   array('seconds' => $period));
+        }
+        
+        return $available;
+    }
+    
+    function get_updates($seconds) {
+        $notice = new Notice();
 
-               # XXX: cache this. Depends on how big this protocol becomes;
-               # Re-doing this query every 15 seconds isn't the end of the world.
+        # XXX: cache this. Depends on how big this protocol becomes;
+        # Re-doing this query every 15 seconds isn't the end of the world.
 
-               $notice->query('SELECT profile_id, max(id) AS max_id ' .
-                                          'FROM notice ' .
-                                          'WHERE created > (now() - ' . $seconds . ') ' .
-                                          'GROUP BY profile_id');
-               
-               $updates = array();
-               
-               while ($notice->fetch()) {
-                       $updates[] = array($notice->profile_id, $notice->max_id);
-               }
-               
-               return $updates;
-       }
-       
-       function is_readonly() {
-               return true;
-       }
+        $notice->query('SELECT profile_id, max(id) AS max_id ' .
+                       'FROM notice ' .
+                       'WHERE created > (now() - ' . $seconds . ') ' .
+                       'GROUP BY profile_id');
+        
+        $updates = array();
+        
+        while ($notice->fetch()) {
+            $updates[] = array($notice->profile_id, $notice->max_id);
+        }
+        
+        return $updates;
+    }
+    
+    function is_readonly() {
+        return true;
+    }
 }
index 25cc853c458c099b40fc5c6e29b279a8fbe3cb18..1325b85a58995c2f96b718f55bff4984cadb56e3 100644 (file)
@@ -24,142 +24,142 @@ define('TAGS_PER_PAGE', 100);
 
 class TagAction extends StreamAction {
 
-       function handle($args) {
-
-               parent::handle($args);
-
-               # Looks like we're good; show the header
-
-               if (isset($args['tag']) && $args['tag']) {
-                       $tag = $args['tag'];
-                       common_show_header(sprintf(_("Notices tagged with %s"), $tag),
-                                                          array($this, 'show_header'), $tag,
-                                                          array($this, 'show_top'));
-                       $this->show_notices($tag);
-               } else {
-                       common_show_header(_("Tags"),
-                                                          array($this, 'show_header'), '',
-                                                          array($this, 'show_top'));
-                       $this->show_tags();
-               }
-
-               common_show_footer();
-       }
-
-       function show_header($tag = false) {
-               if ($tag) {
-                       common_element('link', array('rel' => 'alternate',
-                                                                                'href' => common_local_url('tagrss', array('tag' => $tag)),
-                                                                                'type' => 'application/rss+xml',
-                                                                                'title' => sprintf(_('Feed for tag %s'), $tag)));
-               }
-       }
-
-       function get_instructions() {
-               return _('Showing most popular tags from the last week');
-       }
-
-       function show_top($tag = false) {
-               if (!$tag) {
-                       $instr = $this->get_instructions();
-                       $output = common_markup_to_html($instr);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-                       $this->public_views_menu();
-               }
-               else {
-                       $this->show_feeds_list(array(0=>array('href'=>common_local_url('tagrss'),
-                                                                                                 'type' => 'rss',
-                                                                                                 'version' => 'RSS 1.0',
-                                                                                                 'item' => 'tagrss')));
-               }
-       }
-
-       function show_tags()
-       {
-               # This should probably be cached rather than recalculated
-               $tags = DB_DataObject::factory('Notice_tag');
-
-               #Need to clear the selection and then only re-add the field
-               #we are grouping by, otherwise it's not a valid 'group by'
-               #even though MySQL seems to let it slide...
-               $tags->selectAdd();
-               $tags->selectAdd('tag');
-
-               #Add the aggregated columns...
-               $tags->selectAdd('max(notice_id) as last_notice_id');
-               if(common_config('db','type')=='pgsql') {
-                       $calc='sum(exp(-extract(epoch from (now()-created))/%s)) as weight';
-               } else {
-                       $calc='sum(exp(-(now() - created)/%s)) as weight';
-               }
-               $tags->selectAdd(sprintf($calc, common_config('tag', 'dropoff')));
-               $tags->groupBy('tag');
-               $tags->orderBy('weight DESC');
-
-               # $tags->whereAdd('created > "' . strftime('%Y-%m-%d %H:%M:%S', strtotime('-1 MONTH')) . '"');
-
-               $tags->limit(TAGS_PER_PAGE);
-
-               $cnt = $tags->find();
-
-               if ($cnt > 0) {
-                       common_element_start('p', 'tagcloud');
-
-                       $tw = array();
-                       $sum = 0;
-                       while ($tags->fetch()) {
-                               $tw[$tags->tag] = $tags->weight;
-                               $sum += $tags->weight;
-                       }
-
-                       ksort($tw);
-
-                       foreach ($tw as $tag => $weight) {
-                               $this->show_tag($tag, $weight, $weight/$sum);
-                       }
-
-                       common_element_end('p');
-               }
-       }
-
-       function show_tag($tag, $weight, $relative) {
-
-               # XXX: these should probably tune to the size of the site
-               if ($relative > 0.1) {
-                       $cls =  'largest';
-               } else if ($relative > 0.05) {
-                       $cls = 'verylarge';
-               } else if ($relative > 0.02) {
-                       $cls = 'large';
-               } else if ($relative > 0.01) {
-                       $cls = 'medium';
-               } else if ($relative > 0.005) {
-                       $cls = 'small';
-               } else if ($relative > 0.002) {
-                       $cls = 'verysmall';
-               } else {
-                       $cls = 'smallest';
-               }
-
-               common_element('a', array('class' => "$cls weight-$weight relative-$relative",
-                                                                 'href' => common_local_url('tag', array('tag' => $tag))),
-                                          $tag);
-               common_text(' ');
-       }
-
-       function show_notices($tag) {
-
-               $cnt = 0;
-
-               $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
-
-               $notice = Notice_tag::getStream($tag, (($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
+    function handle($args) {
+
+        parent::handle($args);
+
+        # Looks like we're good; show the header
+
+        if (isset($args['tag']) && $args['tag']) {
+            $tag = $args['tag'];
+            common_show_header(sprintf(_("Notices tagged with %s"), $tag),
+                               array($this, 'show_header'), $tag,
+                               array($this, 'show_top'));
+            $this->show_notices($tag);
+        } else {
+            common_show_header(_("Tags"),
+                               array($this, 'show_header'), '',
+                               array($this, 'show_top'));
+            $this->show_tags();
+        }
+
+        common_show_footer();
+    }
+
+    function show_header($tag = false) {
+        if ($tag) {
+            common_element('link', array('rel' => 'alternate',
+                                         'href' => common_local_url('tagrss', array('tag' => $tag)),
+                                         'type' => 'application/rss+xml',
+                                         'title' => sprintf(_('Feed for tag %s'), $tag)));
+        }
+    }
+
+    function get_instructions() {
+        return _('Showing most popular tags from the last week');
+    }
+
+    function show_top($tag = false) {
+        if (!$tag) {
+            $instr = $this->get_instructions();
+            $output = common_markup_to_html($instr);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('div');
+            $this->public_views_menu();
+        }
+        else {
+            $this->show_feeds_list(array(0=>array('href'=>common_local_url('tagrss'),
+                                                  'type' => 'rss',
+                                                  'version' => 'RSS 1.0',
+                                                  'item' => 'tagrss')));
+        }
+    }
+
+    function show_tags()
+    {
+        # This should probably be cached rather than recalculated
+        $tags = DB_DataObject::factory('Notice_tag');
+
+        #Need to clear the selection and then only re-add the field
+        #we are grouping by, otherwise it's not a valid 'group by'
+        #even though MySQL seems to let it slide...
+        $tags->selectAdd();
+        $tags->selectAdd('tag');
+
+        #Add the aggregated columns...
+        $tags->selectAdd('max(notice_id) as last_notice_id');
+        if(common_config('db','type')=='pgsql') {
+            $calc='sum(exp(-extract(epoch from (now()-created))/%s)) as weight';
+        } else {
+            $calc='sum(exp(-(now() - created)/%s)) as weight';
+        }
+        $tags->selectAdd(sprintf($calc, common_config('tag', 'dropoff')));
+        $tags->groupBy('tag');
+        $tags->orderBy('weight DESC');
+
+        # $tags->whereAdd('created > "' . strftime('%Y-%m-%d %H:%M:%S', strtotime('-1 MONTH')) . '"');
+
+        $tags->limit(TAGS_PER_PAGE);
+
+        $cnt = $tags->find();
+
+        if ($cnt > 0) {
+            common_element_start('p', 'tagcloud');
+
+            $tw = array();
+            $sum = 0;
+            while ($tags->fetch()) {
+                $tw[$tags->tag] = $tags->weight;
+                $sum += $tags->weight;
+            }
+
+            ksort($tw);
+
+            foreach ($tw as $tag => $weight) {
+                $this->show_tag($tag, $weight, $weight/$sum);
+            }
+
+            common_element_end('p');
+        }
+    }
+
+    function show_tag($tag, $weight, $relative) {
+
+        # XXX: these should probably tune to the size of the site
+        if ($relative > 0.1) {
+            $cls =  'largest';
+        } else if ($relative > 0.05) {
+            $cls = 'verylarge';
+        } else if ($relative > 0.02) {
+            $cls = 'large';
+        } else if ($relative > 0.01) {
+            $cls = 'medium';
+        } else if ($relative > 0.005) {
+            $cls = 'small';
+        } else if ($relative > 0.002) {
+            $cls = 'verysmall';
+        } else {
+            $cls = 'smallest';
+        }
+
+        common_element('a', array('class' => "$cls weight-$weight relative-$relative",
+                                  'href' => common_local_url('tag', array('tag' => $tag))),
+                       $tag);
+        common_text(' ');
+    }
+
+    function show_notices($tag) {
+
+        $cnt = 0;
+
+        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+
+        $notice = Notice_tag::getStream($tag, (($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
 
         $cnt = $this->show_notice_list($notice);
 
-               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'tag', array('tag' => $tag));
-       }
+        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'tag', array('tag' => $tag));
+    }
 }
index a4449dd690aa9ecfde08a1ef196156bc420c2b22..832671ae75bf11c512ffbf49f7b5454d0becfa1d 100644 (file)
@@ -23,171 +23,171 @@ require_once(INSTALLDIR.'/lib/settingsaction.php');
 
 class TagotherAction extends Action {
 
-       function handle($args) {
-
-               parent::handle($args);
-
-               if (!common_logged_in()) {
-                       $this->client_error(_('Not logged in'), 403);
-                       return;
-               }
-
-               if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $this->save_tags();
-               } else {
-                       $id = $this->trimmed('id');
-                       if (!$id) {
-                               $this->client_error(_('No id argument.'));
-                               return;
-                       }
-                       $profile = Profile::staticGet('id', $id);
-                       if (!$profile) {
-                               $this->client_error(_('No profile with that ID.'));
-                               return;
-                       }
-                       $this->show_form($profile);
-               }
-       }
-
-       function show_form($profile, $error=NULL) {
-
-               $user = common_current_user();
-
-               common_show_header(_('Tag a person'),
-                                                  NULL, array($profile, $error), array($this, 'show_top'));
-
-               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-
-               common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
-                                                                       'class' => 'avatar stream',
-                                                                       'width' => AVATAR_PROFILE_SIZE,
-                                                                       'height' => AVATAR_PROFILE_SIZE,
-                                                                       'alt' =>
-                                                                       ($profile->fullname) ? $profile->fullname :
-                                                                       $profile->nickname));
-
-               common_element('a', array('href' => $profile->profileurl,
-                                                                 'class' => 'external profile nickname'),
-                                          $profile->nickname);
-
-               if ($profile->fullname) {
-                       common_element_start('div', 'fullname');
-                       if ($profile->homepage) {
-                               common_element('a', array('href' => $profile->homepage),
-                                                          $profile->fullname);
-                       } else {
-                               common_text($profile->fullname);
-                       }
-                       common_element_end('div');
-               }
-               if ($profile->location) {
-                       common_element('div', 'location', $profile->location);
-               }
-               if ($profile->bio) {
-                       common_element('div', 'bio', $profile->bio);
-               }
-
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'tag_user',
-                                                                                  'name' => 'tagother',
-                                                                                  'action' => $this->self_url()));
-               common_hidden('token', common_session_token());
-               common_hidden('id', $profile->id);
-               common_input('tags', _('Tags'),
-                                        ($this->arg('tags')) ? $this->arg('tags') : implode(' ', Profile_tag::getTags($user->id, $profile->id)),
-                                        _('Tags for this user (letters, numbers, -, ., and _), comma- or space- separated'));
-
-               common_submit('save', _('Save'));
-               common_element_end('form');
-               common_show_footer();
-
-       }
-
-       function save_tags() {
-
-               $id = $this->trimmed('id');
-               $tagstring = $this->trimmed('tags');
-               $token = $this->trimmed('token');
-
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               $profile = Profile::staticGet('id', $id);
-
-               if (!$profile) {
-                       $this->client_error(_('No such profile.'));
-                       return;
-               }
-
-               if (is_string($tagstring) && strlen($tagstring) > 0) {
-
-                       $tags = array_map('common_canonical_tag',
-                                                         preg_split('/[\s,]+/', $tagstring));
-
-                       foreach ($tags as $tag) {
-                               if (!common_valid_profile_tag($tag)) {
-                                       $this->show_form($profile, sprintf(_('Invalid tag: "%s"'), $tag));
-                                       return;
-                               }
-                       }
-               } else {
-                       $tags = array();
-               }
-
-               $user = common_current_user();
-
-               if (!Subscription::pkeyGet(array('subscriber' => $user->id,
-                                                                                'subscribed' => $profile->id)) &&
-                       !Subscription::pkeyGet(array('subscriber' => $profile->id,
-                                                                                'subscribed' => $user->id)))
-               {
-                       $this->client_error(_('You can only tag people you are subscribed to or who are subscribed to you.'));
-                       return;
-               }
-
-               $result = Profile_tag::setTags($user->id, $profile->id, $tags);
-
-               if (!$result) {
-                       $this->client_error(_('Could not save tags.'));
-                       return;
-               }
-
-               $action = $user->isSubscribed($profile) ? 'subscriptions' : 'subscribers';
-
-               if ($this->boolean('ajax')) {
-                       common_start_html('text/xml');
-                       common_element_start('head');
-                       common_element('title', null, _('Tags'));
-                       common_element_end('head');
-                       common_element_start('body');
-                       common_element_start('p', 'subtags');
-                       foreach ($tags as $tag) {
-                               common_element('a', array('href' => common_local_url($action,
-                                                                                                                                        array('nickname' => $user->nickname,
-                                                                                                                                                  'tag' => $tag))),
-                                                          $tag);
-                       }
-                       common_element_end('p');
-                       common_element_end('body');
-                       common_element_end('html');
-               } else {
-                       common_redirect(common_local_url($action, array('nickname' =>
-                                                                                                                       $user->nickname)));
+    function handle($args) {
+
+        parent::handle($args);
+
+        if (!common_logged_in()) {
+            $this->client_error(_('Not logged in'), 403);
+            return;
+        }
+
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->save_tags();
+        } else {
+            $id = $this->trimmed('id');
+            if (!$id) {
+                $this->client_error(_('No id argument.'));
+                return;
+            }
+            $profile = Profile::staticGet('id', $id);
+            if (!$profile) {
+                $this->client_error(_('No profile with that ID.'));
+                return;
+            }
+            $this->show_form($profile);
+        }
+    }
+
+    function show_form($profile, $error=NULL) {
+
+        $user = common_current_user();
+
+        common_show_header(_('Tag a person'),
+                           NULL, array($profile, $error), array($this, 'show_top'));
+
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+
+        common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
+                                    'class' => 'avatar stream',
+                                    'width' => AVATAR_PROFILE_SIZE,
+                                    'height' => AVATAR_PROFILE_SIZE,
+                                    'alt' =>
+                                    ($profile->fullname) ? $profile->fullname :
+                                    $profile->nickname));
+
+        common_element('a', array('href' => $profile->profileurl,
+                                  'class' => 'external profile nickname'),
+                       $profile->nickname);
+
+        if ($profile->fullname) {
+            common_element_start('div', 'fullname');
+            if ($profile->homepage) {
+                common_element('a', array('href' => $profile->homepage),
+                               $profile->fullname);
+            } else {
+                common_text($profile->fullname);
+            }
+            common_element_end('div');
+        }
+        if ($profile->location) {
+            common_element('div', 'location', $profile->location);
+        }
+        if ($profile->bio) {
+            common_element('div', 'bio', $profile->bio);
+        }
+
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'tag_user',
+                                           'name' => 'tagother',
+                                           'action' => $this->self_url()));
+        common_hidden('token', common_session_token());
+        common_hidden('id', $profile->id);
+        common_input('tags', _('Tags'),
+                     ($this->arg('tags')) ? $this->arg('tags') : implode(' ', Profile_tag::getTags($user->id, $profile->id)),
+                     _('Tags for this user (letters, numbers, -, ., and _), comma- or space- separated'));
+
+        common_submit('save', _('Save'));
+        common_element_end('form');
+        common_show_footer();
+
+    }
+
+    function save_tags() {
+
+        $id = $this->trimmed('id');
+        $tagstring = $this->trimmed('tags');
+        $token = $this->trimmed('token');
+
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        $profile = Profile::staticGet('id', $id);
+
+        if (!$profile) {
+            $this->client_error(_('No such profile.'));
+            return;
+        }
+
+        if (is_string($tagstring) && strlen($tagstring) > 0) {
+
+            $tags = array_map('common_canonical_tag',
+                              preg_split('/[\s,]+/', $tagstring));
+
+            foreach ($tags as $tag) {
+                if (!common_valid_profile_tag($tag)) {
+                    $this->show_form($profile, sprintf(_('Invalid tag: "%s"'), $tag));
+                    return;
+                }
+            }
+        } else {
+            $tags = array();
+        }
+
+        $user = common_current_user();
+
+        if (!Subscription::pkeyGet(array('subscriber' => $user->id,
+                                         'subscribed' => $profile->id)) &&
+            !Subscription::pkeyGet(array('subscriber' => $profile->id,
+                                         'subscribed' => $user->id)))
+        {
+            $this->client_error(_('You can only tag people you are subscribed to or who are subscribed to you.'));
+            return;
+        }
+
+        $result = Profile_tag::setTags($user->id, $profile->id, $tags);
+
+        if (!$result) {
+            $this->client_error(_('Could not save tags.'));
+            return;
+        }
+
+        $action = $user->isSubscribed($profile) ? 'subscriptions' : 'subscribers';
+
+        if ($this->boolean('ajax')) {
+            common_start_html('text/xml');
+            common_element_start('head');
+            common_element('title', null, _('Tags'));
+            common_element_end('head');
+            common_element_start('body');
+            common_element_start('p', 'subtags');
+            foreach ($tags as $tag) {
+                common_element('a', array('href' => common_local_url($action,
+                                                                     array('nickname' => $user->nickname,
+                                                                           'tag' => $tag))),
+                               $tag);
+            }
+            common_element_end('p');
+            common_element_end('body');
+            common_element_end('html');
+        } else {
+            common_redirect(common_local_url($action, array('nickname' =>
+                                                            $user->nickname)));
+        }
+    }
+
+    function show_top($arr = NULL) {
+        list($profile, $error) = $arr;
+        if ($error) {
+            common_element('p', 'error', $error);
+        } else {
+            common_element_start('div', 'instructions');
+            common_element('p', NULL,
+                           _('Use this form to add tags to your subscribers or subscriptions.'));
+            common_element_end('div');
         }
-       }
-
-       function show_top($arr = NULL) {
-               list($profile, $error) = $arr;
-               if ($error) {
-                       common_element('p', 'error', $error);
-               } else {
-                       common_element_start('div', 'instructions');
-                       common_element('p', NULL,
-                                                  _('Use this form to add tags to your subscribers or subscriptions.'));
-                       common_element_end('div');
-               }
-       }
+    }
 }
 
index 9187bdc873e1f53a21e111192839c3de6d7aee43..45639fec4826a47d745703d544483a2ad29ce91a 100644 (file)
@@ -25,41 +25,41 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class TagrssAction extends Rss10Action {
 
-       function init() {
-               $tag = $this->trimmed('tag');
-               $this->tag = Notice_tag::staticGet('tag', $tag);
+    function init() {
+        $tag = $this->trimmed('tag');
+        $this->tag = Notice_tag::staticGet('tag', $tag);
 
-               if (!$this->tag) {
-                       common_user_error(_('No such tag.'));
-                       return false;
-               } else {
-                       return true;
-               }
-       }
+        if (!$this->tag) {
+            common_user_error(_('No such tag.'));
+            return false;
+        } else {
+            return true;
+        }
+    }
 
-       function get_notices($limit=0) {
-               $tag = $this->tag;
+    function get_notices($limit=0) {
+        $tag = $this->tag;
 
-               if (is_null($tag)) {
-                       return NULL;
-               }
+        if (is_null($tag)) {
+            return NULL;
+        }
 
-               $notice = Notice_tag::getStream($tag->tag, 0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
+        $notice = Notice_tag::getStream($tag->tag, 0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
 
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
 
-               return $notices;
-       }
+        return $notices;
+    }
 
-       function get_channel() {
-               $tag = $this->tag->tag;
+    function get_channel() {
+        $tag = $this->tag->tag;
 
-               $c = array('url' => common_local_url('tagrss', array('tag' => $tagname)),
-                          'title' => $tagname,
-                          'link' => common_local_url('tagrss', array('tag' => $tagname)),
-                          'description' => sprintf(_('Microblog tagged with %s'), $tagname));
-               return $c;
-       }
+        $c = array('url' => common_local_url('tagrss', array('tag' => $tagname)),
+               'title' => $tagname,
+               'link' => common_local_url('tagrss', array('tag' => $tagname)),
+               'description' => sprintf(_('Microblog tagged with %s'), $tagname));
+        return $c;
+    }
 }
index f6e955828e306b60425d44c9b5fa6867fb98d949..b1caa34814d81ba5f03f2699c9b364fb7e410554 100644 (file)
@@ -23,74 +23,74 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class TwitapiaccountAction extends TwitterapiAction {
 
-       function verify_credentials($args, $apidata) {
-               parent::handle($args);
+    function verify_credentials($args, $apidata) {
+        parent::handle($args);
 
-               if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-                       common_user_error(_('API method not found!'), $code = 404);
-                       return;
-               }
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            common_user_error(_('API method not found!'), $code = 404);
+            return;
+        }
 
-               $this->show_extended_profile($apidata['user'], $apidata);
-       }
+        $this->show_extended_profile($apidata['user'], $apidata);
+    }
 
-       function end_session($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
+    function end_session($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
 
-       function update_location($args, $apidata) {
-               parent::handle($args);
+    function update_location($args, $apidata) {
+        parent::handle($args);
 
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
-                       return;
-               }
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
+            return;
+        }
 
-               $location = trim($this->arg('location'));
+        $location = trim($this->arg('location'));
 
-               if (!is_null($location) && strlen($location) > 255) {
+        if (!is_null($location) && strlen($location) > 255) {
 
-                       // XXX: But Twitter just truncates and runs with it. -- Zach
-                       $this->client_error(_('That\'s too long. Max notice size is 255 chars.'), 406, $apidate['content-type']);
-                       return;
-               }
+            // XXX: But Twitter just truncates and runs with it. -- Zach
+            $this->client_error(_('That\'s too long. Max notice size is 255 chars.'), 406, $apidate['content-type']);
+            return;
+        }
 
-               $user = $apidata['user'];
-               $profile = $user->getProfile();
+        $user = $apidata['user'];
+        $profile = $user->getProfile();
 
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
 
-               $orig_profile = clone($profile);
-               $profile->location = $location;
+        $orig_profile = clone($profile);
+        $profile->location = $location;
 
-               $result = $profile->update($orig_profile);
+        $result = $profile->update($orig_profile);
 
-               if (!$result) {
-                       common_log_db_error($profile, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t save profile.'));
-                       return;
-               }
+        if (!$result) {
+            common_log_db_error($profile, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t save profile.'));
+            return;
+        }
 
-               common_broadcast_profile($profile);
-               $type = $apidata['content-type'];
+        common_broadcast_profile($profile);
+        $type = $apidata['content-type'];
 
-               $this->init_document($type);
-               $this->show_profile($profile, $type);
-               $this->end_document($type);
-       }
+        $this->init_document($type);
+        $this->show_profile($profile, $type);
+        $this->end_document($type);
+    }
 
 
-       function update_delivery_device($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
+    function update_delivery_device($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
 
-       function rate_limit_status($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
+    function rate_limit_status($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
 }
\ No newline at end of file
index 4852ff9388c90f3bfb399cf7a5709e4a48b3f6d1..16b2e76bc26759e52cb4dd5937b3c11781840d1a 100644 (file)
@@ -23,15 +23,15 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class TwitapiblocksAction extends TwitterapiAction {
 
-       function create($args, $apidata) {
+    function create($args, $apidata) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               $blockee = $this->get_user($apidata['api_arg'], $apidata);
+        $blockee = $this->get_user($apidata['api_arg'], $apidata);
 
         if (!$blockee) {
-                       $this->client_error('Not Found', 404, $apidata['content-type']);
-                       return;
+            $this->client_error('Not Found', 404, $apidata['content-type']);
+            return;
         }
 
         $user = $apidata['user'];
@@ -42,17 +42,17 @@ class TwitapiblocksAction extends TwitterapiAction {
             $this->show_profile($blockee, $type);
             $this->end_document($type);
         } else {
-                       common_server_error(_('Block user failed.'));
+            common_server_error(_('Block user failed.'));
         }
-       }
+    }
 
-       function destroy($args, $apidata) {
-               parent::handle($args);
-               $blockee = $this->get_user($apidata['api_arg'], $apidata);
+    function destroy($args, $apidata) {
+        parent::handle($args);
+        $blockee = $this->get_user($apidata['api_arg'], $apidata);
 
         if (!$blockee) {
-                       $this->client_error('Not Found', 404, $apidata['content-type']);
-                       return;
+            $this->client_error('Not Found', 404, $apidata['content-type']);
+            return;
         }
 
         $user = $apidata['user'];
@@ -63,7 +63,7 @@ class TwitapiblocksAction extends TwitterapiAction {
             $this->show_profile($blockee, $type);
             $this->end_document($type);
         } else {
-                       common_server_error(_('Unblock user failed.'));
+            common_server_error(_('Unblock user failed.'));
         }
-       }
+    }
 }
\ No newline at end of file
index 535795ca4321d6351edca4dbe6d2d2e3ced8ef2b..2e3b50173575a30bf9955fc9f61a6a5aaa2be343 100644 (file)
@@ -23,265 +23,265 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class Twitapidirect_messagesAction extends TwitterapiAction {
 
-       function direct_messages($args, $apidata) {
-               parent::handle($args);
-               return $this->show_messages($args, $apidata, 'received');
-       }
-
-       function sent($args, $apidata) {
-               parent::handle($args);
-               return $this->show_messages($args, $apidata, 'sent');
-       }
-
-       function show_messages($args, $apidata, $type) {
-
-               $user = $apidata['user'];
-
-               $count = $this->arg('count');
-               $since = $this->arg('since');
-               $since_id = $this->arg('since_id');
-               $before_id = $this->arg('before_id');
-
-               $page = $this->arg('page');
-
-               if (!$page) {
-                       $page = 1;
-               }
-
-               if (!$count) {
-                       $count = 20;
-               }
-
-               $message = new Message();
-
-               $title = null;
-               $subtitle = null;
-               $link = null;
-               $server = common_root_url();
-
-               if ($type == 'received') {
-                       $message->to_profile = $user->id;
-                       $title = sprintf(_("Direct messages to %s"), $user->nickname);
-                       $subtitle = sprintf(_("All the direct messages sent to %s"), $user->nickname);
-                       $link = $server . $user->nickname . '/inbox';
-               } else {
-                       $message->from_profile = $user->id;
-                       $title = _('Direct Messages You\'ve Sent');
-                       $subtitle = sprintf(_("All the direct messages sent from %s"), $user->nickname);
-                       $link = $server . $user->nickname . '/outbox';
-               }
-
-               if ($before_id) {
-                       $message->whereAdd("id < $before_id");
-               }
-
-               if ($since_id) {
-                       $message->whereAdd("id > $since_id");
-               }
-
-               $since = strtotime($this->arg('since'));
-
-               if ($since) {
-                       $d = date('Y-m-d H:i:s', $since);
-                       $message->whereAdd("created > '$d'");
-               }
-
-               $message->orderBy('created DESC, id DESC');
-               $message->limit((($page-1)*20), $count);
-               $message->find();
-
-               switch($apidata['content-type']) {
-                case 'xml':
-                       $this->show_xml_dmsgs($message);
-                       break;
-                case 'rss':
-                       $this->show_rss_dmsgs($message, $title, $link, $subtitle);
-                       break;
-                case 'atom':
-                       $this->show_atom_dmsgs($message, $title, $link, $subtitle);
-                       break;
-                case 'json':
-                       $this->show_json_dmsgs($message);
-                       break;
-                default:
-                       common_user_error(_('API method not found!'), $code = 404);
-               }
-
-       }
-
-       // had to change this from "new" to "create" to avoid PHP reserved word
-       function create($args, $apidata) {
-               parent::handle($args);
-
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
-                       return;
-               }
-
-               $user = $apidata['user'];
-               $source = $this->trimmed('source');      // Not supported by Twitter.
+    function direct_messages($args, $apidata) {
+        parent::handle($args);
+        return $this->show_messages($args, $apidata, 'received');
+    }
+
+    function sent($args, $apidata) {
+        parent::handle($args);
+        return $this->show_messages($args, $apidata, 'sent');
+    }
+
+    function show_messages($args, $apidata, $type) {
+
+        $user = $apidata['user'];
+
+        $count = $this->arg('count');
+        $since = $this->arg('since');
+        $since_id = $this->arg('since_id');
+        $before_id = $this->arg('before_id');
+
+        $page = $this->arg('page');
+
+        if (!$page) {
+            $page = 1;
+        }
+
+        if (!$count) {
+            $count = 20;
+        }
+
+        $message = new Message();
+
+        $title = null;
+        $subtitle = null;
+        $link = null;
+        $server = common_root_url();
+
+        if ($type == 'received') {
+            $message->to_profile = $user->id;
+            $title = sprintf(_("Direct messages to %s"), $user->nickname);
+            $subtitle = sprintf(_("All the direct messages sent to %s"), $user->nickname);
+            $link = $server . $user->nickname . '/inbox';
+        } else {
+            $message->from_profile = $user->id;
+            $title = _('Direct Messages You\'ve Sent');
+            $subtitle = sprintf(_("All the direct messages sent from %s"), $user->nickname);
+            $link = $server . $user->nickname . '/outbox';
+        }
+
+        if ($before_id) {
+            $message->whereAdd("id < $before_id");
+        }
+
+        if ($since_id) {
+            $message->whereAdd("id > $since_id");
+        }
+
+        $since = strtotime($this->arg('since'));
+
+        if ($since) {
+            $d = date('Y-m-d H:i:s', $since);
+            $message->whereAdd("created > '$d'");
+        }
+
+        $message->orderBy('created DESC, id DESC');
+        $message->limit((($page-1)*20), $count);
+        $message->find();
+
+        switch($apidata['content-type']) {
+         case 'xml':
+            $this->show_xml_dmsgs($message);
+            break;
+         case 'rss':
+            $this->show_rss_dmsgs($message, $title, $link, $subtitle);
+            break;
+         case 'atom':
+            $this->show_atom_dmsgs($message, $title, $link, $subtitle);
+            break;
+         case 'json':
+            $this->show_json_dmsgs($message);
+            break;
+         default:
+            common_user_error(_('API method not found!'), $code = 404);
+        }
+
+    }
+
+    // had to change this from "new" to "create" to avoid PHP reserved word
+    function create($args, $apidata) {
+        parent::handle($args);
+
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
+            return;
+        }
+
+        $user = $apidata['user'];
+        $source = $this->trimmed('source');     // Not supported by Twitter.
 
         $reserved_sources = array('web', 'omb', 'mail', 'xmpp', 'api');
-               if (!$source || in_array($source, $reserved_sources)) {
-                       $source = 'api';
-               }
-
-               $content = $this->trimmed('text');
-
-               if (!$content) {
-                       $this->client_error(_('No message text!'), $code = 406, $apidata['content-type']);
-               } else {
-                       $content_shortened = common_shorten_links($content);
-                       if (mb_strlen($content_shortened) > 140) {
-                               $this->client_error(_('That\'s too long. Max message size is 140 chars.'),
-                                       $code = 406, $apidata['content-type']);
-                               return;
-                       }
-               }
-
-               $other = $this->get_user($this->trimmed('user'));
-
-               if (!$other) {
-                       $this->client_error(_('Recipient user not found.'), $code = 403, $apidata['content-type']);
-                       return;
-               } else if (!$user->mutuallySubscribed($other)) {
-                       $this->client_error(_('Can\'t send direct messages to users who aren\'t your friend.'),
-                               $code = 403, $apidata['content-type']);
-                       return;
-               } else if ($user->id == $other->id) {
-                       // Sending msgs to yourself is allowed by Twitter
-                       $this->client_error(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'),
-                               $code = 403, $apidata['content-type']);
-                       return;
-               }
-
-               $message = Message::saveNew($user->id, $other->id,
-                       html_entity_decode($content, ENT_NOQUOTES, 'UTF-8'), $source);
-
-               if (is_string($message)) {
-                       $this->server_error($message);
-                       return;
-               }
-
-               $this->notify($user, $other, $message);
-
-               if ($apidata['content-type'] == 'xml') {
-                       $this->show_single_xml_dmsg($message);
-               } elseif ($apidata['content-type'] == 'json') {
-                       $this->show_single_json_dmsg($message);
-               }
-
-       }
-
-       function destroy($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
-
-       function show_xml_dmsgs($message) {
-
-               $this->init_document('xml');
-               common_element_start('direct-messages', array('type' => 'array'));
-
-               if (is_array($messages)) {
-                       foreach ($message as $m) {
-                               $twitter_dm = $this->twitter_dmsg_array($m);
-                               $this->show_twitter_xml_dmsg($twitter_dm);
-                       }
-               } else {
-                       while ($message->fetch()) {
-                               $twitter_dm = $this->twitter_dmsg_array($message);
-                               $this->show_twitter_xml_dmsg($twitter_dm);
-                       }
-               }
-
-               common_element_end('direct-messages');
-               $this->end_document('xml');
-
-       }
-
-       function show_json_dmsgs($message) {
-
-               $this->init_document('json');
-
-               $dmsgs = array();
-
-               if (is_array($message)) {
-                       foreach ($message as $m) {
-                               $twitter_dm = $this->twitter_dmsg_array($m);
-                               array_push($dmsgs, $twitter_dm);
-                       }
-               } else {
-                       while ($message->fetch()) {
-                               $twitter_dm = $this->twitter_dmsg_array($message);
-                               array_push($dmsgs, $twitter_dm);
-                       }
-               }
-
-               $this->show_json_objects($dmsgs);
-               $this->end_document('json');
-
-       }
-
-       function show_rss_dmsgs($message, $title, $link, $subtitle) {
-
-               $this->init_document('rss');
-
-               common_element_start('channel');
-               common_element('title', NULL, $title);
-
-               common_element('link', NULL, $link);
-               common_element('description', NULL, $subtitle);
-               common_element('language', NULL, 'en-us');
-               common_element('ttl', NULL, '40');
-
-               if (is_array($message)) {
-                       foreach ($message as $m) {
-                               $entry = $this->twitter_rss_dmsg_array($m);
-                               $this->show_twitter_rss_item($entry);
-                       }
-               } else {
-                       while ($message->fetch()) {
-                               $entry = $this->twitter_rss_dmsg_array($message);
-                               $this->show_twitter_rss_item($entry);
-                       }
-               }
-
-               common_element_end('channel');
-               $this->end_twitter_rss();
-
-       }
-
-       function show_atom_dmsgs($message, $title, $link, $subtitle) {
-
-               $this->init_document('atom');
-
-               common_element('title', NULL, $title);
-               $siteserver = common_config('site', 'server');
-               common_element('id', NULL, "tag:$siteserver,2008:DirectMessage");
-               common_element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), NULL);
-               common_element('updated', NULL, common_date_iso8601(strftime('%c')));
-               common_element('subtitle', NULL, $subtitle);
-
-               if (is_array($message)) {
-                       foreach ($message as $m) {
-                               $entry = $this->twitter_rss_dmsg_array($m);
-                               $this->show_twitter_atom_entry($entry);
-                       }
-               } else {
-                       while ($message->fetch()) {
-                               $entry = $this->twitter_rss_dmsg_array($message);
-                               $this->show_twitter_atom_entry($entry);
-                       }
-               }
-
-               $this->end_document('atom');
-       }
-
-       // swiped from MessageAction. Should it be place in util.php?
-       function notify($from, $to, $message) {
-               mail_notify_message($message, $from, $to);
-               # XXX: Jabber, SMS notifications... probably queued
-       }
+        if (!$source || in_array($source, $reserved_sources)) {
+            $source = 'api';
+        }
+
+        $content = $this->trimmed('text');
+
+        if (!$content) {
+            $this->client_error(_('No message text!'), $code = 406, $apidata['content-type']);
+        } else {
+            $content_shortened = common_shorten_links($content);
+            if (mb_strlen($content_shortened) > 140) {
+                $this->client_error(_('That\'s too long. Max message size is 140 chars.'),
+                    $code = 406, $apidata['content-type']);
+                return;
+            }
+        }
+
+        $other = $this->get_user($this->trimmed('user'));
+
+        if (!$other) {
+            $this->client_error(_('Recipient user not found.'), $code = 403, $apidata['content-type']);
+            return;
+        } else if (!$user->mutuallySubscribed($other)) {
+            $this->client_error(_('Can\'t send direct messages to users who aren\'t your friend.'),
+                $code = 403, $apidata['content-type']);
+            return;
+        } else if ($user->id == $other->id) {
+            // Sending msgs to yourself is allowed by Twitter
+            $this->client_error(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'),
+                $code = 403, $apidata['content-type']);
+            return;
+        }
+
+        $message = Message::saveNew($user->id, $other->id,
+            html_entity_decode($content, ENT_NOQUOTES, 'UTF-8'), $source);
+
+        if (is_string($message)) {
+            $this->server_error($message);
+            return;
+        }
+
+        $this->notify($user, $other, $message);
+
+        if ($apidata['content-type'] == 'xml') {
+            $this->show_single_xml_dmsg($message);
+        } elseif ($apidata['content-type'] == 'json') {
+            $this->show_single_json_dmsg($message);
+        }
+
+    }
+
+    function destroy($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
+
+    function show_xml_dmsgs($message) {
+
+        $this->init_document('xml');
+        common_element_start('direct-messages', array('type' => 'array'));
+
+        if (is_array($messages)) {
+            foreach ($message as $m) {
+                $twitter_dm = $this->twitter_dmsg_array($m);
+                $this->show_twitter_xml_dmsg($twitter_dm);
+            }
+        } else {
+            while ($message->fetch()) {
+                $twitter_dm = $this->twitter_dmsg_array($message);
+                $this->show_twitter_xml_dmsg($twitter_dm);
+            }
+        }
+
+        common_element_end('direct-messages');
+        $this->end_document('xml');
+
+    }
+
+    function show_json_dmsgs($message) {
+
+        $this->init_document('json');
+
+        $dmsgs = array();
+
+        if (is_array($message)) {
+            foreach ($message as $m) {
+                $twitter_dm = $this->twitter_dmsg_array($m);
+                array_push($dmsgs, $twitter_dm);
+            }
+        } else {
+            while ($message->fetch()) {
+                $twitter_dm = $this->twitter_dmsg_array($message);
+                array_push($dmsgs, $twitter_dm);
+            }
+        }
+
+        $this->show_json_objects($dmsgs);
+        $this->end_document('json');
+
+    }
+
+    function show_rss_dmsgs($message, $title, $link, $subtitle) {
+
+        $this->init_document('rss');
+
+        common_element_start('channel');
+        common_element('title', NULL, $title);
+
+        common_element('link', NULL, $link);
+        common_element('description', NULL, $subtitle);
+        common_element('language', NULL, 'en-us');
+        common_element('ttl', NULL, '40');
+
+        if (is_array($message)) {
+            foreach ($message as $m) {
+                $entry = $this->twitter_rss_dmsg_array($m);
+                $this->show_twitter_rss_item($entry);
+            }
+        } else {
+            while ($message->fetch()) {
+                $entry = $this->twitter_rss_dmsg_array($message);
+                $this->show_twitter_rss_item($entry);
+            }
+        }
+
+        common_element_end('channel');
+        $this->end_twitter_rss();
+
+    }
+
+    function show_atom_dmsgs($message, $title, $link, $subtitle) {
+
+        $this->init_document('atom');
+
+        common_element('title', NULL, $title);
+        $siteserver = common_config('site', 'server');
+        common_element('id', NULL, "tag:$siteserver,2008:DirectMessage");
+        common_element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), NULL);
+        common_element('updated', NULL, common_date_iso8601(strftime('%c')));
+        common_element('subtitle', NULL, $subtitle);
+
+        if (is_array($message)) {
+            foreach ($message as $m) {
+                $entry = $this->twitter_rss_dmsg_array($m);
+                $this->show_twitter_atom_entry($entry);
+            }
+        } else {
+            while ($message->fetch()) {
+                $entry = $this->twitter_rss_dmsg_array($message);
+                $this->show_twitter_atom_entry($entry);
+            }
+        }
+
+        $this->end_document('atom');
+    }
+
+    // swiped from MessageAction. Should it be place in util.php?
+    function notify($from, $to, $message) {
+        mail_notify_message($message, $from, $to);
+        # XXX: Jabber, SMS notifications... probably queued
+    }
 
 }
index 3eaff327a1c202d684106ad70876ce9fefb9e192..ad8c5f18b1823cac6a3ea322b24f09a8bb21890e 100644 (file)
@@ -23,153 +23,153 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class TwitapifavoritesAction extends TwitterapiAction {
 
-       function favorites($args, $apidata) {
-               parent::handle($args);
-
-               $this->auth_user = $apidata['user'];
-               $user = $this->get_user($apidata['api_arg'], $apidata);
-
-               if (!$user) {
-                       $this->client_error('Not Found', 404, $apidata['content-type']);
-                       return;
-               }
-
-               $profile = $user->getProfile();
-
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
-
-               $page = $this->arg('page');
-
-               if (!$page) {
-                       $page = 1;
-               }
-
-               if (!$count) {
-                       $count = 20;
-               }
-
-               $notice = $user->favoriteNotices((($page-1)*20), $count);
-
-               if (!$notice) {
-                       common_server_error(_('Could not retrieve favorite notices.'));
-                       return;
-               }
-
-               $sitename = common_config('site', 'name');
-               $siteserver = common_config('site', 'server');
-
-               $title = sprintf(_('%s / Favorites from %s'), $sitename, $user->nickname);
-               $id = "tag:$siteserver:favorites:".$user->id;
-               $link = common_local_url('favorites', array('nickname' => $user->nickname));
-               $subtitle = sprintf(_('%s updates favorited by %s / %s.'), $sitename, $profile->getBestName(), $user->nickname);
-
-               switch($apidata['content-type']) {
-                case 'xml':
-                       $this->show_xml_timeline($notice);
-                       break;
-                case 'rss':
-                       $this->show_rss_timeline($notice, $title, $link, $subtitle);
-                       break;
-                case 'atom':
-                       $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
-                       break;
-                case 'json':
-                       $this->show_json_timeline($notice);
-                       break;
-                default:
-                       common_user_error(_('API method not found!'), $code = 404);
-               }
-
-       }
-
-       function create($args, $apidata) {
-               parent::handle($args);
-
-               // Check for RESTfulness
-               if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
-                       // XXX: Twitter just prints the err msg, no XML / JSON.
-                       $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
-                       return;
-               }
-
-               if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-                       common_user_error(_('API method not found!'), $code = 404);
-                       return;
-               }
-
-               $this->auth_user = $apidata['user'];
-               $user = $this->auth_user;
-               $notice_id = $apidata['api_arg'];
-               $notice = Notice::staticGet($notice_id);
-
-               if (!$notice) {
-                       $this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']);
-                       return;
-               }
-
-               // XXX: Twitter lets you fave things repeatedly via api.
-               if ($user->hasFave($notice)) {
-                       $this->client_error(_('This notice is already a favorite!'), 403, $apidata['content-type']);
-                       return;
-               }
-
-               $fave = Fave::addNew($user, $notice);
-
-               if (!$fave) {
-                       common_server_error(_('Could not create favorite.'));
-                       return;
-               }
-
-               $this->notify($fave, $notice, $user);
-               $user->blowFavesCache();
-
-               if ($apidata['content-type'] == 'xml') {
-                       $this->show_single_xml_status($notice);
-               } elseif ($apidata['content-type'] == 'json') {
-                       $this->show_single_json_status($notice);
-               }
-
-       }
-
-       function destroy($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
-
-       // XXX: these two funcs swiped from faves.  Maybe put in util.php, or some common base class?
-
-       function notify($fave, $notice, $user) {
-           $other = User::staticGet('id', $notice->profile_id);
-               if ($other && $other->id != $user->id) {
-                       if ($other->email && $other->emailnotifyfav) {
-                               $this->notify_mail($other, $user, $notice);
-                       }
-                       # XXX: notify by IM
-                       # XXX: notify by SMS
-               }
-       }
-
-       function notify_mail($other, $user, $notice) {
-               $profile = $user->getProfile();
-               $bestname = $profile->getBestName();
-               $subject = sprintf(_('%s added your notice as a favorite'), $bestname);
-               $body = sprintf(_("%1\$s just added your notice from %2\$s as one of their favorites.\n\n" .
-                                                 "In case you forgot, you can see the text of your notice here:\n\n" .
-                                                 "%3\$s\n\n" .
-                                                 "You can see the list of %1\$s's favorites here:\n\n" .
-                                                 "%4\$s\n\n" .
-                                                 "Faithfully yours,\n" .
-                                                 "%5\$s\n"),
-                                               $bestname,
-                                               common_exact_date($notice->created),
-                                               common_local_url('shownotice', array('notice' => $notice->id)),
-                                               common_local_url('showfavorites', array('nickname' => $user->nickname)),
-                                               common_config('site', 'name'));
-
-               mail_to_user($other, $subject, $body);
-       }
+    function favorites($args, $apidata) {
+        parent::handle($args);
+
+        $this->auth_user = $apidata['user'];
+        $user = $this->get_user($apidata['api_arg'], $apidata);
+
+        if (!$user) {
+            $this->client_error('Not Found', 404, $apidata['content-type']);
+            return;
+        }
+
+        $profile = $user->getProfile();
+
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
+
+        $page = $this->arg('page');
+
+        if (!$page) {
+            $page = 1;
+        }
+
+        if (!$count) {
+            $count = 20;
+        }
+
+        $notice = $user->favoriteNotices((($page-1)*20), $count);
+
+        if (!$notice) {
+            common_server_error(_('Could not retrieve favorite notices.'));
+            return;
+        }
+
+        $sitename = common_config('site', 'name');
+        $siteserver = common_config('site', 'server');
+
+        $title = sprintf(_('%s / Favorites from %s'), $sitename, $user->nickname);
+        $id = "tag:$siteserver:favorites:".$user->id;
+        $link = common_local_url('favorites', array('nickname' => $user->nickname));
+        $subtitle = sprintf(_('%s updates favorited by %s / %s.'), $sitename, $profile->getBestName(), $user->nickname);
+
+        switch($apidata['content-type']) {
+         case 'xml':
+            $this->show_xml_timeline($notice);
+            break;
+         case 'rss':
+            $this->show_rss_timeline($notice, $title, $link, $subtitle);
+            break;
+         case 'atom':
+            $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
+            break;
+         case 'json':
+            $this->show_json_timeline($notice);
+            break;
+         default:
+            common_user_error(_('API method not found!'), $code = 404);
+        }
+
+    }
+
+    function create($args, $apidata) {
+        parent::handle($args);
+
+        // Check for RESTfulness
+        if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
+            // XXX: Twitter just prints the err msg, no XML / JSON.
+            $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
+            return;
+        }
+
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            common_user_error(_('API method not found!'), $code = 404);
+            return;
+        }
+
+        $this->auth_user = $apidata['user'];
+        $user = $this->auth_user;
+        $notice_id = $apidata['api_arg'];
+        $notice = Notice::staticGet($notice_id);
+
+        if (!$notice) {
+            $this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']);
+            return;
+        }
+
+        // XXX: Twitter lets you fave things repeatedly via api.
+        if ($user->hasFave($notice)) {
+            $this->client_error(_('This notice is already a favorite!'), 403, $apidata['content-type']);
+            return;
+        }
+
+        $fave = Fave::addNew($user, $notice);
+
+        if (!$fave) {
+            common_server_error(_('Could not create favorite.'));
+            return;
+        }
+
+        $this->notify($fave, $notice, $user);
+        $user->blowFavesCache();
+
+        if ($apidata['content-type'] == 'xml') {
+            $this->show_single_xml_status($notice);
+        } elseif ($apidata['content-type'] == 'json') {
+            $this->show_single_json_status($notice);
+        }
+
+    }
+
+    function destroy($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
+
+    // XXX: these two funcs swiped from faves.  Maybe put in util.php, or some common base class?
+
+    function notify($fave, $notice, $user) {
+        $other = User::staticGet('id', $notice->profile_id);
+        if ($other && $other->id != $user->id) {
+            if ($other->email && $other->emailnotifyfav) {
+                $this->notify_mail($other, $user, $notice);
+            }
+            # XXX: notify by IM
+            # XXX: notify by SMS
+        }
+    }
+
+    function notify_mail($other, $user, $notice) {
+        $profile = $user->getProfile();
+        $bestname = $profile->getBestName();
+        $subject = sprintf(_('%s added your notice as a favorite'), $bestname);
+        $body = sprintf(_("%1\$s just added your notice from %2\$s as one of their favorites.\n\n" .
+                          "In case you forgot, you can see the text of your notice here:\n\n" .
+                          "%3\$s\n\n" .
+                          "You can see the list of %1\$s's favorites here:\n\n" .
+                          "%4\$s\n\n" .
+                          "Faithfully yours,\n" .
+                          "%5\$s\n"),
+                        $bestname,
+                        common_exact_date($notice->created),
+                        common_local_url('shownotice', array('notice' => $notice->id)),
+                        common_local_url('showfavorites', array('nickname' => $user->nickname)),
+                        common_config('site', 'name'));
+
+        mail_to_user($other, $subject, $body);
+    }
 
 }
\ No newline at end of file
index e4b49cbe4a92529cc2c470b2779ec68dfa8b96f4..d352b933b9d320713f79f65f4d16b907ee70afd9 100644 (file)
@@ -23,133 +23,133 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class TwitapifriendshipsAction extends TwitterapiAction {
 
-       function create($args, $apidata) {
-               parent::handle($args);
+    function create($args, $apidata) {
+        parent::handle($args);
 
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
-                       return;
-               }
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
+            return;
+        }
 
-               $id = $apidata['api_arg'];
+        $id = $apidata['api_arg'];
 
-               $other = $this->get_user($id);
+        $other = $this->get_user($id);
 
-               if (!$other) {
-                       $this->client_error(_('Could not follow user: User not found.'), 403, $apidata['content-type']);
-                       return;
-               }
+        if (!$other) {
+            $this->client_error(_('Could not follow user: User not found.'), 403, $apidata['content-type']);
+            return;
+        }
 
-               $user = $apidata['user'];
+        $user = $apidata['user'];
 
-               if ($user->isSubscribed($other)) {
-                       $errmsg = sprintf(_('Could not follow user: %s is already on your list.'), $other->nickname);
-                       $this->client_error($errmsg, 403, $apidata['content-type']);
-                       return;
-               }
+        if ($user->isSubscribed($other)) {
+            $errmsg = sprintf(_('Could not follow user: %s is already on your list.'), $other->nickname);
+            $this->client_error($errmsg, 403, $apidata['content-type']);
+            return;
+        }
 
-               $sub = new Subscription();
+        $sub = new Subscription();
 
-               $sub->query('BEGIN');
+        $sub->query('BEGIN');
 
-               $sub->subscriber = $user->id;
-               $sub->subscribed = $other->id;
-               $sub->created = DB_DataObject_Cast::dateTime(); # current time
+        $sub->subscriber = $user->id;
+        $sub->subscribed = $other->id;
+        $sub->created = DB_DataObject_Cast::dateTime(); # current time
 
-               $result = $sub->insert();
+        $result = $sub->insert();
 
-               if (!$result) {
-                       $errmsg = sprintf(_('Could not follow user: %s is already on your list.'), $other->nickname);
-                       $this->client_error($errmsg, 400, $apidata['content-type']);
-                       return;
-               }
+        if (!$result) {
+            $errmsg = sprintf(_('Could not follow user: %s is already on your list.'), $other->nickname);
+            $this->client_error($errmsg, 400, $apidata['content-type']);
+            return;
+        }
 
-               $sub->query('COMMIT');
+        $sub->query('COMMIT');
 
-               mail_subscribe_notify($other, $user);
+        mail_subscribe_notify($other, $user);
 
-               $type = $apidata['content-type'];
-               $this->init_document($type);
-               $this->show_profile($other, $type);
-               $this->end_document($type);
+        $type = $apidata['content-type'];
+        $this->init_document($type);
+        $this->show_profile($other, $type);
+        $this->end_document($type);
 
-       }
+    }
 
-       function destroy($args, $apidata) {
-               parent::handle($args);
+    function destroy($args, $apidata) {
+        parent::handle($args);
 
-               if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
-                       $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
-                       return;
-               }
+        if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
+            $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
+            return;
+        }
 
-               $id = $apidata['api_arg'];
+        $id = $apidata['api_arg'];
 
-               # We can't subscribe to a remote person, but we can unsub
+        # We can't subscribe to a remote person, but we can unsub
 
-               $other = $this->get_profile($id);
-               $user = $apidata['user'];
+        $other = $this->get_profile($id);
+        $user = $apidata['user'];
 
-               $sub = new Subscription();
-               $sub->subscriber = $user->id;
-               $sub->subscribed = $other->id;
+        $sub = new Subscription();
+        $sub->subscriber = $user->id;
+        $sub->subscribed = $other->id;
 
-               if ($sub->find(TRUE)) {
-                       $sub->query('BEGIN');
-                       $sub->delete();
-                       $sub->query('COMMIT');
-               } else {
-                       $this->client_error(_('You are not friends with the specified user.'), 403, $apidata['content-type']);
-                       return;
-               }
+        if ($sub->find(TRUE)) {
+            $sub->query('BEGIN');
+            $sub->delete();
+            $sub->query('COMMIT');
+        } else {
+            $this->client_error(_('You are not friends with the specified user.'), 403, $apidata['content-type']);
+            return;
+        }
 
-               $type = $apidata['content-type'];
-               $this->init_document($type);
-               $this->show_profile($other, $type);
-               $this->end_document($type);
+        $type = $apidata['content-type'];
+        $this->init_document($type);
+        $this->show_profile($other, $type);
+        $this->end_document($type);
 
-       }
+    }
 
-       function exists($args, $apidata) {
-               parent::handle($args);
+    function exists($args, $apidata) {
+        parent::handle($args);
 
-               if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-                       common_user_error(_('API method not found!'), $code = 404);
-                       return;
-               }
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            common_user_error(_('API method not found!'), $code = 404);
+            return;
+        }
 
-               $user_a_id = $this->trimmed('user_a');
-               $user_b_id = $this->trimmed('user_b');
+        $user_a_id = $this->trimmed('user_a');
+        $user_b_id = $this->trimmed('user_b');
 
-               $user_a = $this->get_user($user_a_id);
-               $user_b = $this->get_user($user_b_id);
+        $user_a = $this->get_user($user_a_id);
+        $user_b = $this->get_user($user_b_id);
 
-               if (!$user_a || !$user_b) {
-                       $this->client_error(_('Two user ids or screen_names must be supplied.'), 400, $apidata['content-type']);
-                       return;
-               }
+        if (!$user_a || !$user_b) {
+            $this->client_error(_('Two user ids or screen_names must be supplied.'), 400, $apidata['content-type']);
+            return;
+        }
 
-               if ($user_a->isSubscribed($user_b)) {
-                       $result = 'true';
-               } else {
-                       $result = 'false';
-               }
+        if ($user_a->isSubscribed($user_b)) {
+            $result = 'true';
+        } else {
+            $result = 'false';
+        }
 
-               switch ($apidata['content-type']) {
-                case 'xml':
-                       $this->init_document('xml');
-                       common_element('friends', NULL, $result);
-                       $this->end_document('xml');
-                       break;
-                case 'json':
-                       $this->init_document('json');
-                       print json_encode($result);
-                       $this->end_document('json');
-                       break;
-                default:
-                       break;
-               }
+        switch ($apidata['content-type']) {
+         case 'xml':
+            $this->init_document('xml');
+            common_element('friends', NULL, $result);
+            $this->end_document('xml');
+            break;
+         case 'json':
+            $this->init_document('json');
+            print json_encode($result);
+            $this->end_document('json');
+            break;
+         default:
+            break;
+        }
 
-       }
+    }
 
 }
\ No newline at end of file
index c5d503e11864cadd33f23dacaa6cafe4dec17302..d268b7c8224f7b7fac4811e31ca8e0c0e1ce7f1f 100644 (file)
@@ -23,30 +23,30 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class TwitapihelpAction extends TwitterapiAction {
 
-       /* Returns the string "ok" in the requested format with a 200 OK HTTP status code.
-        * URL:http://identi.ca/api/help/test.format
-        * Formats: xml, json
-        */
-       function test($args, $apidata) {
-               parent::handle($args);
-
-               if ($apidata['content-type'] == 'xml') {
-                       $this->init_document('xml');
-                       common_element('ok', NULL, 'true');
-                       $this->end_document('xml');
-               } elseif ($apidata['content-type'] == 'json') {
-                       $this->init_document('json');
-                       print '"ok"';
-                       $this->end_document('json');
-               } else {
-                       common_user_error(_('API method not found!'), $code=404);
-               }
-
-       }
-
-       function downtime_schedule($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
+    /* Returns the string "ok" in the requested format with a 200 OK HTTP status code.
+     * URL:http://identi.ca/api/help/test.format
+     * Formats: xml, json
+     */
+    function test($args, $apidata) {
+        parent::handle($args);
+
+        if ($apidata['content-type'] == 'xml') {
+            $this->init_document('xml');
+            common_element('ok', NULL, 'true');
+            $this->end_document('xml');
+        } elseif ($apidata['content-type'] == 'json') {
+            $this->init_document('json');
+            print '"ok"';
+            $this->end_document('json');
+        } else {
+            common_user_error(_('API method not found!'), $code=404);
+        }
+
+    }
+
+    function downtime_schedule($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
 
 }
\ No newline at end of file
index 8d93309a25a7149db9d18dcf19dda3451d5f8fa1..26f66d7e51ef2491351bc7548aeda445f5b7b493 100644 (file)
@@ -24,14 +24,14 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 # This naming convention looks real sick
 class TwitapinotificationsAction extends TwitterapiAction {
 
-       function follow($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
+    function follow($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
 
-       function leave($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
+    function leave($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
 
 }
\ No newline at end of file
index 7b6598b108e8fc8d4d2d74173cf05f63bc20fb35..c33643a3ce23123b7c7a7e1186094a5385869825 100644 (file)
@@ -23,541 +23,541 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class TwitapistatusesAction extends TwitterapiAction {
 
-       function public_timeline($args, $apidata) {
-               parent::handle($args);
-
-               $sitename = common_config('site', 'name');
-               $siteserver = common_config('site', 'server');
-               $title = sprintf(_("%s public timeline"), $sitename);
-               $id = "tag:$siteserver:Statuses";
-               $link = common_root_url();
-               $subtitle = sprintf(_("%s updates from everyone!"), $sitename);
-
-               // Number of public statuses to return by default -- Twitter sends 20
-               $MAX_PUBSTATUSES = 20;
-
-               // FIXME: To really live up to the spec we need to build a list
-               // of notices by users who have custom avatars, so fix this SQL -- Zach
-
-               $page = $this->arg('page');
-               $since_id = $this->arg('since_id');
-               $before_id = $this->arg('before_id');
-
-               // NOTE: page, since_id, and before_id are extensions to Twitter API -- TB
-               if (!$page) {
-                       $page = 1;
-               }
-               if (!$since_id) {
-                       $since_id = 0;
-               }
-               if (!$before_id) {
-                       $before_id = 0;
-               }
-
-               $since = strtotime($this->arg('since'));
-
-               $notice = Notice::publicStream((($page-1)*$MAX_PUBSTATUSES), $MAX_PUBSTATUSES, $since_id, $before_id, $since);
-
-               if ($notice) {
-
-                       switch($apidata['content-type']) {
-                               case 'xml':
-                                       $this->show_xml_timeline($notice);
-                                       break;
-                               case 'rss':
-                                       $this->show_rss_timeline($notice, $title, $link, $subtitle);
-                                       break;
-                               case 'atom':
-                                       $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
-                                       break;
-                               case 'json':
-                                       $this->show_json_timeline($notice);
-                                       break;
-                               default:
-                                       common_user_error(_('API method not found!'), $code = 404);
-                                       break;
-                       }
-
-               } else {
-                       common_server_error(_('Couldn\'t find any statuses.'), $code = 503);
-               }
-
-       }
-
-       function friends_timeline($args, $apidata) {
-               parent::handle($args);
-
-               $since = $this->arg('since');
-               $since_id = $this->arg('since_id');
-               $count = $this->arg('count');
-               $page = $this->arg('page');
-               $before_id = $this->arg('before_id');
-
-               if (!$page) {
-                       $page = 1;
-               }
-
-               if (!$count) {
-                       $count = 20;
-               }
-
-               if (!$since_id) {
-                       $since_id = 0;
-               }
-
-               // NOTE: before_id is an extension to Twitter API -- TB
-               if (!$before_id) {
-                       $before_id = 0;
-               }
-
-               $since = strtotime($this->arg('since'));
-
-               $user = $this->get_user(NULL, $apidata);
-               $this->auth_user = $user;
-
-               $profile = $user->getProfile();
-
-               $sitename = common_config('site', 'name');
-               $siteserver = common_config('site', 'server');
-
-               $title = sprintf(_("%s and friends"), $user->nickname);
-               $id = "tag:$siteserver:friends:" . $user->id;
-               $link = common_local_url('all', array('nickname' => $user->nickname));
-               $subtitle = sprintf(_('Updates from %1$s and friends on %2$s!'), $user->nickname, $sitename);
-
-               $notice = $user->noticesWithFriends(($page-1)*20, $count, $since_id, $before_id, $since);
-
-               switch($apidata['content-type']) {
-                case 'xml':
-                       $this->show_xml_timeline($notice);
-                       break;
-                case 'rss':
-                       $this->show_rss_timeline($notice, $title, $link, $subtitle);
-                       break;
-                case 'atom':
-                       $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
-                       break;
-                case 'json':
-                       $this->show_json_timeline($notice);
-                       break;
-                default:
-                       common_user_error(_('API method not found!'), $code = 404);
-               }
-
-       }
-
-       function user_timeline($args, $apidata) {
-               parent::handle($args);
-
-               $this->auth_user = $apidata['user'];
-               $user = $this->get_user($apidata['api_arg'], $apidata);
-
-               if (!$user) {
-                       $this->client_error('Not Found', 404, $apidata['content-type']);
-                       return;
-               }
-
-               $profile = $user->getProfile();
-
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
-
-               $count = $this->arg('count');
-               $since = $this->arg('since');
-               $since_id = $this->arg('since_id');
-               $page = $this->arg('page');
-               $before_id = $this->arg('before_id');
-
-               if (!$page) {
-                       $page = 1;
-               }
-
-               if (!$count) {
-                       $count = 20;
-               }
-
-               if (!$since_id) {
-                       $since_id = 0;
-               }
-
-               // NOTE: before_id is an extensions to Twitter API -- TB
-               if (!$before_id) {
-                       $before_id = 0;
-               }
-
-               $since = strtotime($this->arg('since'));
-
-               $sitename = common_config('site', 'name');
-               $siteserver = common_config('site', 'server');
-
-               $title = sprintf(_("%s timeline"), $user->nickname);
-               $id = "tag:$siteserver:user:".$user->id;
-               $link = common_local_url('showstream', array('nickname' => $user->nickname));
-               $subtitle = sprintf(_('Updates from %1$s on %2$s!'), $user->nickname, $sitename);
-
-               # FriendFeed's SUP protocol
-               # Also added RSS and Atom feeds
-
-               $suplink = common_local_url('sup', NULL, $user->id);
-               header('X-SUP-ID: '.$suplink);
-
-               # XXX: since
-
-               $notice = $user->getNotices((($page-1)*20), $count, $since_id, $before_id, $since);
-
-               switch($apidata['content-type']) {
-                case 'xml':
-                       $this->show_xml_timeline($notice);
-                       break;
-                case 'rss':
-                       $this->show_rss_timeline($notice, $title, $link, $subtitle, $suplink);
-                       break;
-                case 'atom':
-                       $this->show_atom_timeline($notice, $title, $id, $link, $subtitle, $suplink);
-                       break;
-                case 'json':
-                       $this->show_json_timeline($notice);
-                       break;
-                default:
-                       common_user_error(_('API method not found!'), $code = 404);
-               }
-
-       }
-
-       function update($args, $apidata) {
-
-               parent::handle($args);
-
-               if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-                       common_user_error(_('API method not found!'), $code = 404);
-                       return;
-               }
-
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
-                       return;
-               }
-
-               $this->auth_user = $apidata['user'];
-               $user = $this->auth_user;
-               $status = $this->trimmed('status');
-               $source = $this->trimmed('source');
-               $in_reply_to_status_id = intval($this->trimmed('in_reply_to_status_id'));
+    function public_timeline($args, $apidata) {
+        parent::handle($args);
+
+        $sitename = common_config('site', 'name');
+        $siteserver = common_config('site', 'server');
+        $title = sprintf(_("%s public timeline"), $sitename);
+        $id = "tag:$siteserver:Statuses";
+        $link = common_root_url();
+        $subtitle = sprintf(_("%s updates from everyone!"), $sitename);
+
+        // Number of public statuses to return by default -- Twitter sends 20
+        $MAX_PUBSTATUSES = 20;
+
+        // FIXME: To really live up to the spec we need to build a list
+        // of notices by users who have custom avatars, so fix this SQL -- Zach
+
+        $page = $this->arg('page');
+        $since_id = $this->arg('since_id');
+        $before_id = $this->arg('before_id');
+
+        // NOTE: page, since_id, and before_id are extensions to Twitter API -- TB
+        if (!$page) {
+            $page = 1;
+        }
+        if (!$since_id) {
+            $since_id = 0;
+        }
+        if (!$before_id) {
+            $before_id = 0;
+        }
+
+        $since = strtotime($this->arg('since'));
+
+        $notice = Notice::publicStream((($page-1)*$MAX_PUBSTATUSES), $MAX_PUBSTATUSES, $since_id, $before_id, $since);
+
+        if ($notice) {
+
+            switch($apidata['content-type']) {
+                case 'xml':
+                    $this->show_xml_timeline($notice);
+                    break;
+                case 'rss':
+                    $this->show_rss_timeline($notice, $title, $link, $subtitle);
+                    break;
+                case 'atom':
+                    $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
+                    break;
+                case 'json':
+                    $this->show_json_timeline($notice);
+                    break;
+                default:
+                    common_user_error(_('API method not found!'), $code = 404);
+                    break;
+            }
+
+        } else {
+            common_server_error(_('Couldn\'t find any statuses.'), $code = 503);
+        }
+
+    }
+
+    function friends_timeline($args, $apidata) {
+        parent::handle($args);
+
+        $since = $this->arg('since');
+        $since_id = $this->arg('since_id');
+        $count = $this->arg('count');
+        $page = $this->arg('page');
+        $before_id = $this->arg('before_id');
+
+        if (!$page) {
+            $page = 1;
+        }
+
+        if (!$count) {
+            $count = 20;
+        }
+
+        if (!$since_id) {
+            $since_id = 0;
+        }
+
+        // NOTE: before_id is an extension to Twitter API -- TB
+        if (!$before_id) {
+            $before_id = 0;
+        }
+
+        $since = strtotime($this->arg('since'));
+
+        $user = $this->get_user(NULL, $apidata);
+        $this->auth_user = $user;
+
+        $profile = $user->getProfile();
+
+        $sitename = common_config('site', 'name');
+        $siteserver = common_config('site', 'server');
+
+        $title = sprintf(_("%s and friends"), $user->nickname);
+        $id = "tag:$siteserver:friends:" . $user->id;
+        $link = common_local_url('all', array('nickname' => $user->nickname));
+        $subtitle = sprintf(_('Updates from %1$s and friends on %2$s!'), $user->nickname, $sitename);
+
+        $notice = $user->noticesWithFriends(($page-1)*20, $count, $since_id, $before_id, $since);
+
+        switch($apidata['content-type']) {
+         case 'xml':
+            $this->show_xml_timeline($notice);
+            break;
+         case 'rss':
+            $this->show_rss_timeline($notice, $title, $link, $subtitle);
+            break;
+         case 'atom':
+            $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
+            break;
+         case 'json':
+            $this->show_json_timeline($notice);
+            break;
+         default:
+            common_user_error(_('API method not found!'), $code = 404);
+        }
+
+    }
+
+    function user_timeline($args, $apidata) {
+        parent::handle($args);
+
+        $this->auth_user = $apidata['user'];
+        $user = $this->get_user($apidata['api_arg'], $apidata);
+
+        if (!$user) {
+            $this->client_error('Not Found', 404, $apidata['content-type']);
+            return;
+        }
+
+        $profile = $user->getProfile();
+
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
+
+        $count = $this->arg('count');
+        $since = $this->arg('since');
+        $since_id = $this->arg('since_id');
+        $page = $this->arg('page');
+        $before_id = $this->arg('before_id');
+
+        if (!$page) {
+            $page = 1;
+        }
+
+        if (!$count) {
+            $count = 20;
+        }
+
+        if (!$since_id) {
+            $since_id = 0;
+        }
+
+        // NOTE: before_id is an extensions to Twitter API -- TB
+        if (!$before_id) {
+            $before_id = 0;
+        }
+
+        $since = strtotime($this->arg('since'));
+
+        $sitename = common_config('site', 'name');
+        $siteserver = common_config('site', 'server');
+
+        $title = sprintf(_("%s timeline"), $user->nickname);
+        $id = "tag:$siteserver:user:".$user->id;
+        $link = common_local_url('showstream', array('nickname' => $user->nickname));
+        $subtitle = sprintf(_('Updates from %1$s on %2$s!'), $user->nickname, $sitename);
+
+        # FriendFeed's SUP protocol
+        # Also added RSS and Atom feeds
+
+        $suplink = common_local_url('sup', NULL, $user->id);
+        header('X-SUP-ID: '.$suplink);
+
+        # XXX: since
+
+        $notice = $user->getNotices((($page-1)*20), $count, $since_id, $before_id, $since);
+
+        switch($apidata['content-type']) {
+         case 'xml':
+            $this->show_xml_timeline($notice);
+            break;
+         case 'rss':
+            $this->show_rss_timeline($notice, $title, $link, $subtitle, $suplink);
+            break;
+         case 'atom':
+            $this->show_atom_timeline($notice, $title, $id, $link, $subtitle, $suplink);
+            break;
+         case 'json':
+            $this->show_json_timeline($notice);
+            break;
+         default:
+            common_user_error(_('API method not found!'), $code = 404);
+        }
+
+    }
+
+    function update($args, $apidata) {
+
+        parent::handle($args);
+
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            common_user_error(_('API method not found!'), $code = 404);
+            return;
+        }
+
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
+            return;
+        }
+
+        $this->auth_user = $apidata['user'];
+        $user = $this->auth_user;
+        $status = $this->trimmed('status');
+        $source = $this->trimmed('source');
+        $in_reply_to_status_id = intval($this->trimmed('in_reply_to_status_id'));
         $reserved_sources = array('web', 'omb', 'mail', 'xmpp', 'api');
-               if (!$source || in_array($source, $reserved_sources)) {
-                       $source = 'api';
-               }
+        if (!$source || in_array($source, $reserved_sources)) {
+            $source = 'api';
+        }
 
-               if (!$status) {
+        if (!$status) {
 
-                       // XXX: Note: In this case, Twitter simply returns '200 OK'
-                       // No error is given, but the status is not posted to the
-                       // user's timeline.      Seems bad.      Shouldn't we throw an
-                       // errror? -- Zach
-                       return;
+            // XXX: Note: In this case, Twitter simply returns '200 OK'
+            // No error is given, but the status is not posted to the
+            // user's timeline.     Seems bad.     Shouldn't we throw an
+            // errror? -- Zach
+            return;
 
-               } else {
+        } else {
 
-                       $status_shortened = common_shorten_links($status);
+            $status_shortened = common_shorten_links($status);
 
-                       if (mb_strlen($status_shortened) > 140) {
+            if (mb_strlen($status_shortened) > 140) {
 
-                               // XXX: Twitter truncates anything over 140, flags the status
-                               // as "truncated." Sending this error may screw up some clients
-                               // that assume Twitter will truncate for them.  Should we just
-                               // truncate too? -- Zach
-                               $this->client_error(_('That\'s too long. Max notice size is 140 chars.'), $code = 406, $apidata['content-type']);
-                               return;
+                // XXX: Twitter truncates anything over 140, flags the status
+                // as "truncated." Sending this error may screw up some clients
+                // that assume Twitter will truncate for them.    Should we just
+                // truncate too? -- Zach
+                $this->client_error(_('That\'s too long. Max notice size is 140 chars.'), $code = 406, $apidata['content-type']);
+                return;
 
-                       }
-               }
+            }
+        }
 
-               // Check for commands
-               $inter = new CommandInterpreter();
-               $cmd = $inter->handle_command($user, $status_shortened);
+        // Check for commands
+        $inter = new CommandInterpreter();
+        $cmd = $inter->handle_command($user, $status_shortened);
 
-               if ($cmd) {
+        if ($cmd) {
 
-                       if ($this->supported($cmd)) {
-                               $cmd->execute(new Channel());
-                       }
-
-                       // cmd not supported?  Twitter just returns your latest status.
-                       // And, it returns your last status whether the cmd was successful
-                       // or not!
-                       $n = $user->getCurrentNotice();
-                       $apidata['api_arg'] = $n->id;
-               } else {
+            if ($this->supported($cmd)) {
+                $cmd->execute(new Channel());
+            }
+
+            // cmd not supported?  Twitter just returns your latest status.
+            // And, it returns your last status whether the cmd was successful
+            // or not!
+            $n = $user->getCurrentNotice();
+            $apidata['api_arg'] = $n->id;
+        } else {
 
-                       $reply_to = NULL;
+            $reply_to = NULL;
 
-                       if ($in_reply_to_status_id) {
-
-                               // check whether notice actually exists
-                               $reply = Notice::staticGet($in_reply_to_status_id);
-
-                               if ($reply) {
-                                       $reply_to = $in_reply_to_status_id;
-                               } else {
-                                       $this->client_error(_('Not found'), $code = 404, $apidata['content-type']);
-                                       return;
-                               }
-                       }
-
-                       $notice = Notice::saveNew($user->id, html_entity_decode($status, ENT_NOQUOTES, 'UTF-8'),
-                               $source, 1, $reply_to);
-
-                       if (is_string($notice)) {
-                               $this->server_error($notice);
-                               return;
-                       }
-
-                       common_broadcast_notice($notice);
-                       $apidata['api_arg'] = $notice->id;
-               }
-
-               $this->show($args, $apidata);
-       }
-
-       function replies($args, $apidata) {
-
-               parent::handle($args);
-
-               $since = $this->arg('since');
-               $count = $this->arg('count');
-               $page = $this->arg('page');
-               $since_id = $this->arg('since_id');
-               $before_id = $this->arg('before_id');
-
-               $this->auth_user = $apidata['user'];
-               $user = $this->auth_user;
-               $profile = $user->getProfile();
-
-               $sitename = common_config('site', 'name');
-               $siteserver = common_config('site', 'server');
-
-               $title = sprintf(_('%1$s / Updates replying to %2$s'), $sitename, $user->nickname);
-               $id = "tag:$siteserver:replies:".$user->id;
-               $link = common_local_url('replies', array('nickname' => $user->nickname));
-               $subtitle = sprintf(_('%1$s updates that reply to updates from %2$s / %3$s.'), $sitename, $user->nickname, $profile->getBestName());
-
-               if (!$page) {
-                       $page = 1;
-               }
-
-               if (!$count) {
-                       $count = 20;
-               }
-
-               if (!$since_id) {
-                       $since_id = 0;
-               }
-
-               // NOTE: before_id is an extension to Twitter API -- TB
-               if (!$before_id) {
-                       $before_id = 0;
-               }
-
-               $since = strtotime($this->arg('since'));
-
-               $notice = $user->getReplies((($page-1)*20), $count, $since_id, $before_id, $since);
-               $notices = array();
-
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
-
-               switch($apidata['content-type']) {
-                case 'xml':
-                       $this->show_xml_timeline($notices);
-                       break;
-                case 'rss':
-                       $this->show_rss_timeline($notices, $title, $link, $subtitle);
-                       break;
-                case 'atom':
-                       $this->show_atom_timeline($notices, $title, $id, $link, $subtitle);
-                       break;
-                case 'json':
-                       $this->show_json_timeline($notices);
-                       break;
-                default:
-                       common_user_error(_('API method not found!'), $code = 404);
-               }
-
-       }
-
-       function show($args, $apidata) {
-               parent::handle($args);
-
-               if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-                       common_user_error(_('API method not found!'), $code = 404);
-                       return;
-               }
-
-               $this->auth_user = $apidata['user'];
-               $notice_id = $apidata['api_arg'];
-               $notice = Notice::staticGet($notice_id);
-
-               if ($notice) {
-                       if ($apidata['content-type'] == 'xml') {
-                               $this->show_single_xml_status($notice);
-                       } elseif ($apidata['content-type'] == 'json') {
-                               $this->show_single_json_status($notice);
-                       }
-               } else {
-                       // XXX: Twitter just sets a 404 header and doens't bother to return an err msg
-                       $this->client_error(_('No status with that ID found.'), 404, $apidata['content-type']);
-               }
-
-       }
-
-       function destroy($args, $apidata) {
-
-               parent::handle($args);
-
-               if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-                       common_user_error(_('API method not found!'), $code = 404);
-                       return;
-               }
-
-               // Check for RESTfulness
-               if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
-                       // XXX: Twitter just prints the err msg, no XML / JSON.
-                       $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
-                       return;
-               }
-
-               $this->auth_user = $apidata['user'];
-               $user = $this->auth_user;
-               $notice_id = $apidata['api_arg'];
-               $notice = Notice::staticGet($notice_id);
-
-               if (!$notice) {
-                       $this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']);
-                       return;
-               }
-
-               if ($user->id == $notice->profile_id) {
-                       $replies = new Reply;
-                       $replies->get('notice_id', $notice_id);
-                       common_dequeue_notice($notice);
-                       $replies->delete();
-                       $notice->delete();
-
-                       if ($apidata['content-type'] == 'xml') {
-                               $this->show_single_xml_status($notice);
-                       } elseif ($apidata['content-type'] == 'json') {
-                               $this->show_single_json_status($notice);
-                       }
-               } else {
-                       $this->client_error(_('You may not delete another user\'s status.'), 403, $apidata['content-type']);
-               }
-
-       }
-
-       function friends($args, $apidata) {
-               parent::handle($args);
-               return $this->subscriptions($apidata, 'subscribed', 'subscriber');
-       }
-
-       function followers($args, $apidata) {
-               parent::handle($args);
-
-               return $this->subscriptions($apidata, 'subscriber', 'subscribed');
-       }
-
-       function subscriptions($apidata, $other_attr, $user_attr) {
-
-               # XXX: lite
-
-               $this->auth_user = $apidate['user'];
-               $user = $this->get_user($apidata['api_arg'], $apidata);
-
-               if (!$user) {
-                       $this->client_error('Not Found', 404, $apidata['content-type']);
-                       return;
-               }
-
-               $page = $this->trimmed('page');
-
-               if (!$page || !is_numeric($page)) {
-                       $page = 1;
-               }
-
-               $profile = $user->getProfile();
-
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
-
-               $sub = new Subscription();
-               $sub->$user_attr = $profile->id;
-
-               $since = strtotime($this->trimmed('since'));
-
-               if ($since) {
-                       $d = date('Y-m-d H:i:s', $since);
-                       $sub->whereAdd("created > '$d'");
-               }
-
-               $sub->orderBy('created DESC');
-               $sub->limit(($page-1)*100, 100);
-
-               $others = array();
-
-               if ($sub->find()) {
-                       while ($sub->fetch()) {
-                               $others[] = Profile::staticGet($sub->$other_attr);
-                       }
-               } else {
-                       // user has no followers
-               }
-
-               $type = $apidata['content-type'];
-
-               $this->init_document($type);
-               $this->show_profiles($others, $type);
-               $this->end_document($type);
-       }
-
-       function show_profiles($profiles, $type) {
-               switch ($type) {
-                case 'xml':
-                       common_element_start('users', array('type' => 'array'));
-                       foreach ($profiles as $profile) {
-                               $this->show_profile($profile);
-                       }
-                       common_element_end('users');
-                       break;
-                case 'json':
-                       $arrays = array();
-                       foreach ($profiles as $profile) {
-                               $arrays[] = $this->twitter_user_array($profile, true);
-                       }
-                       print json_encode($arrays);
-                       break;
-                default:
-                       $this->client_error(_('unsupported file type'));
-               }
-       }
-
-       function featured($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
-
-       function supported($cmd) {
-
-               $cmdlist = array('MessageCommand', 'SubCommand', 'UnsubCommand', 'FavCommand', 'OnCommand', 'OffCommand');
+            if ($in_reply_to_status_id) {
+
+                // check whether notice actually exists
+                $reply = Notice::staticGet($in_reply_to_status_id);
+
+                if ($reply) {
+                    $reply_to = $in_reply_to_status_id;
+                } else {
+                    $this->client_error(_('Not found'), $code = 404, $apidata['content-type']);
+                    return;
+                }
+            }
+
+            $notice = Notice::saveNew($user->id, html_entity_decode($status, ENT_NOQUOTES, 'UTF-8'),
+                $source, 1, $reply_to);
+
+            if (is_string($notice)) {
+                $this->server_error($notice);
+                return;
+            }
+
+            common_broadcast_notice($notice);
+            $apidata['api_arg'] = $notice->id;
+        }
+
+        $this->show($args, $apidata);
+    }
+
+    function replies($args, $apidata) {
+
+        parent::handle($args);
+
+        $since = $this->arg('since');
+        $count = $this->arg('count');
+        $page = $this->arg('page');
+        $since_id = $this->arg('since_id');
+        $before_id = $this->arg('before_id');
+
+        $this->auth_user = $apidata['user'];
+        $user = $this->auth_user;
+        $profile = $user->getProfile();
+
+        $sitename = common_config('site', 'name');
+        $siteserver = common_config('site', 'server');
+
+        $title = sprintf(_('%1$s / Updates replying to %2$s'), $sitename, $user->nickname);
+        $id = "tag:$siteserver:replies:".$user->id;
+        $link = common_local_url('replies', array('nickname' => $user->nickname));
+        $subtitle = sprintf(_('%1$s updates that reply to updates from %2$s / %3$s.'), $sitename, $user->nickname, $profile->getBestName());
+
+        if (!$page) {
+            $page = 1;
+        }
+
+        if (!$count) {
+            $count = 20;
+        }
+
+        if (!$since_id) {
+            $since_id = 0;
+        }
+
+        // NOTE: before_id is an extension to Twitter API -- TB
+        if (!$before_id) {
+            $before_id = 0;
+        }
+
+        $since = strtotime($this->arg('since'));
+
+        $notice = $user->getReplies((($page-1)*20), $count, $since_id, $before_id, $since);
+        $notices = array();
+
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
+
+        switch($apidata['content-type']) {
+         case 'xml':
+            $this->show_xml_timeline($notices);
+            break;
+         case 'rss':
+            $this->show_rss_timeline($notices, $title, $link, $subtitle);
+            break;
+         case 'atom':
+            $this->show_atom_timeline($notices, $title, $id, $link, $subtitle);
+            break;
+         case 'json':
+            $this->show_json_timeline($notices);
+            break;
+         default:
+            common_user_error(_('API method not found!'), $code = 404);
+        }
+
+    }
+
+    function show($args, $apidata) {
+        parent::handle($args);
+
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            common_user_error(_('API method not found!'), $code = 404);
+            return;
+        }
+
+        $this->auth_user = $apidata['user'];
+        $notice_id = $apidata['api_arg'];
+        $notice = Notice::staticGet($notice_id);
+
+        if ($notice) {
+            if ($apidata['content-type'] == 'xml') {
+                $this->show_single_xml_status($notice);
+            } elseif ($apidata['content-type'] == 'json') {
+                $this->show_single_json_status($notice);
+            }
+        } else {
+            // XXX: Twitter just sets a 404 header and doens't bother to return an err msg
+            $this->client_error(_('No status with that ID found.'), 404, $apidata['content-type']);
+        }
+
+    }
+
+    function destroy($args, $apidata) {
+
+        parent::handle($args);
+
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            common_user_error(_('API method not found!'), $code = 404);
+            return;
+        }
+
+        // Check for RESTfulness
+        if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
+            // XXX: Twitter just prints the err msg, no XML / JSON.
+            $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
+            return;
+        }
+
+        $this->auth_user = $apidata['user'];
+        $user = $this->auth_user;
+        $notice_id = $apidata['api_arg'];
+        $notice = Notice::staticGet($notice_id);
+
+        if (!$notice) {
+            $this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']);
+            return;
+        }
+
+        if ($user->id == $notice->profile_id) {
+            $replies = new Reply;
+            $replies->get('notice_id', $notice_id);
+            common_dequeue_notice($notice);
+            $replies->delete();
+            $notice->delete();
+
+            if ($apidata['content-type'] == 'xml') {
+                $this->show_single_xml_status($notice);
+            } elseif ($apidata['content-type'] == 'json') {
+                $this->show_single_json_status($notice);
+            }
+        } else {
+            $this->client_error(_('You may not delete another user\'s status.'), 403, $apidata['content-type']);
+        }
+
+    }
+
+    function friends($args, $apidata) {
+        parent::handle($args);
+        return $this->subscriptions($apidata, 'subscribed', 'subscriber');
+    }
+
+    function followers($args, $apidata) {
+        parent::handle($args);
+
+        return $this->subscriptions($apidata, 'subscriber', 'subscribed');
+    }
+
+    function subscriptions($apidata, $other_attr, $user_attr) {
+
+        # XXX: lite
+
+        $this->auth_user = $apidate['user'];
+        $user = $this->get_user($apidata['api_arg'], $apidata);
+
+        if (!$user) {
+            $this->client_error('Not Found', 404, $apidata['content-type']);
+            return;
+        }
+
+        $page = $this->trimmed('page');
+
+        if (!$page || !is_numeric($page)) {
+            $page = 1;
+        }
+
+        $profile = $user->getProfile();
+
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
+
+        $sub = new Subscription();
+        $sub->$user_attr = $profile->id;
+
+        $since = strtotime($this->trimmed('since'));
+
+        if ($since) {
+            $d = date('Y-m-d H:i:s', $since);
+            $sub->whereAdd("created > '$d'");
+        }
+
+        $sub->orderBy('created DESC');
+        $sub->limit(($page-1)*100, 100);
+
+        $others = array();
+
+        if ($sub->find()) {
+            while ($sub->fetch()) {
+                $others[] = Profile::staticGet($sub->$other_attr);
+            }
+        } else {
+            // user has no followers
+        }
+
+        $type = $apidata['content-type'];
+
+        $this->init_document($type);
+        $this->show_profiles($others, $type);
+        $this->end_document($type);
+    }
+
+    function show_profiles($profiles, $type) {
+        switch ($type) {
+         case 'xml':
+            common_element_start('users', array('type' => 'array'));
+            foreach ($profiles as $profile) {
+                $this->show_profile($profile);
+            }
+            common_element_end('users');
+            break;
+         case 'json':
+            $arrays = array();
+            foreach ($profiles as $profile) {
+                $arrays[] = $this->twitter_user_array($profile, true);
+            }
+            print json_encode($arrays);
+            break;
+         default:
+            $this->client_error(_('unsupported file type'));
+        }
+    }
+
+    function featured($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
+
+    function supported($cmd) {
+
+        $cmdlist = array('MessageCommand', 'SubCommand', 'UnsubCommand', 'FavCommand', 'OnCommand', 'OffCommand');
 
-               if (in_array(get_class($cmd), $cmdlist)) {
-                       return true;
-               }
+        if (in_array(get_class($cmd), $cmdlist)) {
+            return true;
+        }
 
-               return false;
-       }
+        return false;
+    }
 
 }
index 9e06efa64286976a5600c262bb303f7cdb34e980..43f6969f4f52295fe517f0ac96fa393295d1389b 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,30 +23,30 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class TwitapiusersAction extends TwitterapiAction {
 
-       function show($args, $apidata) {
-               parent::handle($args);
+    function show($args, $apidata) {
+        parent::handle($args);
 
-               if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-                       common_user_error(_('API method not found!'), $code = 404);
-                       return;
-               }
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            common_user_error(_('API method not found!'), $code = 404);
+            return;
+        }
 
-               $user = null;
-               $email = $this->arg('email');
+        $user = null;
+        $email = $this->arg('email');
 
-               if ($email) {
-                       $user = User::staticGet('email', $email);
-               } elseif (isset($apidata['api_arg'])) {
-                       $user = $this->get_user($apidata['api_arg']);
-               }
+        if ($email) {
+            $user = User::staticGet('email', $email);
+        } elseif (isset($apidata['api_arg'])) {
+            $user = $this->get_user($apidata['api_arg']);
+        }
 
-               if (!$user) {
-                       // XXX: Twitter returns a random(?) user instead of throwing and err! -- Zach
-                       $this->client_error(_('Not found.'), 404, $apidata['content-type']);
-                       return;
-               }
+        if (!$user) {
+            // XXX: Twitter returns a random(?) user instead of throwing and err! -- Zach
+            $this->client_error(_('Not found.'), 404, $apidata['content-type']);
+            return;
+        }
 
-               $this->show_extended_profile($user, $apidata);
-       }
+        $this->show_extended_profile($user, $apidata);
+    }
 
 }
index ae3aff877837c80809d5bcf51ff2b18d21cfa965..e300e699a3e84615826cd7e79361e5c34e5a72a4 100644 (file)
@@ -25,354 +25,354 @@ define('SUBSCRIPTIONS', 80);
 
 class TwittersettingsAction extends SettingsAction {
 
-       function get_instructions() {
-               return _('Add your Twitter account to automatically send your notices to Twitter, ' .
-                       'and subscribe to Twitter friends already here.');
-       }
+    function get_instructions() {
+        return _('Add your Twitter account to automatically send your notices to Twitter, ' .
+            'and subscribe to Twitter friends already here.');
+    }
 
-       function show_form($msg=NULL, $success=false) {
-               $user = common_current_user();
-               $profile = $user->getProfile();
-               $fuser = NULL;
-               $flink = Foreign_link::getByUserID($user->id, 1); // 1 == Twitter
+    function show_form($msg=NULL, $success=false) {
+        $user = common_current_user();
+        $profile = $user->getProfile();
+        $fuser = NULL;
+        $flink = Foreign_link::getByUserID($user->id, 1); // 1 == Twitter
 
-               if ($flink) {
-                       $fuser = $flink->getForeignUser();
-               }
+        if ($flink) {
+            $fuser = $flink->getForeignUser();
+        }
 
-               $this->form_header(_('Twitter settings'), $msg, $success);
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'twittersettings',
-                                                                                  'action' =>
-                                                                                  common_local_url('twittersettings')));
-               common_hidden('token', common_session_token());
+        $this->form_header(_('Twitter settings'), $msg, $success);
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'twittersettings',
+                                           'action' =>
+                                           common_local_url('twittersettings')));
+        common_hidden('token', common_session_token());
 
-               common_element('h2', NULL, _('Twitter Account'));
+        common_element('h2', NULL, _('Twitter Account'));
 
-               if ($fuser) {
-                       common_element_start('p');
+        if ($fuser) {
+            common_element_start('p');
 
-                       common_element('span', 'twitter_user', $fuser->nickname);
-                       common_element('a', array('href' => $fuser->uri),  $fuser->uri);
-                       common_element('span', 'input_instructions',
-                                      _('Current verified Twitter account.'));
-                       common_hidden('flink_foreign_id', $flink->foreign_id);
-                       common_element_end('p');
-                       common_submit('remove', _('Remove'));
-               } else {
-                       common_input('twitter_username', _('Twitter user name'),
-                                                ($this->arg('twitter_username')) ? $this->arg('twitter_username') : $profile->nickname,
-                                                _('No spaces, please.')); // hey, it's what Twitter says
+            common_element('span', 'twitter_user', $fuser->nickname);
+            common_element('a', array('href' => $fuser->uri),  $fuser->uri);
+            common_element('span', 'input_instructions',
+                           _('Current verified Twitter account.'));
+            common_hidden('flink_foreign_id', $flink->foreign_id);
+            common_element_end('p');
+            common_submit('remove', _('Remove'));
+        } else {
+            common_input('twitter_username', _('Twitter user name'),
+                         ($this->arg('twitter_username')) ? $this->arg('twitter_username') : $profile->nickname,
+                         _('No spaces, please.')); // hey, it's what Twitter says
 
-                       common_password('twitter_password', _('Twitter password'));
-               }
+            common_password('twitter_password', _('Twitter password'));
+        }
 
-               common_element('h2', NULL, _('Preferences'));
+        common_element('h2', NULL, _('Preferences'));
 
-               common_checkbox('noticesync', _('Automatically send my notices to Twitter.'),
-                                               ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND) : true);
+        common_checkbox('noticesync', _('Automatically send my notices to Twitter.'),
+                        ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND) : true);
 
-               common_checkbox('replysync', _('Send local "@" replies to Twitter.'),
-                                               ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true);
+        common_checkbox('replysync', _('Send local "@" replies to Twitter.'),
+                        ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true);
 
-               common_checkbox('friendsync', _('Subscribe to my Twitter friends here.'),
-                                               ($flink) ? ($flink->friendsync & FOREIGN_FRIEND_RECV) : false);
+        common_checkbox('friendsync', _('Subscribe to my Twitter friends here.'),
+                        ($flink) ? ($flink->friendsync & FOREIGN_FRIEND_RECV) : false);
 
-               if ($flink) {
-                       common_submit('save', _('Save'));
-               } else {
-                       common_submit('add', _('Add'));
-               }
+        if ($flink) {
+            common_submit('save', _('Save'));
+        } else {
+            common_submit('add', _('Add'));
+        }
 
-               $this->show_twitter_subscriptions();
+        $this->show_twitter_subscriptions();
 
-               common_element_end('form');
+        common_element_end('form');
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function subscribed_twitter_users() {
+    function subscribed_twitter_users() {
 
-               $current_user = common_current_user();
+        $current_user = common_current_user();
 
-               $qry = 'SELECT user.* ' .
-                       'FROM subscription ' .
-                       'JOIN user ON subscription.subscribed = user.id ' .
-                       'JOIN foreign_link ON foreign_link.user_id = user.id ' .
-                       'WHERE subscriber = %d ' .
-                       'ORDER BY user.nickname';
+        $qry = 'SELECT user.* ' .
+            'FROM subscription ' .
+            'JOIN user ON subscription.subscribed = user.id ' .
+            'JOIN foreign_link ON foreign_link.user_id = user.id ' .
+            'WHERE subscriber = %d ' .
+            'ORDER BY user.nickname';
 
-               $user = new User();
+        $user = new User();
 
-               $user->query(sprintf($qry, $current_user->id));
-
-               $users = array();
+        $user->query(sprintf($qry, $current_user->id));
+
+        $users = array();
 
-               while ($user->fetch()) {
-
-                       // Don't include the user's own self-subscription
-                       if ($user->id != $current_user->id) {
-                               $users[] = clone($user);
-                       }
-               }
-
-               return $users;
-       }
-
-       function show_twitter_subscriptions() {
-
-               $friends = $this->subscribed_twitter_users();
-               $friends_count = count($friends);
-
-               if ($friends_count > 0) {
-
-                       common_element('h3', NULL, _('Twitter Friends'));
-                       common_element_start('div', array('id' => 'subscriptions'));
-                       common_element_start('ul', array('id' => 'subscriptions_avatars'));
-
-                       for ($i = 0; $i < min($friends_count, SUBSCRIPTIONS); $i++) {
-
-                               $other = Profile::staticGet($friends[$i]->id);
-
-                               if (!$other) {
-                                       common_log_db_error($subs, 'SELECT', __FILE__);
-                                       continue;
-                               }
-
-                               common_element_start('li');
-                               common_element_start('a', array('title' => ($other->fullname) ?
-                                                                                               $other->fullname :
-                                                                                               $other->nickname,
-                                                                                               'href' => $other->profileurl,
-                                                                                               'rel' => 'contact',
-                                                                                               'class' => 'subscription'));
-                               $avatar = $other->getAvatar(AVATAR_MINI_SIZE);
-                               common_element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
-                                                                                       'width' => AVATAR_MINI_SIZE,
-                                                                                       'height' => AVATAR_MINI_SIZE,
-                                                                                       'class' => 'avatar mini',
-                                                                                       'alt' =>  ($other->fullname) ?
-                                                                                       $other->fullname :
-                                                                                       $other->nickname));
-                               common_element_end('a');
-                               common_element_end('li');
-
-                       }
+        while ($user->fetch()) {
+
+            // Don't include the user's own self-subscription
+            if ($user->id != $current_user->id) {
+                $users[] = clone($user);
+            }
+        }
+
+        return $users;
+    }
+
+    function show_twitter_subscriptions() {
+
+        $friends = $this->subscribed_twitter_users();
+        $friends_count = count($friends);
+
+        if ($friends_count > 0) {
+
+            common_element('h3', NULL, _('Twitter Friends'));
+            common_element_start('div', array('id' => 'subscriptions'));
+            common_element_start('ul', array('id' => 'subscriptions_avatars'));
+
+            for ($i = 0; $i < min($friends_count, SUBSCRIPTIONS); $i++) {
+
+                $other = Profile::staticGet($friends[$i]->id);
+
+                if (!$other) {
+                    common_log_db_error($subs, 'SELECT', __FILE__);
+                    continue;
+                }
+
+                common_element_start('li');
+                common_element_start('a', array('title' => ($other->fullname) ?
+                                                $other->fullname :
+                                                $other->nickname,
+                                                'href' => $other->profileurl,
+                                                'rel' => 'contact',
+                                                'class' => 'subscription'));
+                $avatar = $other->getAvatar(AVATAR_MINI_SIZE);
+                common_element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
+                                            'width' => AVATAR_MINI_SIZE,
+                                            'height' => AVATAR_MINI_SIZE,
+                                            'class' => 'avatar mini',
+                                            'alt' =>  ($other->fullname) ?
+                                            $other->fullname :
+                                            $other->nickname));
+                common_element_end('a');
+                common_element_end('li');
+
+            }
 
-                       common_element_end('ul');
-                       common_element_end('div');
+            common_element_end('ul');
+            common_element_end('div');
 
-               }
+        }
 
-               // XXX Figure out a way to show all Twitter friends... ?
+        // XXX Figure out a way to show all Twitter friends... ?
 
-               /*
-               if ($subs_count > SUBSCRIPTIONS) {
-                       common_element_start('p', array('id' => 'subscriptions_viewall'));
+        /*
+        if ($subs_count > SUBSCRIPTIONS) {
+            common_element_start('p', array('id' => 'subscriptions_viewall'));
 
-                       common_element('a', array('href' => common_local_url('subscriptions',
-                                                                                                                                array('nickname' => $profile->nickname)),
-                                                                         'class' => 'moresubscriptions'),
-                                                  _('All subscriptions'));
-                       common_element_end('p');
-               }
-               */
+            common_element('a', array('href' => common_local_url('subscriptions',
+                                                                 array('nickname' => $profile->nickname)),
+                                      'class' => 'moresubscriptions'),
+                           _('All subscriptions'));
+            common_element_end('p');
+        }
+        */
 
-       }
-
-       function handle_post() {
+    }
+
+    function handle_post() {
 
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               if ($this->arg('save')) {
-                       $this->save_preferences();
-               } else if ($this->arg('add')) {
-                       $this->add_twitter_acct();
-               } else if ($this->arg('remove')) {
-                       $this->remove_twitter_acct();
-               } else {
-                       $this->show_form(_('Unexpected form submission.'));
-               }
-       }
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        if ($this->arg('save')) {
+            $this->save_preferences();
+        } else if ($this->arg('add')) {
+            $this->add_twitter_acct();
+        } else if ($this->arg('remove')) {
+            $this->remove_twitter_acct();
+        } else {
+            $this->show_form(_('Unexpected form submission.'));
+        }
+    }
 
-       function add_twitter_acct() {
+    function add_twitter_acct() {
 
-               $screen_name = $this->trimmed('twitter_username');
-               $password = $this->trimmed('twitter_password');
-               $noticesync = $this->boolean('noticesync');
-               $replysync = $this->boolean('replysync');
-               $friendsync = $this->boolean('friendsync');
-
-               if (!Validate::string($screen_name,
-                               array(  'min_length' => 1,
-                                               'max_length' => 15,
-                                               'format' => VALIDATE_NUM . VALIDATE_ALPHA . '_'))) {
-                       $this->show_form(
-                               _('Username must have only numbers, upper- and lowercase letters, and underscore (_). 15 chars max.'));
-                       return;
-               }
-
-               if (!$this->verify_credentials($screen_name, $password)) {
-                       $this->show_form(_('Could not verify your Twitter credentials!'));
-                       return;
-               }
-
-               $twit_user = twitter_user_info($screen_name, $password);
-
-               if (!$twit_user) {
-                       $this->show_form(sprintf(_('Unable to retrieve account information for "%s" from Twitter.'),
-                               $screen_name));
-                       return;
-               }
-
-               if (!save_twitter_user($twit_user->id, $screen_name)) {
-                       $this->show_form(_('Unable to save your Twitter settings!'));
-                       return;
-               }
-
-               $user = common_current_user();
-
-               $flink = DB_DataObject::factory('foreign_link');
-               $flink->user_id = $user->id;
-               $flink->foreign_id = $twit_user->id;
-               $flink->service = 1; // Twitter
-               $flink->credentials = $password;
-               $flink->created = common_sql_now();
-
-               $this->set_flags($flink, $noticesync, $replysync, $friendsync);
-
-               $flink_id = $flink->insert();
-
-               if (!$flink_id) {
-                       common_log_db_error($flink, 'INSERT', __FILE__);
-                       $this->show_form(_('Unable to save your Twitter settings!'));
-                       return;
-               }
+        $screen_name = $this->trimmed('twitter_username');
+        $password = $this->trimmed('twitter_password');
+        $noticesync = $this->boolean('noticesync');
+        $replysync = $this->boolean('replysync');
+        $friendsync = $this->boolean('friendsync');
+
+        if (!Validate::string($screen_name,
+                array(    'min_length' => 1,
+                        'max_length' => 15,
+                         'format' => VALIDATE_NUM . VALIDATE_ALPHA . '_'))) {
+            $this->show_form(
+                _('Username must have only numbers, upper- and lowercase letters, and underscore (_). 15 chars max.'));
+            return;
+        }
+
+        if (!$this->verify_credentials($screen_name, $password)) {
+            $this->show_form(_('Could not verify your Twitter credentials!'));
+            return;
+        }
+
+        $twit_user = twitter_user_info($screen_name, $password);
+
+        if (!$twit_user) {
+            $this->show_form(sprintf(_('Unable to retrieve account information for "%s" from Twitter.'),
+                $screen_name));
+            return;
+        }
+
+        if (!save_twitter_user($twit_user->id, $screen_name)) {
+            $this->show_form(_('Unable to save your Twitter settings!'));
+            return;
+        }
+
+        $user = common_current_user();
+
+        $flink = DB_DataObject::factory('foreign_link');
+        $flink->user_id = $user->id;
+        $flink->foreign_id = $twit_user->id;
+        $flink->service = 1; // Twitter
+        $flink->credentials = $password;
+        $flink->created = common_sql_now();
+
+        $this->set_flags($flink, $noticesync, $replysync, $friendsync);
+
+        $flink_id = $flink->insert();
+
+        if (!$flink_id) {
+            common_log_db_error($flink, 'INSERT', __FILE__);
+            $this->show_form(_('Unable to save your Twitter settings!'));
+            return;
+        }
 
-               if ($friendsync) {
-                       save_twitter_friends($user, $twit_user->id, $screen_name, $password);
-               }
+        if ($friendsync) {
+            save_twitter_friends($user, $twit_user->id, $screen_name, $password);
+        }
 
-               $this->show_form(_('Twitter settings saved.'), true);
-       }
+        $this->show_form(_('Twitter settings saved.'), true);
+    }
 
-       function remove_twitter_acct() {
-
-               $user = common_current_user();
-               $flink = Foreign_link::getByUserID($user->id, 1);
-               $flink_foreign_id = $this->arg('flink_foreign_id');
-
-               # Maybe an old tab open...?
-               if ($flink->foreign_id != $flink_foreign_id) {
-                   $this->show_form(_('That is not your Twitter account.'));
-                   return;
-               }
-
-               $result = $flink->delete();
-
-               if (!$result) {
-                       common_log_db_error($flink, 'DELETE', __FILE__);
-                       common_server_error(_('Couldn\'t remove Twitter user.'));
-                       return;
-               }
-
-               $this->show_form(_('Twitter account removed.'), TRUE);
-       }
-
-       function save_preferences() {
-
-               $noticesync = $this->boolean('noticesync');
-               $friendsync = $this->boolean('friendsync');
-               $replysync = $this->boolean('replysync');
-
-               $user = common_current_user();
-
-               $flink = Foreign_link::getByUserID($user->id, 1);
-
-               if (!$flink) {
-                       common_log_db_error($flink, 'SELECT', __FILE__);
-                       $this->show_form(_('Couldn\'t save Twitter preferences.'));
-                       return;
-               }
+    function remove_twitter_acct() {
+
+        $user = common_current_user();
+        $flink = Foreign_link::getByUserID($user->id, 1);
+        $flink_foreign_id = $this->arg('flink_foreign_id');
+
+        # Maybe an old tab open...?
+        if ($flink->foreign_id != $flink_foreign_id) {
+            $this->show_form(_('That is not your Twitter account.'));
+            return;
+        }
+
+        $result = $flink->delete();
+
+        if (!$result) {
+            common_log_db_error($flink, 'DELETE', __FILE__);
+            common_server_error(_('Couldn\'t remove Twitter user.'));
+            return;
+        }
+
+        $this->show_form(_('Twitter account removed.'), TRUE);
+    }
+
+    function save_preferences() {
+
+        $noticesync = $this->boolean('noticesync');
+        $friendsync = $this->boolean('friendsync');
+        $replysync = $this->boolean('replysync');
+
+        $user = common_current_user();
+
+        $flink = Foreign_link::getByUserID($user->id, 1);
+
+        if (!$flink) {
+            common_log_db_error($flink, 'SELECT', __FILE__);
+            $this->show_form(_('Couldn\'t save Twitter preferences.'));
+            return;
+        }
 
-               $twitter_id = $flink->foreign_id;
-               $password = $flink->credentials;
-
-               $fuser = $flink->getForeignUser();
+        $twitter_id = $flink->foreign_id;
+        $password = $flink->credentials;
+
+        $fuser = $flink->getForeignUser();
 
-               if (!$fuser) {
-                       common_log_db_error($fuser, 'SELECT', __FILE__);
-                       $this->show_form(_('Couldn\'t save Twitter preferences.'));
-                       return;
-               }
+        if (!$fuser) {
+            common_log_db_error($fuser, 'SELECT', __FILE__);
+            $this->show_form(_('Couldn\'t save Twitter preferences.'));
+            return;
+        }
 
-               $screen_name = $fuser->nickname;
+        $screen_name = $fuser->nickname;
 
-               $original = clone($flink);
-               $this->set_flags($flink, $noticesync, $replysync, $friendsync);
-               $result = $flink->update($original);
+        $original = clone($flink);
+        $this->set_flags($flink, $noticesync, $replysync, $friendsync);
+        $result = $flink->update($original);
 
-               if ($result === FALSE) {
-                       common_log_db_error($flink, 'UPDATE', __FILE__);
-                       $this->show_form(_('Couldn\'t save Twitter preferences.'));
-                       return;
-               }
+        if ($result === FALSE) {
+            common_log_db_error($flink, 'UPDATE', __FILE__);
+            $this->show_form(_('Couldn\'t save Twitter preferences.'));
+            return;
+        }
 
-               if ($friendsync) {
-                       save_twitter_friends($user, $flink->foreign_id, $screen_name, $password);
-               }
+        if ($friendsync) {
+            save_twitter_friends($user, $flink->foreign_id, $screen_name, $password);
+        }
 
-               $this->show_form(_('Twitter preferences saved.'));
-       }
+        $this->show_form(_('Twitter preferences saved.'));
+    }
 
-       function verify_credentials($screen_name, $password) {
-               $uri = 'http://twitter.com/account/verify_credentials.json';
-               $data = get_twitter_data($uri, $screen_name, $password);
+    function verify_credentials($screen_name, $password) {
+        $uri = 'http://twitter.com/account/verify_credentials.json';
+        $data = get_twitter_data($uri, $screen_name, $password);
 
-               if (!$data) {
-                       return false;
-               }
+        if (!$data) {
+            return false;
+        }
 
-               $user = json_decode($data);
+        $user = json_decode($data);
 
-               if (!$user) {
-                       return false;
-               }
+        if (!$user) {
+            return false;
+        }
 
-               $twitter_id = $user->status->id;
+         $twitter_id = $user->status->id;
 
-               if ($twitter_id) {
-                       return $twitter_id;
-               }
+        if ($twitter_id) {
+            return $twitter_id;
+        }
 
-               return false;
-       }
+        return false;
+    }
 
-       function set_flags(&$flink, $noticesync, $replysync, $friendsync) {
-               if ($noticesync) {
-                       $flink->noticesync |= FOREIGN_NOTICE_SEND;
-               } else {
-                       $flink->noticesync &= ~FOREIGN_NOTICE_SEND;
-               }
+    function set_flags(&$flink, $noticesync, $replysync, $friendsync) {
+        if ($noticesync) {
+            $flink->noticesync |= FOREIGN_NOTICE_SEND;
+        } else {
+            $flink->noticesync &= ~FOREIGN_NOTICE_SEND;
+        }
 
-               if ($replysync) {
-                       $flink->noticesync |= FOREIGN_NOTICE_SEND_REPLY;
-               } else {
-                       $flink->noticesync &= ~FOREIGN_NOTICE_SEND_REPLY;
-               }
+        if ($replysync) {
+            $flink->noticesync |= FOREIGN_NOTICE_SEND_REPLY;
+        } else {
+            $flink->noticesync &= ~FOREIGN_NOTICE_SEND_REPLY;
+        }
 
-               if ($friendsync) {
-                       $flink->friendsync |= FOREIGN_FRIEND_RECV;
-               } else {
-                       $flink->friendsync &= ~FOREIGN_FRIEND_RECV;
-               }
+        if ($friendsync) {
+            $flink->friendsync |= FOREIGN_FRIEND_RECV;
+        } else {
+            $flink->friendsync &= ~FOREIGN_FRIEND_RECV;
+        }
 
-               $flink->profilesync = 0;
-       }
+        $flink->profilesync = 0;
+    }
 
 }
\ No newline at end of file
index d60cc7088595de49380f17a09635b989f58b2815..6a86c2bf0f9a48e6662bd6c8e27251d83d33c413 100644 (file)
@@ -32,12 +32,12 @@ class UnblockAction extends Action {
             return false;
         }
 
-               $token = $this->trimmed('token');
+        $token = $this->trimmed('token');
 
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
         $id = $this->trimmed('unblockto');
 
index 98291e897ee198efeaf49b6cdcea811ca94ddc96..38fcc21dea0c2ae3ae30b294eb3a01227fde9d47 100644 (file)
 
 class UnsubscribeAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-                       return;
-               }
+    function handle($args) {
+        parent::handle($args);
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+            return;
+        }
 
-               $user = common_current_user();
+        $user = common_current_user();
 
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname)));
-                       return;
-               }
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname)));
+            return;
+        }
 
-               # CSRF protection
+        # CSRF protection
 
-               $token = $this->trimmed('token');
+        $token = $this->trimmed('token');
 
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
-               $other_id = $this->arg('unsubscribeto');
+        $other_id = $this->arg('unsubscribeto');
 
         if (!$other_id) {
             $this->client_error(_('No profile id in request.'));
@@ -56,25 +56,25 @@ class UnsubscribeAction extends Action {
             return;
         }
 
-               $result = subs_unsubscribe_to($user, $other);
+        $result = subs_unsubscribe_to($user, $other);
 
-               if ($result != true) {
-                       common_user_error($result);
-                       return;
-               }
+        if ($result != true) {
+            common_user_error($result);
+            return;
+        }
 
-               if ($this->boolean('ajax')) {
-                       common_start_html('text/xml;charset=utf-8', true);
-                       common_element_start('head');
-                       common_element('title', null, _('Unsubscribed'));
-                       common_element_end('head');
-                       common_element_start('body');
-                       common_subscribe_form($other);
-                       common_element_end('body');
-                       common_element_end('html');
-               } else {
-               common_redirect(common_local_url('subscriptions', array('nickname' =>
-                                                                                                                               $user->nickname)));
+        if ($this->boolean('ajax')) {
+            common_start_html('text/xml;charset=utf-8', true);
+            common_element_start('head');
+            common_element('title', null, _('Unsubscribed'));
+            common_element_end('head');
+            common_element_start('body');
+            common_subscribe_form($other);
+            common_element_end('body');
+            common_element_end('html');
+        } else {
+            common_redirect(common_local_url('subscriptions', array('nickname' =>
+                                                                    $user->nickname)));
         }
-       }
+    }
 }
index 921e88e635408f54aa51495aa0723a172beec632..4b4bb53a127006ddb40b958ebd2640aca3976f65 100644 (file)
@@ -22,153 +22,153 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/lib/omb.php');
 
 class UpdateprofileAction extends Action {
-       
-       function handle($args) {
-               parent::handle($args);
-               try {
-                       common_remove_magic_from_request();
-                       $req = OAuthRequest::from_request();
-                       # Note: server-to-server function!
-                       $server = omb_oauth_server();
-                       list($consumer, $token) = $server->verify_request($req);
-                       if ($this->update_profile($req, $consumer, $token)) {
-                               print "omb_version=".OMB_VERSION_01;
-                       }
-               } catch (OAuthException $e) {
-                       $this->server_error($e->getMessage());
-                       return;
-               }
-       }
+    
+    function handle($args) {
+        parent::handle($args);
+        try {
+            common_remove_magic_from_request();
+            $req = OAuthRequest::from_request();
+            # Note: server-to-server function!
+            $server = omb_oauth_server();
+            list($consumer, $token) = $server->verify_request($req);
+            if ($this->update_profile($req, $consumer, $token)) {
+                print "omb_version=".OMB_VERSION_01;
+            }
+        } catch (OAuthException $e) {
+            $this->server_error($e->getMessage());
+            return;
+        }
+    }
 
-       function update_profile($req, $consumer, $token) {
-               $version = $req->get_parameter('omb_version');
-               if ($version != OMB_VERSION_01) {
-                       $this->client_error(_('Unsupported OMB version'), 400);
-                       return false;
-               }
-               # First, check to see if listenee exists
-               $listenee =  $req->get_parameter('omb_listenee');
-               $remote = Remote_profile::staticGet('uri', $listenee);
-               if (!$remote) {
-                       $this->client_error(_('Profile unknown'), 404);
-                       return false;
-               }
-               # Second, check to see if they should be able to post updates!
-               # We see if there are any subscriptions to that remote user with
-               # the given token.
+    function update_profile($req, $consumer, $token) {
+        $version = $req->get_parameter('omb_version');
+        if ($version != OMB_VERSION_01) {
+            $this->client_error(_('Unsupported OMB version'), 400);
+            return false;
+        }
+        # First, check to see if listenee exists
+        $listenee =  $req->get_parameter('omb_listenee');
+        $remote = Remote_profile::staticGet('uri', $listenee);
+        if (!$remote) {
+            $this->client_error(_('Profile unknown'), 404);
+            return false;
+        }
+        # Second, check to see if they should be able to post updates!
+        # We see if there are any subscriptions to that remote user with
+        # the given token.
 
-               $sub = new Subscription();
-               $sub->subscribed = $remote->id;
-               $sub->token = $token->key;
-               if (!$sub->find(true)) {
-                       $this->client_error(_('You did not send us that profile'), 403);
-                       return false;
-               }
+        $sub = new Subscription();
+        $sub->subscribed = $remote->id;
+        $sub->token = $token->key;
+        if (!$sub->find(true)) {
+            $this->client_error(_('You did not send us that profile'), 403);
+            return false;
+        }
 
-               $profile = Profile::staticGet('id', $remote->id);
-               if (!$profile) {
-                       # This one is our fault
-                       $this->server_error(_('Remote profile with no matching profile'), 500);
-                       return false;
-               }
-               $nickname = $req->get_parameter('omb_listenee_nickname');
-               if ($nickname && !Validate::string($nickname, array('min_length' => 1,
-                                                                                                                       'max_length' => 64,
-                                                                                                                       'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
-                       $this->client_error(_('Nickname must have only lowercase letters and numbers and no spaces.'));
-                       return false;
-               }
-               $license = $req->get_parameter('omb_listenee_license');
-               if ($license && !common_valid_http_url($license)) {
-                       $this->client_error(sprintf(_("Invalid license URL '%s'"), $license));
-                       return false;
-               }
-               $profile_url = $req->get_parameter('omb_listenee_profile');
-               if ($profile_url && !common_valid_http_url($profile_url)) {
-                       $this->client_error(sprintf(_("Invalid profile URL '%s'."), $profile_url));
-                       return false;
-               }
-               # optional stuff
-               $fullname = $req->get_parameter('omb_listenee_fullname');
-               if ($fullname && strlen($fullname) > 255) {
-                       $this->client_error(_("Full name is too long (max 255 chars)."));
-                       return false;
-               }
-               $homepage = $req->get_parameter('omb_listenee_homepage');
-               if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) {
-                       $this->client_error(sprintf(_("Invalid homepage '%s'"), $homepage));
-                       return false;
-               }
-               $bio = $req->get_parameter('omb_listenee_bio');
-               if ($bio && strlen($bio) > 140) {
-                       $this->client_error(_("Bio is too long (max 140 chars)."));
-                       return false;
-               }
-               $location = $req->get_parameter('omb_listenee_location');
-               if ($location && strlen($location) > 255) {
-                       $this->client_error(_("Location is too long (max 255 chars)."));
-                       return false;
-               }
-               $avatar = $req->get_parameter('omb_listenee_avatar');
-               if ($avatar) {
-                       if (!common_valid_http_url($avatar) || strlen($avatar) > 255) {
-                               $this->client_error(sprintf(_("Invalid avatar URL '%s'"), $avatar));
-                               return false;
-                       }
-                       $size = @getimagesize($avatar);
-                       if (!$size) {
-                               $this->client_error(sprintf(_("Can't read avatar URL '%s'"), $avatar));
-                               return false;
-                       }
-                       if ($size[0] != AVATAR_PROFILE_SIZE || $size[1] != AVATAR_PROFILE_SIZE) {
-                               $this->client_error(sprintf(_("Wrong size image at '%s'"), $avatar));
-                               return false;
-                       }
-                       if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG,
-                                                                                 IMAGETYPE_PNG))) {
-                               $this->client_error(sprintf(_("Wrong image type for '%s'"), $avatar));
-                               return false;
-                       }
-               }
+        $profile = Profile::staticGet('id', $remote->id);
+        if (!$profile) {
+            # This one is our fault
+            $this->server_error(_('Remote profile with no matching profile'), 500);
+            return false;
+        }
+        $nickname = $req->get_parameter('omb_listenee_nickname');
+        if ($nickname && !Validate::string($nickname, array('min_length' => 1,
+                                                            'max_length' => 64,
+                                                            'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+            $this->client_error(_('Nickname must have only lowercase letters and numbers and no spaces.'));
+            return false;
+        }
+        $license = $req->get_parameter('omb_listenee_license');
+        if ($license && !common_valid_http_url($license)) {
+            $this->client_error(sprintf(_("Invalid license URL '%s'"), $license));
+            return false;
+        }
+        $profile_url = $req->get_parameter('omb_listenee_profile');
+        if ($profile_url && !common_valid_http_url($profile_url)) {
+            $this->client_error(sprintf(_("Invalid profile URL '%s'."), $profile_url));
+            return false;
+        }
+        # optional stuff
+        $fullname = $req->get_parameter('omb_listenee_fullname');
+        if ($fullname && strlen($fullname) > 255) {
+            $this->client_error(_("Full name is too long (max 255 chars)."));
+            return false;
+        }
+        $homepage = $req->get_parameter('omb_listenee_homepage');
+        if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) {
+            $this->client_error(sprintf(_("Invalid homepage '%s'"), $homepage));
+            return false;
+        }
+        $bio = $req->get_parameter('omb_listenee_bio');
+        if ($bio && strlen($bio) > 140) {
+            $this->client_error(_("Bio is too long (max 140 chars)."));
+            return false;
+        }
+        $location = $req->get_parameter('omb_listenee_location');
+        if ($location && strlen($location) > 255) {
+            $this->client_error(_("Location is too long (max 255 chars)."));
+            return false;
+        }
+        $avatar = $req->get_parameter('omb_listenee_avatar');
+        if ($avatar) {
+            if (!common_valid_http_url($avatar) || strlen($avatar) > 255) {
+                $this->client_error(sprintf(_("Invalid avatar URL '%s'"), $avatar));
+                return false;
+            }
+            $size = @getimagesize($avatar);
+            if (!$size) {
+                $this->client_error(sprintf(_("Can't read avatar URL '%s'"), $avatar));
+                return false;
+            }
+            if ($size[0] != AVATAR_PROFILE_SIZE || $size[1] != AVATAR_PROFILE_SIZE) {
+                $this->client_error(sprintf(_("Wrong size image at '%s'"), $avatar));
+                return false;
+            }
+            if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG,
+                                          IMAGETYPE_PNG))) {
+                $this->client_error(sprintf(_("Wrong image type for '%s'"), $avatar));
+                return false;
+            }
+        }
 
-               $orig_profile = clone($profile);
+        $orig_profile = clone($profile);
 
-               if ($nickname) {
-                       $profile->nickname = $nickname;
-               }
-               if ($profile_url) {
-                       $profile->profileurl = $profile_url;
-               }
-               if ($fullname) {
-                       $profile->fullname = $fullname;
-               }
-               if ($homepage) {
-                       $profile->homepage = $homepage;
-               }
-               if ($bio) {
-                       $profile->bio = $bio;
-               }
-               if ($location) {
-                       $profile->location = $location;
-               }
+        if ($nickname) {
+            $profile->nickname = $nickname;
+        }
+        if ($profile_url) {
+            $profile->profileurl = $profile_url;
+        }
+        if ($fullname) {
+            $profile->fullname = $fullname;
+        }
+        if ($homepage) {
+            $profile->homepage = $homepage;
+        }
+        if ($bio) {
+            $profile->bio = $bio;
+        }
+        if ($location) {
+            $profile->location = $location;
+        }
 
-               if (!$profile->update($orig_profile)) {
-                       $this->server_error(_('Could not save new profile info'), 500);
-                       return false;
-               } else {
-                       if ($avatar) {
-                               $temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar');
-                               copy($avatar, $temp_filename);
-                               if (!$profile->setOriginal($temp_filename)) {
-                                       $this->server_error(_('Could not save avatar info'), 500);
-                                       return false;
-                               }
-                       }
-                       header('HTTP/1.1 200 OK');
-                       header('Content-type: text/plain');
-                       print 'Updated profile';
-                       print "\n";
-                       return true;
-               }
-       }
+        if (!$profile->update($orig_profile)) {
+            $this->server_error(_('Could not save new profile info'), 500);
+            return false;
+        } else {
+            if ($avatar) {
+                $temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar');
+                copy($avatar, $temp_filename);
+                if (!$profile->setOriginal($temp_filename)) {
+                    $this->server_error(_('Could not save avatar info'), 500);
+                    return false;
+                }
+            }
+            header('HTTP/1.1 200 OK');
+            header('Content-type: text/plain');
+            print 'Updated profile';
+            print "\n";
+            return true;
+        }
+    }
 }
index ac0a0728cf29bec374f68ceede10408114aedebe..97809f197a6cb6d4e047257d39defeb3c9eb37d5 100644 (file)
@@ -24,556 +24,556 @@ define('TIMESTAMP_THRESHOLD', 300);
 
 class UserauthorizationAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-
-               if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       # CSRF protection
-                       $token = $this->trimmed('token');
-                       if (!$token || $token != common_session_token()) {
-                               $req = $this->get_stored_request();
-                               $this->show_form(_('There was a problem with your session token. Try again, please.'), $req);
-                               return;
-                       }
-                       # We've shown the form, now post user's choice
-                       $this->send_authorization();
-               } else {
-                       if (!common_logged_in()) {
-                               # Go log in, and then come back
-                               common_debug('saving URL for returnto', __FILE__);
-                               common_set_returnto($_SERVER['REQUEST_URI']);
-
-                               common_debug('redirecting to login', __FILE__);
-                               common_redirect(common_local_url('login'));
-                               return;
-                       }
-                       try {
-                               # this must be a new request
-                               common_debug('getting new request', __FILE__);
-                               $req = $this->get_new_request();
-                               if (!$req) {
-                                       $this->client_error(_('No request found!'));
-                               }
-                               common_debug('validating request', __FILE__);
-                               # XXX: only validate new requests, since nonce is one-time use
-                               $this->validate_request($req);
-                               common_debug('showing form', __FILE__);
-                               $this->store_request($req);
-                               $this->show_form($req);
-                       } catch (OAuthException $e) {
-                               $this->clear_request();
-                               $this->client_error($e->getMessage());
-                               return;
-                       }
-
-               }
-       }
-
-       function show_form($req) {
-
-               $nickname = $req->get_parameter('omb_listenee_nickname');
-               $profile = $req->get_parameter('omb_listenee_profile');
-               $license = $req->get_parameter('omb_listenee_license');
-               $fullname = $req->get_parameter('omb_listenee_fullname');
-               $homepage = $req->get_parameter('omb_listenee_homepage');
-               $bio = $req->get_parameter('omb_listenee_bio');
-               $location = $req->get_parameter('omb_listenee_location');
-               $avatar = $req->get_parameter('omb_listenee_avatar');
-
-               common_show_header(_('Authorize subscription'));
-               common_element('p', NULL, _('Please check these details to make sure '.
-                                                                        'that you want to subscribe to this user\'s notices. '.
-                                                                        'If you didn\'t just ask to subscribe to someone\'s notices, '.
-                                                                        'click "Cancel".'));
-               common_element_start('div', 'profile');
-               if ($avatar) {
-                       common_element('img', array('src' => $avatar,
-                                                                               'class' => 'avatar profile',
-                                                                               'width' => AVATAR_PROFILE_SIZE,
-                                                                               'height' => AVATAR_PROFILE_SIZE,
-                                                                               'alt' => $nickname));
-               }
-               common_element('a', array('href' => $profile,
-                                                                 'class' => 'external profile nickname'),
-                                          $nickname);
-               if ($fullname) {
-                       common_element_start('div', 'fullname');
-                       if ($homepage) {
-                               common_element('a', array('href' => $homepage),
-                                                          $fullname);
-                       } else {
-                               common_text($fullname);
-                       }
-                       common_element_end('div');
-               }
-               if ($location) {
-                       common_element('div', 'location', $location);
-               }
-               if ($bio) {
-                       common_element('div', 'bio', $bio);
-               }
-               common_element_start('div', 'license');
-               common_element('a', array('href' => $license,
-                                                                 'class' => 'license'),
-                                          $license);
-               common_element_end('div');
-               common_element_end('div');
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'userauthorization',
-                                                                                  'name' => 'userauthorization',
-                                                                                  'action' => common_local_url('userauthorization')));
-               common_hidden('token', common_session_token());
-               common_submit('accept', _('Accept'));
-               common_submit('reject', _('Reject'));
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function send_authorization() {
-               $req = $this->get_stored_request();
-
-               if (!$req) {
-                       common_user_error(_('No authorization request!'));
-                       return;
-               }
-
-               $callback = $req->get_parameter('oauth_callback');
-
-               if ($this->arg('accept')) {
-                       if (!$this->authorize_token($req)) {
-                               $this->client_error(_('Error authorizing token'));
-                       }
-                       if (!$this->save_remote_profile($req)) {
-                               $this->client_error(_('Error saving remote profile'));
-                       }
-                       if (!$callback) {
-                               $this->show_accept_message($req->get_parameter('oauth_token'));
-                       } else {
-                               $params = array();
-                               $params['oauth_token'] = $req->get_parameter('oauth_token');
-                               $params['omb_version'] = OMB_VERSION_01;
-                               $user = User::staticGet('uri', $req->get_parameter('omb_listener'));
-                               $profile = $user->getProfile();
-                               if (!$profile) {
-                                       common_log_db_error($user, 'SELECT', __FILE__);
-                                       $this->server_error(_('User without matching profile'));
-                                       return;
-                               }
-                               $params['omb_listener_nickname'] = $user->nickname;
-                               $params['omb_listener_profile'] = common_local_url('showstream',
-                                                                                                                                  array('nickname' => $user->nickname));
-                               if ($profile->fullname) {
-                                       $params['omb_listener_fullname'] = $profile->fullname;
-                               }
-                               if ($profile->homepage) {
-                                       $params['omb_listener_homepage'] = $profile->homepage;
-                               }
-                               if ($profile->bio) {
-                                       $params['omb_listener_bio'] = $profile->bio;
-                               }
-                               if ($profile->location) {
-                                       $params['omb_listener_location'] = $profile->location;
-                               }
-                               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-                               if ($avatar) {
-                                       $params['omb_listener_avatar'] = $avatar->url;
-                               }
-                               $parts = array();
-                               foreach ($params as $k => $v) {
-                                       $parts[] = $k . '=' . OAuthUtil::urlencodeRFC3986($v);
-                               }
-                               $query_string = implode('&', $parts);
-                               $parsed = parse_url($callback);
-                               $url = $callback . (($parsed['query']) ? '&' : '?') . $query_string;
-                               common_redirect($url, 303);
-                       }
-               } else {
-                       if (!$callback) {
-                               $this->show_reject_message();
-                       } else {
-                               # XXX: not 100% sure how to signal failure... just redirect without token?
-                               common_redirect($callback, 303);
-                       }
-               }
-       }
-
-       function authorize_token(&$req) {
-               $consumer_key = $req->get_parameter('oauth_consumer_key');
-               $token_field = $req->get_parameter('oauth_token');
-               common_debug('consumer key = "'.$consumer_key.'"', __FILE__);
-               common_debug('token field = "'.$token_field.'"', __FILE__);
-               $rt = new Token();
-               $rt->consumer_key = $consumer_key;
-               $rt->tok = $token_field;
-               $rt->type = 0;
-               $rt->state = 0;
-               common_debug('request token to look up: "'.print_r($rt,TRUE).'"');
-               if ($rt->find(true)) {
-                       common_debug('found request token to authorize', __FILE__);
-                       $orig_rt = clone($rt);
-                       $rt->state = 1; # Authorized but not used
-                       if ($rt->update($orig_rt)) {
-                               common_debug('updated request token so it is authorized', __FILE__);
-                               return true;
-                       }
-               }
-               return FALSE;
-       }
-
-       # XXX: refactor with similar code in finishremotesubscribe.php
-
-       function save_remote_profile(&$req) {
-               # FIXME: we should really do this when the consumer comes
-               # back for an access token. If they never do, we've got stuff in a
-               # weird state.
-
-               $nickname = $req->get_parameter('omb_listenee_nickname');
-               $fullname = $req->get_parameter('omb_listenee_fullname');
-               $profile_url = $req->get_parameter('omb_listenee_profile');
-               $homepage = $req->get_parameter('omb_listenee_homepage');
-               $bio = $req->get_parameter('omb_listenee_bio');
-               $location = $req->get_parameter('omb_listenee_location');
-               $avatar_url = $req->get_parameter('omb_listenee_avatar');
-
-               $listenee = $req->get_parameter('omb_listenee');
-               $remote = Remote_profile::staticGet('uri', $listenee);
-
-               if ($remote) {
-                       $exists = true;
-                       $profile = Profile::staticGet($remote->id);
-                       $orig_remote = clone($remote);
-                       $orig_profile = clone($profile);
-               } else {
-                       $exists = false;
-                       $remote = new Remote_profile();
-                       $remote->uri = $listenee;
-                       $profile = new Profile();
-               }
-
-               $profile->nickname = $nickname;
-               $profile->profileurl = $profile_url;
-
-               if ($fullname) {
-                       $profile->fullname = $fullname;
-               }
-               if ($homepage) {
-                       $profile->homepage = $homepage;
-               }
-               if ($bio) {
-                       $profile->bio = $bio;
-               }
-               if ($location) {
-                       $profile->location = $location;
-               }
-
-               if ($exists) {
-                       $profile->update($orig_profile);
-               } else {
-                       $profile->created = DB_DataObject_Cast::dateTime(); # current time
-                       $id = $profile->insert();
-                       if (!$id) {
-                               return FALSE;
-                       }
-                       $remote->id = $id;
-               }
-
-               if ($exists) {
-                       if (!$remote->update($orig_remote)) {
-                               return FALSE;
-                       }
-               } else {
-                       $remote->created = DB_DataObject_Cast::dateTime(); # current time
-                       if (!$remote->insert()) {
-                               return FALSE;
-                       }
-               }
-
-               if ($avatar_url) {
-                       if (!$this->add_avatar($profile, $avatar_url)) {
-                               return FALSE;
-                       }
-               }
-
-               $user = common_current_user();
-               $datastore = omb_oauth_datastore();
-               $consumer = $this->get_consumer($datastore, $req);
-               $token = $this->get_token($datastore, $req, $consumer);
-
-               $sub = new Subscription();
-               $sub->subscriber = $user->id;
-               $sub->subscribed = $remote->id;
-               $sub->token = $token->key; # NOTE: request token, not valid for use!
-               $sub->created = DB_DataObject_Cast::dateTime(); # current time
-
-               if (!$sub->insert()) {
-                       return FALSE;
-               }
-
-               return TRUE;
-       }
-
-       function add_avatar($profile, $url) {
-               $temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar');
-               copy($url, $temp_filename);
-               return $profile->setOriginal($temp_filename);
-       }
-
-       function show_accept_message($tok) {
-               common_show_header(_('Subscription authorized'));
-               common_element('p', NULL,
-                                          _('The subscription has been authorized, but no '.
-                                                 'callback URL was passed. Check with the site\'s instructions for '.
-                                                 'details on how to authorize the subscription. Your subscription token is:'));
-               common_element('blockquote', 'token', $tok);
-               common_show_footer();
-       }
-
-       function show_reject_message($tok) {
-               common_show_header(_('Subscription rejected'));
-               common_element('p', NULL,
-                                          _('The subscription has been rejected, but no '.
-                                                 'callback URL was passed. Check with the site\'s instructions for '.
-                                                 'details on how to fully reject the subscription.'));
-               common_show_footer();
-       }
-
-       function store_request($req) {
-               common_ensure_session();
-               $_SESSION['userauthorizationrequest'] = $req;
-       }
-
-       function clear_request() {
-               common_ensure_session();
-               unset($_SESSION['userauthorizationrequest']);
-       }
-
-       function get_stored_request() {
-               common_ensure_session();
-               $req = $_SESSION['userauthorizationrequest'];
-               return $req;
-       }
-
-       function get_new_request() {
-               common_remove_magic_from_request();
-               $req = OAuthRequest::from_request();
-               return $req;
-       }
-
-       # Throws an OAuthException if anything goes wrong
-
-       function validate_request(&$req) {
-               # OAuth stuff -- have to copy from OAuth.php since they're
-               # all private methods, and there's no user-authentication method
-               common_debug('checking version', __FILE__);
-               $this->check_version($req);
-               common_debug('getting datastore', __FILE__);
-               $datastore = omb_oauth_datastore();
-               common_debug('getting consumer', __FILE__);
-               $consumer = $this->get_consumer($datastore, $req);
-               common_debug('getting token', __FILE__);
-               $token = $this->get_token($datastore, $req, $consumer);
-               common_debug('checking timestamp', __FILE__);
-               $this->check_timestamp($req);
-               common_debug('checking nonce', __FILE__);
-               $this->check_nonce($datastore, $req, $consumer, $token);
-               common_debug('checking signature', __FILE__);
-               $this->check_signature($req, $consumer, $token);
-               common_debug('validating omb stuff', __FILE__);
-               $this->validate_omb($req);
-               common_debug('done validating', __FILE__);
-               return true;
-       }
-
-       function validate_omb(&$req) {
-               foreach (array('omb_version', 'omb_listener', 'omb_listenee',
-                                          'omb_listenee_profile', 'omb_listenee_nickname',
-                                          'omb_listenee_license') as $param)
-               {
-                       if (!$req->get_parameter($param)) {
-                               throw new OAuthException("Required parameter '$param' not found");
-                       }
-               }
-               # Now, OMB stuff
-               $version = $req->get_parameter('omb_version');
-               if ($version != OMB_VERSION_01) {
-                       throw new OAuthException("OpenMicroBlogging version '$version' not supported");
-               }
-               $listener =     $req->get_parameter('omb_listener');
-               $user = User::staticGet('uri', $listener);
-               if (!$user) {
-                       throw new OAuthException("Listener URI '$listener' not found here");
-               }
-               $cur = common_current_user();
-               if ($cur->id != $user->id) {
-                       throw new OAuthException("Can't add for another user!");
-               }
-               $listenee = $req->get_parameter('omb_listenee');
-               if (!Validate::uri($listenee) &&
-                       !common_valid_tag($listenee)) {
-                       throw new OAuthException("Listenee URI '$listenee' not a recognizable URI");
-               }
-               if (strlen($listenee) > 255) {
-                       throw new OAuthException("Listenee URI '$listenee' too long");
-               }
-
-               $other = User::staticGet('uri', $listenee);
-               if ($other) {
-                       throw new OAuthException("Listenee URI '$listenee' is local user");
-               }
-
-               $remote = Remote_profile::staticGet('uri', $listenee);
-               if ($remote) {
-                       $sub = new Subscription();
-                       $sub->subscriber = $user->id;
-                       $sub->subscribed = $remote->id;
-                       if ($sub->find(TRUE)) {
-                               throw new OAuthException("Already subscribed to user!");
-                       }
-               }
-               $nickname = $req->get_parameter('omb_listenee_nickname');
-               if (!Validate::string($nickname, array('min_length' => 1,
-                                                                                          'max_length' => 64,
-                                                                                          'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
-                       throw new OAuthException('Nickname must have only letters and numbers and no spaces.');
-               }
-               $profile = $req->get_parameter('omb_listenee_profile');
-               if (!common_valid_http_url($profile)) {
-                       throw new OAuthException("Invalid profile URL '$profile'.");
-               }
-
-               if ($profile == common_local_url('showstream', array('nickname' => $nickname))) {
-                       throw new OAuthException("Profile URL '$profile' is for a local user.");
-               }
-
-               $license = $req->get_parameter('omb_listenee_license');
-               if (!common_valid_http_url($license)) {
-                       throw new OAuthException("Invalid license URL '$license'.");
-               }
-               $site_license = common_config('license', 'url');
-               if (!common_compatible_license($license, $site_license)) {
-                       throw new OAuthException("Listenee stream license '$license' not compatible with site license '$site_license'.");
-               }
-               # optional stuff
-               $fullname = $req->get_parameter('omb_listenee_fullname');
-               if ($fullname && strlen($fullname) > 255) {
-                       throw new OAuthException("Full name '$fullname' too long.");
-               }
-               $homepage = $req->get_parameter('omb_listenee_homepage');
-               if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) {
-                       throw new OAuthException("Invalid homepage '$homepage'");
-               }
-               $bio = $req->get_parameter('omb_listenee_bio');
-               if ($bio && strlen($bio) > 140) {
-                       throw new OAuthException("Bio too long '$bio'");
-               }
-               $location = $req->get_parameter('omb_listenee_location');
-               if ($location && strlen($location) > 255) {
-                       throw new OAuthException("Location too long '$location'");
-               }
-               $avatar = $req->get_parameter('omb_listenee_avatar');
-               if ($avatar) {
-                       if (!common_valid_http_url($avatar) || strlen($avatar) > 255) {
-                               throw new OAuthException("Invalid avatar URL '$avatar'");
-                       }
-                       $size = @getimagesize($avatar);
-                       if (!$size) {
-                               throw new OAuthException("Can't read avatar URL '$avatar'");
-                       }
-                       if ($size[0] != AVATAR_PROFILE_SIZE || $size[1] != AVATAR_PROFILE_SIZE) {
-                               throw new OAuthException("Wrong size image at '$avatar'");
-                       }
-                       if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG,
-                                                                                 IMAGETYPE_PNG))) {
-                               throw new OAuthException("Wrong image type for '$avatar'");
-                       }
-               }
-               $callback = $req->get_parameter('oauth_callback');
-               if ($callback && !common_valid_http_url($callback)) {
-                       throw new OAuthException("Invalid callback URL '$callback'");
-               }
-               if ($callback && $callback == common_local_url('finishremotesubscribe')) {
-                       throw new OAuthException("Callback URL '$callback' is for local site.");
-               }
-       }
-
-       # Snagged from OAuthServer
-
-       function check_version(&$req) {
-               $version = $req->get_parameter("oauth_version");
-               if (!$version) {
-                       $version = 1.0;
-               }
-               if ($version != 1.0) {
-                       throw new OAuthException("OAuth version '$version' not supported");
-               }
-               return $version;
-       }
-
-       # Snagged from OAuthServer
-
-       function get_consumer($datastore, $req) {
-               $consumer_key = @$req->get_parameter("oauth_consumer_key");
-               if (!$consumer_key) {
-                       throw new OAuthException("Invalid consumer key");
-               }
-
-               $consumer = $datastore->lookup_consumer($consumer_key);
-               if (!$consumer) {
-                       throw new OAuthException("Invalid consumer");
-               }
-               return $consumer;
-       }
-
-       # Mostly cadged from OAuthServer
-
-       function get_token($datastore, &$req, $consumer) {/*{{{*/
-               $token_field = @$req->get_parameter('oauth_token');
-               $token = $datastore->lookup_token($consumer, 'request', $token_field);
-               if (!$token) {
-                       throw new OAuthException("Invalid $token_type token: $token_field");
-               }
-               return $token;
-       }
-
-       function check_timestamp(&$req) {
-               $timestamp = @$req->get_parameter('oauth_timestamp');
-               $now = time();
-               if ($now - $timestamp > TIMESTAMP_THRESHOLD) {
-                       throw new OAuthException("Expired timestamp, yours $timestamp, ours $now");
-               }
-       }
-
-       # NOTE: don't call twice on the same request; will fail!
-       function check_nonce(&$datastore, &$req, $consumer, $token) {
-               $timestamp = @$req->get_parameter('oauth_timestamp');
-               $nonce = @$req->get_parameter('oauth_nonce');
-               $found = $datastore->lookup_nonce($consumer, $token, $nonce, $timestamp);
-               if ($found) {
-                       throw new OAuthException("Nonce already used");
-               }
-               return true;
-       }
-
-       function check_signature(&$req, $consumer, $token) {
-               $signature_method = $this->get_signature_method($req);
-               $signature = $req->get_parameter('oauth_signature');
-               $valid_sig = $signature_method->check_signature($req,
-                                                                                                               $consumer,
-                                                                                                               $token,
-                                                                                                               $signature);
-               if (!$valid_sig) {
-                       throw new OAuthException("Invalid signature");
-               }
-       }
-
-       function get_signature_method(&$req) {
-               $signature_method = @$req->get_parameter("oauth_signature_method");
-               if (!$signature_method) {
-                       $signature_method = "PLAINTEXT";
-               }
-               if ($signature_method != 'HMAC-SHA1') {
-                       throw new OAuthException("Signature method '$signature_method' not supported.");
-               }
-               return omb_hmac_sha1();
-       }
+    function handle($args) {
+        parent::handle($args);
+
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            # CSRF protection
+            $token = $this->trimmed('token');
+            if (!$token || $token != common_session_token()) {
+                $req = $this->get_stored_request();
+                $this->show_form(_('There was a problem with your session token. Try again, please.'), $req);
+                return;
+            }
+            # We've shown the form, now post user's choice
+            $this->send_authorization();
+        } else {
+            if (!common_logged_in()) {
+                # Go log in, and then come back
+                common_debug('saving URL for returnto', __FILE__);
+                common_set_returnto($_SERVER['REQUEST_URI']);
+
+                common_debug('redirecting to login', __FILE__);
+                common_redirect(common_local_url('login'));
+                return;
+            }
+            try {
+                # this must be a new request
+                common_debug('getting new request', __FILE__);
+                $req = $this->get_new_request();
+                if (!$req) {
+                    $this->client_error(_('No request found!'));
+                }
+                common_debug('validating request', __FILE__);
+                # XXX: only validate new requests, since nonce is one-time use
+                $this->validate_request($req);
+                common_debug('showing form', __FILE__);
+                $this->store_request($req);
+                $this->show_form($req);
+            } catch (OAuthException $e) {
+                $this->clear_request();
+                $this->client_error($e->getMessage());
+                return;
+            }
+
+        }
+    }
+
+    function show_form($req) {
+
+        $nickname = $req->get_parameter('omb_listenee_nickname');
+        $profile = $req->get_parameter('omb_listenee_profile');
+        $license = $req->get_parameter('omb_listenee_license');
+        $fullname = $req->get_parameter('omb_listenee_fullname');
+        $homepage = $req->get_parameter('omb_listenee_homepage');
+        $bio = $req->get_parameter('omb_listenee_bio');
+        $location = $req->get_parameter('omb_listenee_location');
+        $avatar = $req->get_parameter('omb_listenee_avatar');
+
+        common_show_header(_('Authorize subscription'));
+        common_element('p', NULL, _('Please check these details to make sure '.
+                                     'that you want to subscribe to this user\'s notices. '.
+                                     'If you didn\'t just ask to subscribe to someone\'s notices, '.
+                                     'click "Cancel".'));
+        common_element_start('div', 'profile');
+        if ($avatar) {
+            common_element('img', array('src' => $avatar,
+                                        'class' => 'avatar profile',
+                                        'width' => AVATAR_PROFILE_SIZE,
+                                        'height' => AVATAR_PROFILE_SIZE,
+                                        'alt' => $nickname));
+        }
+        common_element('a', array('href' => $profile,
+                                  'class' => 'external profile nickname'),
+                       $nickname);
+        if ($fullname) {
+            common_element_start('div', 'fullname');
+            if ($homepage) {
+                common_element('a', array('href' => $homepage),
+                               $fullname);
+            } else {
+                common_text($fullname);
+            }
+            common_element_end('div');
+        }
+        if ($location) {
+            common_element('div', 'location', $location);
+        }
+        if ($bio) {
+            common_element('div', 'bio', $bio);
+        }
+        common_element_start('div', 'license');
+        common_element('a', array('href' => $license,
+                                  'class' => 'license'),
+                       $license);
+        common_element_end('div');
+        common_element_end('div');
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'userauthorization',
+                                           'name' => 'userauthorization',
+                                           'action' => common_local_url('userauthorization')));
+        common_hidden('token', common_session_token());
+        common_submit('accept', _('Accept'));
+        common_submit('reject', _('Reject'));
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function send_authorization() {
+        $req = $this->get_stored_request();
+
+        if (!$req) {
+            common_user_error(_('No authorization request!'));
+            return;
+        }
+
+        $callback = $req->get_parameter('oauth_callback');
+
+        if ($this->arg('accept')) {
+            if (!$this->authorize_token($req)) {
+                $this->client_error(_('Error authorizing token'));
+            }
+            if (!$this->save_remote_profile($req)) {
+                $this->client_error(_('Error saving remote profile'));
+            }
+            if (!$callback) {
+                $this->show_accept_message($req->get_parameter('oauth_token'));
+            } else {
+                $params = array();
+                $params['oauth_token'] = $req->get_parameter('oauth_token');
+                $params['omb_version'] = OMB_VERSION_01;
+                $user = User::staticGet('uri', $req->get_parameter('omb_listener'));
+                $profile = $user->getProfile();
+                if (!$profile) {
+                    common_log_db_error($user, 'SELECT', __FILE__);
+                    $this->server_error(_('User without matching profile'));
+                    return;
+                }
+                $params['omb_listener_nickname'] = $user->nickname;
+                $params['omb_listener_profile'] = common_local_url('showstream',
+                                                                   array('nickname' => $user->nickname));
+                if ($profile->fullname) {
+                    $params['omb_listener_fullname'] = $profile->fullname;
+                }
+                if ($profile->homepage) {
+                    $params['omb_listener_homepage'] = $profile->homepage;
+                }
+                if ($profile->bio) {
+                    $params['omb_listener_bio'] = $profile->bio;
+                }
+                if ($profile->location) {
+                    $params['omb_listener_location'] = $profile->location;
+                }
+                $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+                if ($avatar) {
+                    $params['omb_listener_avatar'] = $avatar->url;
+                }
+                $parts = array();
+                foreach ($params as $k => $v) {
+                    $parts[] = $k . '=' . OAuthUtil::urlencodeRFC3986($v);
+                }
+                $query_string = implode('&', $parts);
+                $parsed = parse_url($callback);
+                $url = $callback . (($parsed['query']) ? '&' : '?') . $query_string;
+                common_redirect($url, 303);
+            }
+        } else {
+            if (!$callback) {
+                $this->show_reject_message();
+            } else {
+                # XXX: not 100% sure how to signal failure... just redirect without token?
+                common_redirect($callback, 303);
+            }
+        }
+    }
+
+    function authorize_token(&$req) {
+        $consumer_key = $req->get_parameter('oauth_consumer_key');
+        $token_field = $req->get_parameter('oauth_token');
+        common_debug('consumer key = "'.$consumer_key.'"', __FILE__);
+        common_debug('token field = "'.$token_field.'"', __FILE__);
+        $rt = new Token();
+        $rt->consumer_key = $consumer_key;
+        $rt->tok = $token_field;
+        $rt->type = 0;
+        $rt->state = 0;
+        common_debug('request token to look up: "'.print_r($rt,TRUE).'"');
+        if ($rt->find(true)) {
+            common_debug('found request token to authorize', __FILE__);
+            $orig_rt = clone($rt);
+            $rt->state = 1; # Authorized but not used
+            if ($rt->update($orig_rt)) {
+                common_debug('updated request token so it is authorized', __FILE__);
+                return true;
+            }
+        }
+        return FALSE;
+    }
+
+    # XXX: refactor with similar code in finishremotesubscribe.php
+
+    function save_remote_profile(&$req) {
+        # FIXME: we should really do this when the consumer comes
+        # back for an access token. If they never do, we've got stuff in a
+        # weird state.
+
+        $nickname = $req->get_parameter('omb_listenee_nickname');
+        $fullname = $req->get_parameter('omb_listenee_fullname');
+        $profile_url = $req->get_parameter('omb_listenee_profile');
+        $homepage = $req->get_parameter('omb_listenee_homepage');
+        $bio = $req->get_parameter('omb_listenee_bio');
+        $location = $req->get_parameter('omb_listenee_location');
+        $avatar_url = $req->get_parameter('omb_listenee_avatar');
+
+        $listenee = $req->get_parameter('omb_listenee');
+        $remote = Remote_profile::staticGet('uri', $listenee);
+
+        if ($remote) {
+            $exists = true;
+            $profile = Profile::staticGet($remote->id);
+            $orig_remote = clone($remote);
+            $orig_profile = clone($profile);
+        } else {
+            $exists = false;
+            $remote = new Remote_profile();
+            $remote->uri = $listenee;
+            $profile = new Profile();
+        }
+
+        $profile->nickname = $nickname;
+        $profile->profileurl = $profile_url;
+
+        if ($fullname) {
+            $profile->fullname = $fullname;
+        }
+        if ($homepage) {
+            $profile->homepage = $homepage;
+        }
+        if ($bio) {
+            $profile->bio = $bio;
+        }
+        if ($location) {
+            $profile->location = $location;
+        }
+
+        if ($exists) {
+            $profile->update($orig_profile);
+        } else {
+            $profile->created = DB_DataObject_Cast::dateTime(); # current time
+            $id = $profile->insert();
+            if (!$id) {
+                return FALSE;
+            }
+            $remote->id = $id;
+        }
+
+        if ($exists) {
+            if (!$remote->update($orig_remote)) {
+                return FALSE;
+            }
+        } else {
+            $remote->created = DB_DataObject_Cast::dateTime(); # current time
+            if (!$remote->insert()) {
+                return FALSE;
+            }
+        }
+
+        if ($avatar_url) {
+            if (!$this->add_avatar($profile, $avatar_url)) {
+                return FALSE;
+            }
+        }
+
+        $user = common_current_user();
+        $datastore = omb_oauth_datastore();
+        $consumer = $this->get_consumer($datastore, $req);
+        $token = $this->get_token($datastore, $req, $consumer);
+
+        $sub = new Subscription();
+        $sub->subscriber = $user->id;
+        $sub->subscribed = $remote->id;
+        $sub->token = $token->key; # NOTE: request token, not valid for use!
+        $sub->created = DB_DataObject_Cast::dateTime(); # current time
+
+        if (!$sub->insert()) {
+            return FALSE;
+        }
+
+        return TRUE;
+    }
+
+    function add_avatar($profile, $url) {
+        $temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar');
+        copy($url, $temp_filename);
+        return $profile->setOriginal($temp_filename);
+    }
+
+    function show_accept_message($tok) {
+        common_show_header(_('Subscription authorized'));
+        common_element('p', NULL,
+                       _('The subscription has been authorized, but no '.
+                          'callback URL was passed. Check with the site\'s instructions for '.
+                          'details on how to authorize the subscription. Your subscription token is:'));
+        common_element('blockquote', 'token', $tok);
+        common_show_footer();
+    }
+
+    function show_reject_message($tok) {
+        common_show_header(_('Subscription rejected'));
+        common_element('p', NULL,
+                       _('The subscription has been rejected, but no '.
+                          'callback URL was passed. Check with the site\'s instructions for '.
+                          'details on how to fully reject the subscription.'));
+        common_show_footer();
+    }
+
+    function store_request($req) {
+        common_ensure_session();
+        $_SESSION['userauthorizationrequest'] = $req;
+    }
+
+    function clear_request() {
+        common_ensure_session();
+        unset($_SESSION['userauthorizationrequest']);
+    }
+
+    function get_stored_request() {
+        common_ensure_session();
+        $req = $_SESSION['userauthorizationrequest'];
+        return $req;
+    }
+
+    function get_new_request() {
+        common_remove_magic_from_request();
+        $req = OAuthRequest::from_request();
+        return $req;
+    }
+
+    # Throws an OAuthException if anything goes wrong
+
+    function validate_request(&$req) {
+        # OAuth stuff -- have to copy from OAuth.php since they're
+        # all private methods, and there's no user-authentication method
+        common_debug('checking version', __FILE__);
+        $this->check_version($req);
+        common_debug('getting datastore', __FILE__);
+        $datastore = omb_oauth_datastore();
+        common_debug('getting consumer', __FILE__);
+        $consumer = $this->get_consumer($datastore, $req);
+        common_debug('getting token', __FILE__);
+        $token = $this->get_token($datastore, $req, $consumer);
+        common_debug('checking timestamp', __FILE__);
+        $this->check_timestamp($req);
+        common_debug('checking nonce', __FILE__);
+        $this->check_nonce($datastore, $req, $consumer, $token);
+        common_debug('checking signature', __FILE__);
+        $this->check_signature($req, $consumer, $token);
+        common_debug('validating omb stuff', __FILE__);
+        $this->validate_omb($req);
+        common_debug('done validating', __FILE__);
+        return true;
+    }
+
+    function validate_omb(&$req) {
+        foreach (array('omb_version', 'omb_listener', 'omb_listenee',
+                       'omb_listenee_profile', 'omb_listenee_nickname',
+                       'omb_listenee_license') as $param)
+        {
+            if (!$req->get_parameter($param)) {
+                throw new OAuthException("Required parameter '$param' not found");
+            }
+        }
+        # Now, OMB stuff
+        $version = $req->get_parameter('omb_version');
+        if ($version != OMB_VERSION_01) {
+            throw new OAuthException("OpenMicroBlogging version '$version' not supported");
+        }
+        $listener =    $req->get_parameter('omb_listener');
+        $user = User::staticGet('uri', $listener);
+        if (!$user) {
+            throw new OAuthException("Listener URI '$listener' not found here");
+        }
+        $cur = common_current_user();
+        if ($cur->id != $user->id) {
+            throw new OAuthException("Can't add for another user!");
+        }
+        $listenee = $req->get_parameter('omb_listenee');
+        if (!Validate::uri($listenee) &&
+            !common_valid_tag($listenee)) {
+            throw new OAuthException("Listenee URI '$listenee' not a recognizable URI");
+        }
+        if (strlen($listenee) > 255) {
+            throw new OAuthException("Listenee URI '$listenee' too long");
+        }
+
+        $other = User::staticGet('uri', $listenee);
+        if ($other) {
+            throw new OAuthException("Listenee URI '$listenee' is local user");
+        }
+
+        $remote = Remote_profile::staticGet('uri', $listenee);
+        if ($remote) {
+            $sub = new Subscription();
+            $sub->subscriber = $user->id;
+            $sub->subscribed = $remote->id;
+            if ($sub->find(TRUE)) {
+                throw new OAuthException("Already subscribed to user!");
+            }
+        }
+        $nickname = $req->get_parameter('omb_listenee_nickname');
+        if (!Validate::string($nickname, array('min_length' => 1,
+                                               'max_length' => 64,
+                                               'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+            throw new OAuthException('Nickname must have only letters and numbers and no spaces.');
+        }
+        $profile = $req->get_parameter('omb_listenee_profile');
+        if (!common_valid_http_url($profile)) {
+            throw new OAuthException("Invalid profile URL '$profile'.");
+        }
+
+        if ($profile == common_local_url('showstream', array('nickname' => $nickname))) {
+            throw new OAuthException("Profile URL '$profile' is for a local user.");
+        }
+
+        $license = $req->get_parameter('omb_listenee_license');
+        if (!common_valid_http_url($license)) {
+            throw new OAuthException("Invalid license URL '$license'.");
+        }
+        $site_license = common_config('license', 'url');
+        if (!common_compatible_license($license, $site_license)) {
+            throw new OAuthException("Listenee stream license '$license' not compatible with site license '$site_license'.");
+        }
+        # optional stuff
+        $fullname = $req->get_parameter('omb_listenee_fullname');
+        if ($fullname && strlen($fullname) > 255) {
+            throw new OAuthException("Full name '$fullname' too long.");
+        }
+        $homepage = $req->get_parameter('omb_listenee_homepage');
+        if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) {
+            throw new OAuthException("Invalid homepage '$homepage'");
+        }
+        $bio = $req->get_parameter('omb_listenee_bio');
+        if ($bio && strlen($bio) > 140) {
+            throw new OAuthException("Bio too long '$bio'");
+        }
+        $location = $req->get_parameter('omb_listenee_location');
+        if ($location && strlen($location) > 255) {
+            throw new OAuthException("Location too long '$location'");
+        }
+        $avatar = $req->get_parameter('omb_listenee_avatar');
+        if ($avatar) {
+            if (!common_valid_http_url($avatar) || strlen($avatar) > 255) {
+                throw new OAuthException("Invalid avatar URL '$avatar'");
+            }
+            $size = @getimagesize($avatar);
+            if (!$size) {
+                throw new OAuthException("Can't read avatar URL '$avatar'");
+            }
+            if ($size[0] != AVATAR_PROFILE_SIZE || $size[1] != AVATAR_PROFILE_SIZE) {
+                throw new OAuthException("Wrong size image at '$avatar'");
+            }
+            if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG,
+                                          IMAGETYPE_PNG))) {
+                throw new OAuthException("Wrong image type for '$avatar'");
+            }
+        }
+        $callback = $req->get_parameter('oauth_callback');
+        if ($callback && !common_valid_http_url($callback)) {
+            throw new OAuthException("Invalid callback URL '$callback'");
+        }
+        if ($callback && $callback == common_local_url('finishremotesubscribe')) {
+            throw new OAuthException("Callback URL '$callback' is for local site.");
+        }
+    }
+
+    # Snagged from OAuthServer
+
+    function check_version(&$req) {
+        $version = $req->get_parameter("oauth_version");
+        if (!$version) {
+            $version = 1.0;
+        }
+        if ($version != 1.0) {
+            throw new OAuthException("OAuth version '$version' not supported");
+        }
+        return $version;
+    }
+
+    # Snagged from OAuthServer
+
+    function get_consumer($datastore, $req) {
+        $consumer_key = @$req->get_parameter("oauth_consumer_key");
+        if (!$consumer_key) {
+            throw new OAuthException("Invalid consumer key");
+        }
+
+        $consumer = $datastore->lookup_consumer($consumer_key);
+        if (!$consumer) {
+            throw new OAuthException("Invalid consumer");
+        }
+        return $consumer;
+    }
+
+    # Mostly cadged from OAuthServer
+
+    function get_token($datastore, &$req, $consumer) {/*{{{*/
+        $token_field = @$req->get_parameter('oauth_token');
+        $token = $datastore->lookup_token($consumer, 'request', $token_field);
+        if (!$token) {
+            throw new OAuthException("Invalid $token_type token: $token_field");
+        }
+        return $token;
+    }
+
+    function check_timestamp(&$req) {
+        $timestamp = @$req->get_parameter('oauth_timestamp');
+        $now = time();
+        if ($now - $timestamp > TIMESTAMP_THRESHOLD) {
+            throw new OAuthException("Expired timestamp, yours $timestamp, ours $now");
+        }
+    }
+
+    # NOTE: don't call twice on the same request; will fail!
+    function check_nonce(&$datastore, &$req, $consumer, $token) {
+        $timestamp = @$req->get_parameter('oauth_timestamp');
+        $nonce = @$req->get_parameter('oauth_nonce');
+        $found = $datastore->lookup_nonce($consumer, $token, $nonce, $timestamp);
+        if ($found) {
+            throw new OAuthException("Nonce already used");
+        }
+        return true;
+    }
+
+    function check_signature(&$req, $consumer, $token) {
+        $signature_method = $this->get_signature_method($req);
+        $signature = $req->get_parameter('oauth_signature');
+        $valid_sig = $signature_method->check_signature($req,
+                                                        $consumer,
+                                                        $token,
+                                                        $signature);
+        if (!$valid_sig) {
+            throw new OAuthException("Invalid signature");
+        }
+    }
+
+    function get_signature_method(&$req) {
+        $signature_method = @$req->get_parameter("oauth_signature_method");
+        if (!$signature_method) {
+            $signature_method = "PLAINTEXT";
+        }
+        if ($signature_method != 'HMAC-SHA1') {
+            throw new OAuthException("Signature method '$signature_method' not supported.");
+        }
+        return omb_hmac_sha1();
+    }
 }
index 38bff2edeee6b3a18640275bcb1319990450cdb5..4eab8758c222e95009c9188ad84e76b181d3999e 100644 (file)
 if (!defined('LACONICA')) { exit(1); }
 
 class UserbyidAction extends Action {
-       
-       function is_readonly() {                                
-               return true;
-       }
-       
+    
+    function is_readonly() {                
+        return true;
+    }
+    
     function handle($args) {
         parent::handle($args);
         $id = $this->trimmed('id');
         if (!$id) {
-               $this->client_error(_('No id.'));
-               }
-               $user =& User::staticGet($id);
-               if (!$user) {
-                       $this->client_error(_('No such user.'));
+            $this->client_error(_('No id.'));
+        }
+        $user =& User::staticGet($id);
+        if (!$user) {
+            $this->client_error(_('No such user.'));
         }
 
         // support redirecting to FOAF rdf/xml if the agent prefers it
         $page_prefs = 'application/rdf+xml,text/html,application/xhtml+xml,application/xml;q=0.3,text/xml;q=0.2';
         $httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : NULL;
-       $type = common_negotiate_type(common_accept_to_prefs($httpaccept),
+        $type = common_negotiate_type(common_accept_to_prefs($httpaccept),
                                       common_accept_to_prefs($page_prefs));
-               $page = $type == 'application/rdf+xml' ? 'foaf' : 'showstream';
+        $page = $type == 'application/rdf+xml' ? 'foaf' : 'showstream';
 
-               $url = common_local_url($page, array('nickname' => $user->nickname));
-               common_redirect($url, 303);
-       }
+        $url = common_local_url($page, array('nickname' => $user->nickname));
+        common_redirect($url, 303);
+    }
 }
index e57f861054bc70964b7108092246cf1ceff36077..b5cb5a40a062c446bb36a075a1d1fe7b83670ced 100644 (file)
@@ -25,66 +25,66 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class UserrssAction extends Rss10Action {
 
-       var $user = NULL;
+    var $user = NULL;
 
-       function init() {
-               $nickname = $this->trimmed('nickname');
-               $this->user = User::staticGet('nickname', $nickname);
+    function init() {
+        $nickname = $this->trimmed('nickname');
+        $this->user = User::staticGet('nickname', $nickname);
 
-               if (!$this->user) {
-                       common_user_error(_('No such user.'));
-                       return false;
-               } else {
-                       return true;
-               }
-       }
+        if (!$this->user) {
+            common_user_error(_('No such user.'));
+            return false;
+        } else {
+            return true;
+        }
+    }
 
-       function get_notices($limit=0) {
+    function get_notices($limit=0) {
 
-               $user = $this->user;
-               
-               if (is_null($user)) {
-                       return NULL;
-               }
-               
-               $notice = $user->getNotices(0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
-               
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
+        $user = $this->user;
+        
+        if (is_null($user)) {
+            return NULL;
+        }
+        
+        $notice = $user->getNotices(0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
+        
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
 
-               return $notices;
-       }
+        return $notices;
+    }
 
-       function get_channel() {
-               $user = $this->user;
-               $profile = $user->getProfile();
-               $c = array('url' => common_local_url('userrss',
-                                                                                        array('nickname' =>
-                                                                                                  $user->nickname)),
-                                  'title' => $user->nickname,
-                                  'link' => $profile->profileurl,
-                                  'description' => sprintf(_('Microblog by %s'), $user->nickname));
-               return $c;
-       }
+    function get_channel() {
+        $user = $this->user;
+        $profile = $user->getProfile();
+        $c = array('url' => common_local_url('userrss',
+                                             array('nickname' =>
+                                                   $user->nickname)),
+                   'title' => $user->nickname,
+                   'link' => $profile->profileurl,
+                   'description' => sprintf(_('Microblog by %s'), $user->nickname));
+        return $c;
+    }
 
-       function get_image() {
-               $user = $this->user;
-               $profile = $user->getProfile();
-               if (!$profile) {
-                       common_log_db_error($user, 'SELECT', __FILE__);
-                       $this->server_error(_('User without matching profile'));
-                       return NULL;
-               }
-               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-               return ($avatar) ? $avatar->url : NULL;
-       }
+    function get_image() {
+        $user = $this->user;
+        $profile = $user->getProfile();
+        if (!$profile) {
+            common_log_db_error($user, 'SELECT', __FILE__);
+            $this->server_error(_('User without matching profile'));
+            return NULL;
+        }
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+        return ($avatar) ? $avatar->url : NULL;
+    }
 
-       # override parent to add X-SUP-ID URL
-       
-       function init_rss($limit=0) {
-               $url = common_local_url('sup', NULL, $this->user->id);
-               header('X-SUP-ID: '.$url);
-               parent::init_rss($limit);
-       }
+    # override parent to add X-SUP-ID URL
+    
+    function init_rss($limit=0) {
+        $url = common_local_url('sup', NULL, $this->user->id);
+        header('X-SUP-ID: '.$url);
+        parent::init_rss($limit);
+    }
 }
\ No newline at end of file
index 1d516aab72e78d6681e7b6d614f71810fc146eb5..9788c87aab688f21ec5b468a48ea636cf600b96a 100644 (file)
@@ -23,110 +23,110 @@ require_once(INSTALLDIR.'/lib/omb.php');
 
 class XrdsAction extends Action {
 
-       function is_readonly() {                                
-               return true;
-       }
-
-       function handle($args) {
-               parent::handle($args);
-               $nickname = $this->trimmed('nickname');
-               $user = User::staticGet('nickname', $nickname);
-               if (!$user) {
-                       common_user_error(_('No such user.'));
-                       return;
-               }
-               $this->show_xrds($user);
-       }
-
-       function show_xrds($user) {
-
-               header('Content-Type: application/xrds+xml');
-
-               common_start_xml();
-               common_element_start('XRDS', array('xmlns' => 'xri://$xrds'));
-
-               common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
-                                                 'xml:id' => 'oauth',
-                                                                                 'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
-                                                                                 'version' => '2.0'));
-
-               common_element('Type', NULL, 'xri://$xrds*simple');
-
-               $this->show_service(OAUTH_ENDPOINT_REQUEST,
-                                                       common_local_url('requesttoken'),
-                                                       array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
-                                                       array(OAUTH_HMAC_SHA1),
-                                                       $user->uri);
-
-               $this->show_service(OAUTH_ENDPOINT_AUTHORIZE,
-                                                       common_local_url('userauthorization'),
-                                                       array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
-                                                       array(OAUTH_HMAC_SHA1));
-
-               $this->show_service(OAUTH_ENDPOINT_ACCESS,
-                                                       common_local_url('accesstoken'),
-                                                       array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
-                                                       array(OAUTH_HMAC_SHA1));
-
-               $this->show_service(OAUTH_ENDPOINT_RESOURCE,
-                                                       NULL,
-                                                       array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
-                                                       array(OAUTH_HMAC_SHA1));
-
-               common_element_end('XRD');
-
-               # XXX: decide whether to include user's ID/nickname in postNotice URL
-
-               common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
-                                                 'xml:id' => 'omb',
-                                                                                 'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
-                                                                                 'version' => '2.0'));
-
-               common_element('Type', NULL, 'xri://$xrds*simple');
-
-               $this->show_service(OMB_ENDPOINT_POSTNOTICE,
-                                                       common_local_url('postnotice'));
-
-               $this->show_service(OMB_ENDPOINT_UPDATEPROFILE,
-                                                       common_local_url('updateprofile'));
-
-               common_element_end('XRD');
-
-               common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
-                                                                                 'version' => '2.0'));
-
-               common_element('Type', NULL, 'xri://$xrds*simple');
-
-               $this->show_service(OAUTH_DISCOVERY,
-                                                       '#oauth');
-               $this->show_service(OMB_NAMESPACE,
-                                                       '#omb');
-
-               common_element_end('XRD');
-
-               common_element_end('XRDS');
-               common_end_xml();
-       }
-
-       function show_service($type, $uri, $params=NULL, $sigs=NULL, $localId=NULL) {
-               common_element_start('Service');
-               if ($uri) {
-                       common_element('URI', NULL, $uri);
-               }
-               common_element('Type', NULL, $type);
-               if ($params) {
-                       foreach ($params as $param) {
-                               common_element('Type', NULL, $param);
-                       }
-               }
-               if ($sigs) {
-                       foreach ($sigs as $sig) {
-                               common_element('Type', NULL, $sig);
-                       }
-               }
-               if ($localId) {
-                       common_element('LocalID', NULL, $localId);
-               }
-               common_element_end('Service');
-       }
+    function is_readonly() {                
+        return true;
+    }
+
+    function handle($args) {
+        parent::handle($args);
+        $nickname = $this->trimmed('nickname');
+        $user = User::staticGet('nickname', $nickname);
+        if (!$user) {
+            common_user_error(_('No such user.'));
+            return;
+        }
+        $this->show_xrds($user);
+    }
+
+    function show_xrds($user) {
+
+        header('Content-Type: application/xrds+xml');
+
+        common_start_xml();
+        common_element_start('XRDS', array('xmlns' => 'xri://$xrds'));
+
+        common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
+                                          'xml:id' => 'oauth',
+                                          'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
+                                          'version' => '2.0'));
+
+        common_element('Type', NULL, 'xri://$xrds*simple');
+
+        $this->show_service(OAUTH_ENDPOINT_REQUEST,
+                            common_local_url('requesttoken'),
+                            array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
+                            array(OAUTH_HMAC_SHA1),
+                            $user->uri);
+
+        $this->show_service(OAUTH_ENDPOINT_AUTHORIZE,
+                            common_local_url('userauthorization'),
+                            array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
+                            array(OAUTH_HMAC_SHA1));
+
+        $this->show_service(OAUTH_ENDPOINT_ACCESS,
+                            common_local_url('accesstoken'),
+                            array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
+                            array(OAUTH_HMAC_SHA1));
+
+        $this->show_service(OAUTH_ENDPOINT_RESOURCE,
+                            NULL,
+                            array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
+                            array(OAUTH_HMAC_SHA1));
+
+        common_element_end('XRD');
+
+        # XXX: decide whether to include user's ID/nickname in postNotice URL
+
+        common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
+                                          'xml:id' => 'omb',
+                                          'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
+                                          'version' => '2.0'));
+
+        common_element('Type', NULL, 'xri://$xrds*simple');
+
+        $this->show_service(OMB_ENDPOINT_POSTNOTICE,
+                            common_local_url('postnotice'));
+
+        $this->show_service(OMB_ENDPOINT_UPDATEPROFILE,
+                            common_local_url('updateprofile'));
+
+        common_element_end('XRD');
+
+        common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
+                                          'version' => '2.0'));
+
+        common_element('Type', NULL, 'xri://$xrds*simple');
+
+        $this->show_service(OAUTH_DISCOVERY,
+                            '#oauth');
+        $this->show_service(OMB_NAMESPACE,
+                            '#omb');
+
+        common_element_end('XRD');
+
+        common_element_end('XRDS');
+        common_end_xml();
+    }
+
+    function show_service($type, $uri, $params=NULL, $sigs=NULL, $localId=NULL) {
+        common_element_start('Service');
+        if ($uri) {
+            common_element('URI', NULL, $uri);
+        }
+        common_element('Type', NULL, $type);
+        if ($params) {
+            foreach ($params as $param) {
+                common_element('Type', NULL, $param);
+            }
+        }
+        if ($sigs) {
+            foreach ($sigs as $sig) {
+                common_element('Type', NULL, $sig);
+            }
+        }
+        if ($localId) {
+            common_element('LocalID', NULL, $localId);
+        }
+        common_element_end('Service');
+    }
 }
\ No newline at end of file
index 901c47c51e8e4c039f15daaeaefe1dcad7d27397..e63668a3360c0f9f80508bfdc872fad88dc55737 100644 (file)
@@ -26,70 +26,70 @@ class Avatar extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-       # We clean up the file, too
+    # We clean up the file, too
 
-       function delete() {
-               $filename = $this->filename;
-               if (parent::delete()) {
-                       @unlink(common_avatar_path($filename));
-               }
-       }
+    function delete() {
+        $filename = $this->filename;
+        if (parent::delete()) {
+            @unlink(common_avatar_path($filename));
+        }
+    }
 
-       # Create and save scaled version of this avatar
-       # XXX: maybe break into different methods
+    # Create and save scaled version of this avatar
+    # XXX: maybe break into different methods
 
-       function scale($size) {
+    function scale($size) {
 
-               $image_s = imagecreatetruecolor($size, $size);
-               $image_a = $this->to_image();
-               $square = min($this->width, $this->height);
+        $image_s = imagecreatetruecolor($size, $size);
+        $image_a = $this->to_image();
+        $square = min($this->width, $this->height);
         imagecolortransparent($image_s, imagecolorallocate($image_s, 0, 0, 0));
         imagealphablending($image_s, false);
         imagesavealpha($image_s, true);
-               imagecopyresampled($image_s, $image_a, 0, 0, 0, 0,
-                                                  $size, $size, $square, $square);
+        imagecopyresampled($image_s, $image_a, 0, 0, 0, 0,
+                           $size, $size, $square, $square);
 
-               $ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png";
+        $ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png";
 
-               $filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp());
+        $filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp());
 
-               if ($this->mediatype == 'image/jpeg') {
-                       imagejpeg($image_s, common_avatar_path($filename));
-               } else {
-                       imagepng($image_s, common_avatar_path($filename));
-               }
+        if ($this->mediatype == 'image/jpeg') {
+            imagejpeg($image_s, common_avatar_path($filename));
+        } else {
+            imagepng($image_s, common_avatar_path($filename));
+        }
 
-               $scaled = DB_DataObject::factory('avatar');
-               $scaled->profile_id = $this->profile_id;
-               $scaled->width = $size;
-               $scaled->height = $size;
-               $scaled->original = false;
-               $scaled->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png';
-               $scaled->filename = $filename;
-               $scaled->url = common_avatar_url($filename);
-               $scaled->created = DB_DataObject_Cast::dateTime(); # current time
+        $scaled = DB_DataObject::factory('avatar');
+        $scaled->profile_id = $this->profile_id;
+        $scaled->width = $size;
+        $scaled->height = $size;
+        $scaled->original = false;
+        $scaled->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png';
+        $scaled->filename = $filename;
+        $scaled->url = common_avatar_url($filename);
+        $scaled->created = DB_DataObject_Cast::dateTime(); # current time
 
-               if ($scaled->insert()) {
-                       return $scaled;
-               } else {
-                       return NULL;
-               }
-       }
+        if ($scaled->insert()) {
+            return $scaled;
+        } else {
+            return NULL;
+        }
+    }
 
-       function to_image() {
-               $filepath = common_avatar_path($this->filename);
-               if ($this->mediatype == 'image/gif') {
-                       return imagecreatefromgif($filepath);
-               } else if ($this->mediatype == 'image/jpeg') {
-                       return imagecreatefromjpeg($filepath);
-               } else if ($this->mediatype == 'image/png') {
-                       return imagecreatefrompng($filepath);
-               } else {
-                       return NULL;
-               }
-       }
-       
-       function &pkeyGet($kv) {
-               return Memcached_DataObject::pkeyGet('Avatar', $kv);
-       }
+    function to_image() {
+        $filepath = common_avatar_path($this->filename);
+        if ($this->mediatype == 'image/gif') {
+            return imagecreatefromgif($filepath);
+        } else if ($this->mediatype == 'image/jpeg') {
+            return imagecreatefromjpeg($filepath);
+        } else if ($this->mediatype == 'image/png') {
+            return imagecreatefrompng($filepath);
+        } else {
+            return NULL;
+        }
+    }
+    
+    function &pkeyGet($kv) {
+        return Memcached_DataObject::pkeyGet('Avatar', $kv);
+    }
 }
index bcc0c36b56517a0ac813fcf885bd78bace4b0012..384fe8bb194c85b64f4d8bcf998dfc77884ae5b2 100644 (file)
 if (!defined('LACONICA')) { exit(1); }
 
 class Channel {
-       
-       function on($user) {
-               return false;
-       }
-
-       function off($user) {
-               return false;
-       }
-
-       function output($user, $text) {
-               return false;
-       }
-       
-       function error($user, $text) {
-               return false;
-       }
-       
-       function source() {
-               return NULL;
-       }
+    
+    function on($user) {
+        return false;
+    }
+
+    function off($user) {
+        return false;
+    }
+
+    function output($user, $text) {
+        return false;
+    }
+    
+    function error($user, $text) {
+        return false;
+    }
+    
+    function source() {
+        return NULL;
+    }
 }
 
 class XMPPChannel extends Channel {
 
-       var $conn = NULL;
-       
-       function source() {
-               return 'xmpp';
-       }
-       
-       function __construct($conn) {
-               $this->conn = $conn;
-       }
-       
-       function on($user) {
-               return $this->set_notify($user, 1);
-       }
-       
-       function off($user) {
-               return $this->set_notify($user, 0);
-       }
-
-       function output($user, $text) {
-               $text = '['.common_config('site', 'name') . '] ' . $text;
-               jabber_send_message($user->jabber, $text);
-       }
-       
-       function error($user, $text) {
-               $text = '['.common_config('site', 'name') . '] ' . $text;
-               jabber_send_message($user->jabber, $text);
-       }
-       
-       function set_notify(&$user, $notify) {
-               $orig = clone($user);
-               $user->jabbernotify = $notify;
-               $result = $user->update($orig);
-               if (!$result) {
-                       $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
-                       common_log(LOG_ERR,
-                                          'Could not set notify flag to ' . $notify .
-                                          ' for user ' . common_log_objstring($user) .
-                                          ': ' . $last_error->message);
-                       return false;
-               } else {
-                       common_log(LOG_INFO,
-                                          'User ' . $user->nickname . ' set notify flag to ' . $notify);
-                       return true;
-               }
-       }
+    var $conn = NULL;
+    
+    function source() {
+        return 'xmpp';
+    }
+    
+    function __construct($conn) {
+        $this->conn = $conn;
+    }
+    
+    function on($user) {
+        return $this->set_notify($user, 1);
+    }
+    
+    function off($user) {
+        return $this->set_notify($user, 0);
+    }
+
+    function output($user, $text) {
+        $text = '['.common_config('site', 'name') . '] ' . $text;
+        jabber_send_message($user->jabber, $text);
+    }
+    
+    function error($user, $text) {
+        $text = '['.common_config('site', 'name') . '] ' . $text;
+        jabber_send_message($user->jabber, $text);
+    }
+    
+    function set_notify(&$user, $notify) {
+        $orig = clone($user);
+        $user->jabbernotify = $notify;
+        $result = $user->update($orig);
+        if (!$result) {
+            $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
+            common_log(LOG_ERR,
+                       'Could not set notify flag to ' . $notify .
+                       ' for user ' . common_log_objstring($user) .
+                       ': ' . $last_error->message);
+            return false;
+        } else {
+            common_log(LOG_INFO,
+                       'User ' . $user->nickname . ' set notify flag to ' . $notify);
+            return true;
+        }
+    }
 }
 
 
 class WebChannel extends Channel {
 
-       function source() {
-               return 'web';
-       }
-       
-       function on($user) {
-               return false;
-       }
-       
-       function off($user) {
-               return false;
-       }
-
-       function output($user, $text) {
-               # XXX: buffer all output and send it at the end
-               # XXX: even better, redirect to appropriate page
-               #      depending on what command was run
-               common_show_header(_('Command results'));
-               common_element('p', NULL, $text);
-               common_show_footer();
-       }
-       
-       function error($user, $text) {
-               common_user_error($text);
-       }
+    function source() {
+        return 'web';
+    }
+    
+    function on($user) {
+        return false;
+    }
+    
+    function off($user) {
+        return false;
+    }
+
+    function output($user, $text) {
+        # XXX: buffer all output and send it at the end
+        # XXX: even better, redirect to appropriate page
+        #      depending on what command was run
+        common_show_header(_('Command results'));
+        common_element('p', NULL, $text);
+        common_show_footer();
+    }
+    
+    function error($user, $text) {
+        common_user_error($text);
+    }
 }
 
 
 class AjaxWebChannel extends WebChannel {
 
-       function output($user, $text) {
-               common_start_html('text/xml;charset=utf-8', true);
-               common_element_start('head');
-               common_element('title', null, _('Command results'));
-               common_element_end('head');
-               common_element_start('body');
-               common_element('p', array('id' => 'command_result'), $text);
-               common_element_end('body');
-               common_element_end('html');
-       }
-
-       function error($user, $text) {
-               common_start_html('text/xml;charset=utf-8', true);
-               common_element_start('head');
-               common_element('title', null, _('Ajax Error'));
-               common_element_end('head');
-               common_element_start('body');
-               common_element('p', array('id' => 'error'), $text);
-               common_element_end('body');
-               common_element_end('html');
-       }
+    function output($user, $text) {
+        common_start_html('text/xml;charset=utf-8', true);
+        common_element_start('head');
+        common_element('title', null, _('Command results'));
+        common_element_end('head');
+        common_element_start('body');
+        common_element('p', array('id' => 'command_result'), $text);
+        common_element_end('body');
+        common_element_end('html');
+    }
+
+    function error($user, $text) {
+        common_start_html('text/xml;charset=utf-8', true);
+        common_element_start('head');
+        common_element('title', null, _('Ajax Error'));
+        common_element_end('head');
+        common_element_start('body');
+        common_element('p', array('id' => 'error'), $text);
+        common_element_end('body');
+        common_element_end('html');
+    }
 }
 
 
 class MailChannel extends Channel {
 
-       var $addr = NULL;
-
-       function source() {
-               return 'mail';
-       }
-       
-       function __construct($addr=NULL) {
-               $this->addr = $addr;
-       }
-       
-       function on($user) {
-               return $this->set_notify($user, 1);
-       }
-       
-       function off($user) {
-               return $this->set_notify($user, 0);
-       }
-
-       function output($user, $text) {
-
-               $headers['From'] = $user->incomingemail;
-               $headers['To'] = $this->addr;
-               
-               $headers['Subject'] = _('Command complete');
-
-               return mail_send(array($this->addr), $headers, $text);
-       }
-       
-       function error($user, $text) {
-               
-               $headers['From'] = $user->incomingemail;
-               $headers['To'] = $this->addr;
-               
-               $headers['Subject'] = _('Command failed');
-
-               return mail_send(array($this->addr), $headers, $text);
-       }
-       
-       function set_notify($user, $value) {
-               $orig = clone($user);
-               $user->smsnotify = $value;
-               $result = $user->update($orig);
-               if (!$result) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       return false;
-               }
-               return true;
-       }
+    var $addr = NULL;
+
+    function source() {
+        return 'mail';
+    }
+    
+    function __construct($addr=NULL) {
+        $this->addr = $addr;
+    }
+    
+    function on($user) {
+        return $this->set_notify($user, 1);
+    }
+    
+    function off($user) {
+        return $this->set_notify($user, 0);
+    }
+
+    function output($user, $text) {
+
+        $headers['From'] = $user->incomingemail;
+        $headers['To'] = $this->addr;
+        
+        $headers['Subject'] = _('Command complete');
+
+        return mail_send(array($this->addr), $headers, $text);
+    }
+    
+    function error($user, $text) {
+        
+        $headers['From'] = $user->incomingemail;
+        $headers['To'] = $this->addr;
+        
+        $headers['Subject'] = _('Command failed');
+
+        return mail_send(array($this->addr), $headers, $text);
+    }
+    
+    function set_notify($user, $value) {
+        $orig = clone($user);
+        $user->smsnotify = $value;
+        $result = $user->update($orig);
+        if (!$result) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            return false;
+        }
+        return true;
+    }
 }
index c2409d140a2ac152c86ca780ffe36d288833bf42..ff44b9d1eb7cc1d17a13ead6088821b9c81970d5 100644 (file)
@@ -22,22 +22,22 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/classes/Channel.php');
 
 class Command {
-       
-       var $user = NULL;
-       
-       function __construct($user=NULL) {
-               $this->user = $user;
-       }
-       
-       function execute($channel) {
-               return false;
-       }
+    
+    var $user = NULL;
+    
+    function __construct($user=NULL) {
+        $this->user = $user;
+    }
+    
+    function execute($channel) {
+        return false;
+    }
 }
 
 class UnimplementedCommand extends Command {
-       function execute($channel) {
-               $channel->error($this->user, _("Sorry, this command is not yet implemented."));
-       }
+    function execute($channel) {
+        $channel->error($this->user, _("Sorry, this command is not yet implemented."));
+    }
 }
 
 class TrackingCommand extends UnimplementedCommand {
@@ -47,330 +47,330 @@ class TrackOffCommand extends UnimplementedCommand {
 }
 
 class TrackCommand extends UnimplementedCommand {
-       var $word = NULL;
-       function __construct($user, $word) {
-               parent::__construct($user);
-               $this->word = $word;
-       }
+    var $word = NULL;
+    function __construct($user, $word) {
+        parent::__construct($user);
+        $this->word = $word;
+    }
 }
 
 class UntrackCommand extends UnimplementedCommand {
-       var $word = NULL;
-       function __construct($user, $word) {
-               parent::__construct($user);
-               $this->word = $word;
-       }
+    var $word = NULL;
+    function __construct($user, $word) {
+        parent::__construct($user);
+        $this->word = $word;
+    }
 }
 
 class NudgeCommand extends UnimplementedCommand {
-       var $other = NULL;
-       function __construct($user, $other) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
+    var $other = NULL;
+    function __construct($user, $other) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
 }
 
 class InviteCommand extends UnimplementedCommand {
-       var $other = NULL;
-       function __construct($user, $other) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
+    var $other = NULL;
+    function __construct($user, $other) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
 }
 
 class StatsCommand extends Command {
-       function execute($channel) {
+    function execute($channel) {
 
-               $subs = new Subscription();
-               $subs->subscriber = $this->user->id;
-               $subs_count = (int) $subs->count() - 1;
+        $subs = new Subscription();
+        $subs->subscriber = $this->user->id;
+        $subs_count = (int) $subs->count() - 1;
 
-               $subbed = new Subscription();
-               $subbed->subscribed = $this->user->id;
-               $subbed_count = (int) $subbed->count() - 1;
+        $subbed = new Subscription();
+        $subbed->subscribed = $this->user->id;
+        $subbed_count = (int) $subbed->count() - 1;
 
-               $notices = new Notice();
-               $notices->profile_id = $this->user->id;
-               $notice_count = (int) $notices->count();
-               
-               $channel->output($this->user, sprintf(_("Subscriptions: %1\$s\n".
-                                                                  "Subscribers: %2\$s\n".
-                                                                  "Notices: %3\$s"),
-                                                                $subs_count,
-                                                                $subbed_count,
-                                                                $notice_count));
-       }
+        $notices = new Notice();
+        $notices->profile_id = $this->user->id;
+        $notice_count = (int) $notices->count();
+        
+        $channel->output($this->user, sprintf(_("Subscriptions: %1\$s\n".
+                                   "Subscribers: %2\$s\n".
+                                   "Notices: %3\$s"),
+                                 $subs_count,
+                                 $subbed_count,
+                                 $notice_count));
+    }
 }
 
 class FavCommand extends Command {
-       
-       var $other = NULL;
-       
-       function __construct($user, $other) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
-       
-       function execute($channel) {
-               
-               $recipient = 
-                 common_relative_profile($this->user, common_canonical_nickname($this->other));
-               
-               if (!$recipient) {
-                       $channel->error($this->user, _('No such user.'));
-                       return;
-               }
-               $notice = $recipient->getCurrentNotice();
-               if (!$notice) {
-                       $channel->error($this->user, _('User has no last notice'));
-                       return;
-               }
-               
-               $fave = Fave::addNew($this->user, $notice);
+    
+    var $other = NULL;
+    
+    function __construct($user, $other) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
+    
+    function execute($channel) {
+        
+        $recipient = 
+          common_relative_profile($this->user, common_canonical_nickname($this->other));
+        
+        if (!$recipient) {
+            $channel->error($this->user, _('No such user.'));
+            return;
+        }
+        $notice = $recipient->getCurrentNotice();
+        if (!$notice) {
+            $channel->error($this->user, _('User has no last notice'));
+            return;
+        }
+        
+        $fave = Fave::addNew($this->user, $notice);
 
-               if (!$fave) {
-                       $channel->error($this->user, _('Could not create favorite.'));
-                       return;
-               }
+        if (!$fave) {
+            $channel->error($this->user, _('Could not create favorite.'));
+            return;
+        }
 
-           $other = User::staticGet('id', $recipient->id);
-               
-               if ($other && $other->id != $user->id) {
-                       if ($other->email && $other->emailnotifyfav) {
-                               mail_notify_fave($other, $this->user, $notice);
-                       }
-               }
-               
-               $this->user->blowFavesCache();
-               
-               $channel->output($this->user, _('Notice marked as fave.'));
-       }
+        $other = User::staticGet('id', $recipient->id);
+        
+        if ($other && $other->id != $user->id) {
+            if ($other->email && $other->emailnotifyfav) {
+                mail_notify_fave($other, $this->user, $notice);
+            }
+        }
+        
+        $this->user->blowFavesCache();
+        
+        $channel->output($this->user, _('Notice marked as fave.'));
+    }
 }
 
 class WhoisCommand extends Command {
-       var $other = NULL;
-       function __construct($user, $other) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
-       
-       function execute($channel) {
-               $recipient = 
-                 common_relative_profile($this->user, common_canonical_nickname($this->other));
-               
-               if (!$recipient) {
-                       $channel->error($this->user, _('No such user.'));
-                       return;
-               }
-               
-               $whois = sprintf(_("%1\$s (%2\$s)"), $recipient->nickname,
-                                                $recipient->profileurl);
-               if ($recipient->fullname) {
-                       $whois .= "\n" . sprintf(_('Fullname: %s'), $recipient->fullname);
-               }
-               if ($recipient->location) {
-                       $whois .= "\n" . sprintf(_('Location: %s'), $recipient->location);
-               }
-               if ($recipient->homepage) {
-                       $whois .= "\n" . sprintf(_('Homepage: %s'), $recipient->homepage);
-               }
-               if ($recipient->bio) {
-                       $whois .= "\n" . sprintf(_('About: %s'), $recipient->bio);
-               }
-               $channel->output($this->user, $whois);
-       }
+    var $other = NULL;
+    function __construct($user, $other) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
+    
+    function execute($channel) {
+        $recipient = 
+          common_relative_profile($this->user, common_canonical_nickname($this->other));
+        
+        if (!$recipient) {
+            $channel->error($this->user, _('No such user.'));
+            return;
+        }
+        
+        $whois = sprintf(_("%1\$s (%2\$s)"), $recipient->nickname,
+                         $recipient->profileurl);
+        if ($recipient->fullname) {
+            $whois .= "\n" . sprintf(_('Fullname: %s'), $recipient->fullname);
+        }
+        if ($recipient->location) {
+            $whois .= "\n" . sprintf(_('Location: %s'), $recipient->location);
+        }
+        if ($recipient->homepage) {
+            $whois .= "\n" . sprintf(_('Homepage: %s'), $recipient->homepage);
+        }
+        if ($recipient->bio) {
+            $whois .= "\n" . sprintf(_('About: %s'), $recipient->bio);
+        }
+        $channel->output($this->user, $whois);
+    }
 }
 
 class MessageCommand extends Command {
-       var $other = NULL;
-       var $text = NULL;
-       function __construct($user, $other, $text) {
-               parent::__construct($user);
-               $this->other = $other;
-               $this->text = $text;
-       }
-       
-       function execute($channel) {
-               $other = User::staticGet('nickname', common_canonical_nickname($this->other));
-               $len = mb_strlen($this->text);
-               if ($len == 0) {
-                       $channel->error($this->user, _('No content!'));
-                       return;
-               } else if ($len > 140) {
-                       $content = common_shorten_links($content);
-                       if (mb_strlen($content) > 140) {
-                               $channel->error($this->user, sprintf(_('Message too long - maximum is 140 characters, you sent %d'), $len));
-                               return;
-                       }
-               }
-               
-               if (!$other) {
-                       $channel->error($this->user, _('No such user.'));
-                       return;
-               } else if (!$this->user->mutuallySubscribed($other)) {
-                       $channel->error($this->user, _('You can\'t send a message to this user.'));
-                       return;
-               } else if ($this->user->id == $other->id) {
-                       $channel->error($this->user, _('Don\'t send a message to yourself; just say it to yourself quietly instead.'));
-                       return;
-               }
-               $message = Message::saveNew($this->user->id, $other->id, $this->text, $channel->source());
-               if ($message) {
-                       $channel->output($this->user, sprintf(_('Direct message to %s sent'), $this->other));
-               } else {
-                       $channel->error($this->user, _('Error sending direct message.'));
-               }
-       }
+    var $other = NULL;
+    var $text = NULL;
+    function __construct($user, $other, $text) {
+        parent::__construct($user);
+        $this->other = $other;
+        $this->text = $text;
+    }
+    
+    function execute($channel) {
+        $other = User::staticGet('nickname', common_canonical_nickname($this->other));
+        $len = mb_strlen($this->text);
+        if ($len == 0) {
+            $channel->error($this->user, _('No content!'));
+            return;
+        } else if ($len > 140) {
+            $content = common_shorten_links($content);
+            if (mb_strlen($content) > 140) {
+                $channel->error($this->user, sprintf(_('Message too long - maximum is 140 characters, you sent %d'), $len));
+                return;
+            }
+        }
+        
+        if (!$other) {
+            $channel->error($this->user, _('No such user.'));
+            return;
+        } else if (!$this->user->mutuallySubscribed($other)) {
+            $channel->error($this->user, _('You can\'t send a message to this user.'));
+            return;
+        } else if ($this->user->id == $other->id) {
+            $channel->error($this->user, _('Don\'t send a message to yourself; just say it to yourself quietly instead.'));
+            return;
+        }
+        $message = Message::saveNew($this->user->id, $other->id, $this->text, $channel->source());
+        if ($message) {
+            $channel->output($this->user, sprintf(_('Direct message to %s sent'), $this->other));
+        } else {
+            $channel->error($this->user, _('Error sending direct message.'));
+        }
+    }
 }
 
 class GetCommand extends Command {
-       
-       var $other = NULL;
-       
-       function __construct($user, $other) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
-       
-       function execute($channel) {
-               $target_nickname = common_canonical_nickname($this->other);
-               
-               $target =
-                 common_relative_profile($this->user, $target_nickname);
+    
+    var $other = NULL;
+    
+    function __construct($user, $other) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
+    
+    function execute($channel) {
+        $target_nickname = common_canonical_nickname($this->other);
+        
+        $target =
+          common_relative_profile($this->user, $target_nickname);
 
-               if (!$target) {
-                       $channel->error($this->user, _('No such user.'));
-                       return;
-               }
-               $notice = $target->getCurrentNotice();
-               if (!$notice) {
-                       $channel->error($this->user, _('User has no last notice'));
-                       return;
-               }
-               $notice_content = $notice->content;
-               
-               $channel->output($this->user, $target_nickname . ": " . $notice_content);
-       }
+        if (!$target) {
+            $channel->error($this->user, _('No such user.'));
+            return;
+        }
+        $notice = $target->getCurrentNotice();
+        if (!$notice) {
+            $channel->error($this->user, _('User has no last notice'));
+            return;
+        }
+        $notice_content = $notice->content;
+        
+        $channel->output($this->user, $target_nickname . ": " . $notice_content);
+    }
 }
 
 class SubCommand extends Command {
-       
-       var $other = NULL;
-       
-       function __construct($user, $other) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
-       
-       function execute($channel) {
-               
-               if (!$this->other) {
-                       $channel->error($this->user, _('Specify the name of the user to subscribe to'));
-                       return;
-               }
-               
-               $result = subs_subscribe_user($this->user, $this->other);
-               
-               if ($result == 'true') {
-                       $channel->output($this->user, sprintf(_('Subscribed to %s'), $this->other));
-               } else {
-                       $channel->error($this->user, $result);
-               }
-       }
+    
+    var $other = NULL;
+    
+    function __construct($user, $other) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
+    
+    function execute($channel) {
+        
+        if (!$this->other) {
+            $channel->error($this->user, _('Specify the name of the user to subscribe to'));
+            return;
+        }
+        
+        $result = subs_subscribe_user($this->user, $this->other);
+        
+        if ($result == 'true') {
+            $channel->output($this->user, sprintf(_('Subscribed to %s'), $this->other));
+        } else {
+            $channel->error($this->user, $result);
+        }
+    }
 }
 
 class UnsubCommand extends Command {
 
-       var $other = NULL;
-       
-       function __construct($user, $other) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
+    var $other = NULL;
+    
+    function __construct($user, $other) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
 
-       function execute($channel) {
-               if(!$this->other) {
-                       $channel->error($this->user, _('Specify the name of the user to unsubscribe from'));
-                       return;
-               }
-               
-               $result=subs_unsubscribe_user($this->user, $this->other);
-               
-               if ($result) {
-                       $channel->output($this->user, sprintf(_('Unsubscribed from %s'), $this->other));
-               } else {
-                       $channel->error($this->user, $result);
-               }
-       }
+    function execute($channel) {
+        if(!$this->other) {
+            $channel->error($this->user, _('Specify the name of the user to unsubscribe from'));
+            return;
+        }
+        
+        $result=subs_unsubscribe_user($this->user, $this->other);
+        
+        if ($result) {
+            $channel->output($this->user, sprintf(_('Unsubscribed from %s'), $this->other));
+        } else {
+            $channel->error($this->user, $result);
+        }
+    }
 }
 
 class OffCommand extends Command {
-       var $other = NULL;
-       function __construct($user, $other=NULL) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
-       function execute($channel) {
-               if ($other) {
-                       $channel->error($this->user, _("Command not yet implemented."));
-               } else {
-                       if ($channel->off($this->user)) {
-                               $channel->output($this->user, _('Notification off.'));
-                       } else {
-                               $channel->error($this->user, _('Can\'t turn off notification.'));
-                       }
-               }
-       }
+    var $other = NULL;
+    function __construct($user, $other=NULL) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
+    function execute($channel) {
+        if ($other) {
+            $channel->error($this->user, _("Command not yet implemented."));
+        } else {
+            if ($channel->off($this->user)) {
+                $channel->output($this->user, _('Notification off.'));
+            } else {
+                $channel->error($this->user, _('Can\'t turn off notification.'));
+            }
+        }
+    }
 }
 
 class OnCommand extends Command {
-       var $other = NULL;
-       function __construct($user, $other=NULL) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
-       
-       function execute($channel) {
-               if ($other) {
-                       $channel->error($this->user, _("Command not yet implemented."));
-               } else {
-                       if ($channel->on($this->user)) {
-                               $channel->output($this->user, _('Notification on.'));
-                       } else {
-                               $channel->error($this->user, _('Can\'t turn on notification.'));
-                       }
-               }
-       }
+    var $other = NULL;
+    function __construct($user, $other=NULL) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
+    
+    function execute($channel) {
+        if ($other) {
+            $channel->error($this->user, _("Command not yet implemented."));
+        } else {
+            if ($channel->on($this->user)) {
+                $channel->output($this->user, _('Notification on.'));
+            } else {
+                $channel->error($this->user, _('Can\'t turn on notification.'));
+            }
+        }
+    }
 }
 
 class HelpCommand extends Command {
-       function execute($channel) {
-               $channel->output($this->user,
-                                                _("Commands:\n".
-                                                  "on - turn on notifications\n".
-                                                  "off - turn off notifications\n".
-                                                  "help - show this help\n".
-                                                  "follow <nickname> - subscribe to user\n".
-                                                  "leave <nickname> - unsubscribe from user\n".
-                                                  "d <nickname> <text> - direct message to user\n".
-                                                  "get <nickname> - get last notice from user\n".
-                                                  "whois <nickname> - get profile info on user\n".
-                                                  "fav <nickname> - add user's last notice as a 'fave'\n".
-                                                  "stats - get your stats\n".
-                                                  "stop - same as 'off'\n".
-                                                  "quit - same as 'off'\n".
-                                                  "sub <nickname> - same as 'follow'\n".
-                                                  "unsub <nickname> - same as 'leave'\n".
-                                                  "last <nickname> - same as 'get'\n".
-                                                  "on <nickname> - not yet implemented.\n".
-                                                  "off <nickname> - not yet implemented.\n".                                              
-                                                  "nudge <nickname> - not yet implemented.\n".
-                                                  "invite <phone number> - not yet implemented.\n".
-                                                  "track <word> - not yet implemented.\n".
-                                                  "untrack <word> - not yet implemented.\n".
-                                                  "track off - not yet implemented.\n".
-                                                  "untrack all - not yet implemented.\n".
-                                                  "tracks - not yet implemented.\n".
-                                                  "tracking - not yet implemented.\n"));
-       }
+    function execute($channel) {
+        $channel->output($this->user,
+                         _("Commands:\n".
+                           "on - turn on notifications\n".
+                           "off - turn off notifications\n".
+                           "help - show this help\n".
+                           "follow <nickname> - subscribe to user\n".
+                           "leave <nickname> - unsubscribe from user\n".
+                           "d <nickname> <text> - direct message to user\n".
+                           "get <nickname> - get last notice from user\n".
+                           "whois <nickname> - get profile info on user\n".
+                           "fav <nickname> - add user's last notice as a 'fave'\n".
+                           "stats - get your stats\n".
+                           "stop - same as 'off'\n".
+                           "quit - same as 'off'\n".
+                           "sub <nickname> - same as 'follow'\n".
+                           "unsub <nickname> - same as 'leave'\n".
+                           "last <nickname> - same as 'get'\n".
+                           "on <nickname> - not yet implemented.\n".
+                           "off <nickname> - not yet implemented.\n".                           
+                           "nudge <nickname> - not yet implemented.\n".
+                           "invite <phone number> - not yet implemented.\n".
+                           "track <word> - not yet implemented.\n".
+                           "untrack <word> - not yet implemented.\n".
+                           "track off - not yet implemented.\n".
+                           "untrack all - not yet implemented.\n".
+                           "tracks - not yet implemented.\n".
+                           "tracking - not yet implemented.\n"));
+    }
 }
index 4e27f8f7966d8a1201189ae3f11fb2ace516a3e9..8192fb1a93e3309b4a6b176e522ed972e3acee59 100644 (file)
@@ -22,174 +22,174 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/classes/Command.php');
 
 class CommandInterpreter {
-       
-       function handle_command($user, $text) {
-               # XXX: localise
+    
+    function handle_command($user, $text) {
+        # XXX: localise
 
-               $text = preg_replace('/\s+/', ' ', trim($text));
-               list($cmd, $arg) = explode(' ', $text, 2);
+        $text = preg_replace('/\s+/', ' ', trim($text));
+        list($cmd, $arg) = explode(' ', $text, 2);
 
-               # We try to support all the same commands as Twitter, see
-               # http://getsatisfaction.com/twitter/topics/what_are_the_twitter_commands
-               # There are a few compatibility commands from earlier versions of 
-               # Laconica
-               
-               switch(strtolower($cmd)) {
-                case 'help':
-                       if ($arg) {
-                               return NULL;
-                       }
-                       return new HelpCommand($user);
-                case 'on':
-                       if ($arg) {
-                               list($other, $extra) = explode(' ', $arg, 2);
-                               if ($extra) {
-                                       return NULL;
-                               } else {
-                                       return new OnCommand($user, $other);
-                               }
-                       } else {
-                               return new OnCommand($user);
-                       }
-                case 'off':
-                       if ($arg) {
-                               list($other, $extra) = explode(' ', $arg, 2);
-                               if ($extra) {
-                                       return NULL;
-                               } else {
-                                       return new OffCommand($user, $other);
-                               }
-                       } else {
-                               return new OffCommand($user);
-                       }
-                case 'stop':
-                case 'quit':
-                       if ($arg) {
-                               return NULL;
-                       } else {
-                               return new OffCommand($user);
-                       }
-                case 'follow':
-                case 'sub':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else {
-                               return new SubCommand($user, $other);
-                       }
-                case 'leave':
-                case 'unsub':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else {
-                               return new UnsubCommand($user, $other);
-                       }
-                case 'get':
-                case 'last':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else {
-                               return new GetCommand($user, $other);
-                       }
-                case 'd':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if (!$extra) {
-                               return NULL;
-                       } else {
-                               return new MessageCommand($user, $other, $extra);
-                       }
-                case 'whois':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else {
-                               return new WhoisCommand($user, $other);
-                       }
-                case 'fav':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else {
-                               return new FavCommand($user, $other);
-                       }
-                case 'nudge':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else {
-                               return new NudgeCommand($user, $other);
-                       }
-                case 'stats':
-                       if ($arg) {
-                               return NULL;
-                       }
-                       return new StatsCommand($user);
-                case 'invite':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else {
-                               return new InviteCommand($user, $other);
-                       }
-                case 'track':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($word, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else if ($word == 'off') {
-                               return new TrackOffCommand($user);
-                       } else {
-                               return new TrackCommand($user, $word);
-                       }
-                case 'untrack':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($word, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else if ($word == 'all') {
-                               return new TrackOffCommand($user);
-                       } else {
-                               return new UntrackCommand($user, $word);
-                       }
-                case 'tracks':
-                case 'tracking':
-                       if ($arg) {
-                               return NULL;
-                       }
-                       return new TrackingCommand($user);
-                default:
-                       return false;
-               }
-       }
+        # We try to support all the same commands as Twitter, see
+        # http://getsatisfaction.com/twitter/topics/what_are_the_twitter_commands
+        # There are a few compatibility commands from earlier versions of 
+        # Laconica
+        
+        switch(strtolower($cmd)) {
+         case 'help':
+            if ($arg) {
+                return NULL;
+            }
+            return new HelpCommand($user);
+         case 'on':
+            if ($arg) {
+                list($other, $extra) = explode(' ', $arg, 2);
+                if ($extra) {
+                    return NULL;
+                } else {
+                    return new OnCommand($user, $other);
+                }
+            } else {
+                return new OnCommand($user);
+            }
+         case 'off':
+            if ($arg) {
+                list($other, $extra) = explode(' ', $arg, 2);
+                if ($extra) {
+                    return NULL;
+                } else {
+                    return new OffCommand($user, $other);
+                }
+            } else {
+                return new OffCommand($user);
+            }
+         case 'stop':
+         case 'quit':
+            if ($arg) {
+                return NULL;
+            } else {
+                return new OffCommand($user);
+            }
+         case 'follow':
+         case 'sub':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else {
+                return new SubCommand($user, $other);
+            }
+         case 'leave':
+         case 'unsub':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else {
+                return new UnsubCommand($user, $other);
+            }
+         case 'get':
+         case 'last':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else {
+                return new GetCommand($user, $other);
+            }
+         case 'd':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if (!$extra) {
+                return NULL;
+            } else {
+                return new MessageCommand($user, $other, $extra);
+            }
+         case 'whois':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else {
+                return new WhoisCommand($user, $other);
+            }
+         case 'fav':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else {
+                return new FavCommand($user, $other);
+            }
+         case 'nudge':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else {
+                return new NudgeCommand($user, $other);
+            }
+         case 'stats':
+            if ($arg) {
+                return NULL;
+            }
+            return new StatsCommand($user);
+         case 'invite':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else {
+                return new InviteCommand($user, $other);
+            }
+         case 'track':
+            if (!$arg) {
+                return NULL;
+            }
+            list($word, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else if ($word == 'off') {
+                return new TrackOffCommand($user);
+            } else {
+                return new TrackCommand($user, $word);
+            }
+         case 'untrack':
+            if (!$arg) {
+                return NULL;
+            }
+            list($word, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else if ($word == 'all') {
+                return new TrackOffCommand($user);
+            } else {
+                return new UntrackCommand($user, $word);
+            }
+         case 'tracks':
+         case 'tracking':
+            if ($arg) {
+                return NULL;
+            }
+            return new TrackingCommand($user);
+         default:
+            return false;
+        }
+    }
 }
 
index 7cc3f585e70899ddaac787ef1cfbc5b5008223cb..b70a8a897c7014d45444babe7ec0565d86130355 100644 (file)
@@ -20,18 +20,18 @@ class Fave extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-       static function addNew($user, $notice) {
-               $fave = new Fave();
-               $fave->user_id = $user->id;
-               $fave->notice_id = $notice->id;
-               if (!$fave->insert()) {
-                       common_log_db_error($fave, 'INSERT', __FILE__);
-                       return false;
-               }
-               return $fave;
-       }
-       
-       function &pkeyGet($kv) {
-               return Memcached_DataObject::pkeyGet('Fave', $kv);
-       }
+    static function addNew($user, $notice) {
+        $fave = new Fave();
+        $fave->user_id = $user->id;
+        $fave->notice_id = $notice->id;
+        if (!$fave->insert()) {
+            common_log_db_error($fave, 'INSERT', __FILE__);
+            return false;
+        }
+        return $fave;
+    }
+    
+    function &pkeyGet($kv) {
+        return Memcached_DataObject::pkeyGet('Fave', $kv);
+    }
 }
index 7a625a209295039210b3b8f1a84405b97b05d002..7ce0df833685c4568fb8e0de897aa13b642bc127 100644 (file)
@@ -26,51 +26,51 @@ class Foreign_link extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-       // XXX:  This only returns a 1->1 single obj mapping.  Change?  Or make
-       // a getForeignUsers() that returns more than one? --Zach
-       static function getByUserID($user_id, $service) {
-               $flink = new Foreign_link();
-               $flink->service = $service;
-               $flink->user_id = $user_id;
-               $flink->limit(1);
+    // XXX:  This only returns a 1->1 single obj mapping.  Change?  Or make
+    // a getForeignUsers() that returns more than one? --Zach
+    static function getByUserID($user_id, $service) {
+        $flink = new Foreign_link();
+        $flink->service = $service;
+        $flink->user_id = $user_id;
+        $flink->limit(1);
 
-               if ($flink->find(TRUE)) {
-                       return $flink;
-               }
+        if ($flink->find(TRUE)) {
+            return $flink;
+        }
 
-               return NULL;            
-       }
-       
-       static function getByForeignID($foreign_id, $service) {
-               $flink = new Foreign_link();
-               $flink->service = $service;
-               $flink->foreign_id = $foreign_id;
-               $flink->limit(1);
+        return NULL;        
+    }
+    
+    static function getByForeignID($foreign_id, $service) {
+        $flink = new Foreign_link();
+        $flink->service = $service;
+        $flink->foreign_id = $foreign_id;
+        $flink->limit(1);
 
-               if ($flink->find(TRUE)) {
-                       return $flink;
-               }
+        if ($flink->find(TRUE)) {
+            return $flink;
+        }
 
-               return NULL;            
-       }
-               
-       # Convenience methods
-       function getForeignUser() {             
-               $fuser = new Foreign_user();
-               $fuser->service = $this->service;
-               $fuser->id = $this->foreign_id;
-               
-               $fuser->limit(1);
-               
-               if ($fuser->find(TRUE)) {
-                       return $fuser;
-               }
-               
-               return NULL;            
-       }
-       
-       function getUser() {
-               return User::staticGet($this->user_id);
-       }
-               
+        return NULL;        
+    }
+        
+    # Convenience methods
+    function getForeignUser() {        
+        $fuser = new Foreign_user();
+        $fuser->service = $this->service;
+        $fuser->id = $this->foreign_id;
+        
+        $fuser->limit(1);
+        
+        if ($fuser->find(TRUE)) {
+            return $fuser;
+        }
+        
+        return NULL;        
+    }
+    
+    function getUser() {
+        return User::staticGet($this->user_id);
+    }
+        
 }
index 027fae69d16e2839732468b2be6e6a28931700ef..396680128a71568e069457f10ecb63df26ab2fd8 100644 (file)
@@ -22,49 +22,49 @@ class Foreign_user extends Memcached_DataObject
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
-       
-       // XXX:  This only returns a 1->1 single obj mapping.  Change?  Or make
-       // a getForeignUsers() that returns more than one? --Zach
-       static function getForeignUser($id, $service) {         
-               $fuser = new Foreign_user();
-               $fuser->whereAdd("service = $service");
-               $fuser->whereAdd("id = $id");
-               $fuser->limit(1);
-               
-               if ($fuser->find()) {
-                       $fuser->fetch();
-                       return $fuser;
-               }
-               
-               return NULL;            
-       }
-       
-       function updateKeys(&$orig) {
-               $parts = array();
-               foreach (array('id', 'service', 'uri', 'nickname') as $k) {
-                       if (strcmp($this->$k, $orig->$k) != 0) {
-                               $parts[] = $k . ' = ' . $this->_quote($this->$k);
-                       }
-               }
-               if (count($parts) == 0) {
-                       # No changes
-                       return true;
-               }
-               $toupdate = implode(', ', $parts);
+    
+    // XXX:  This only returns a 1->1 single obj mapping.  Change?  Or make
+    // a getForeignUsers() that returns more than one? --Zach
+    static function getForeignUser($id, $service) {        
+        $fuser = new Foreign_user();
+        $fuser->whereAdd("service = $service");
+        $fuser->whereAdd("id = $id");
+        $fuser->limit(1);
+        
+        if ($fuser->find()) {
+            $fuser->fetch();
+            return $fuser;
+        }
+        
+        return NULL;        
+    }
+    
+    function updateKeys(&$orig) {
+        $parts = array();
+        foreach (array('id', 'service', 'uri', 'nickname') as $k) {
+            if (strcmp($this->$k, $orig->$k) != 0) {
+                $parts[] = $k . ' = ' . $this->_quote($this->$k);
+            }
+        }
+        if (count($parts) == 0) {
+            # No changes
+            return true;
+        }
+        $toupdate = implode(', ', $parts);
 
-               $table = $this->tableName();
-               if(common_config('db','quote_identifiers')) {
-                       $table = '"' . $table . '"';
-               }
-               $qry = 'UPDATE ' . $table . ' SET ' . $toupdate .
-                 ' WHERE id = ' . $this->id;
-               $orig->decache();
-               $result = $this->query($qry);
-               if ($result) {
-                       $this->encache();
-               }
-               return $result;
-       }
+        $table = $this->tableName();
+        if(common_config('db','quote_identifiers')) {
+            $table = '"' . $table . '"';
+        }
+        $qry = 'UPDATE ' . $table . ' SET ' . $toupdate .
+          ' WHERE id = ' . $this->id;
+        $orig->decache();
+        $result = $this->query($qry);
+        if ($result) {
+            $this->encache();
+        }
+        return $result;
+    }
 
-       
+    
 }
index 7a33e158dd1e2dffa9ee0f4300b11bf5704a7237..7699e1b38044d492f52e2f2ef14b6d10d91473d0 100644 (file)
@@ -24,151 +24,151 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
 class Memcached_DataObject extends DB_DataObject 
 {
     function &staticGet($cls, $k, $v=NULL) {
-               if (is_null($v)) {
-                       $v = $k;
-                       # XXX: HACK!
-                       $i = new $cls;
-                       $keys = $i->keys();
-                       $k = $keys[0];
-                       unset($i);
-               }
-               $i = Memcached_DataObject::getcached($cls, $k, $v);
-               if ($i) {
-                       return $i;
-               } else {
-                       $i = DB_DataObject::staticGet($cls, $k, $v);
-                       if ($i) {
-                               $i->encache();
-                       }
-                       return $i;
-               }
-       }
+        if (is_null($v)) {
+            $v = $k;
+            # XXX: HACK!
+            $i = new $cls;
+            $keys = $i->keys();
+            $k = $keys[0];
+            unset($i);
+        }
+        $i = Memcached_DataObject::getcached($cls, $k, $v);
+        if ($i) {
+            return $i;
+        } else {
+            $i = DB_DataObject::staticGet($cls, $k, $v);
+            if ($i) {
+                $i->encache();
+            }
+            return $i;
+        }
+    }
 
-       function &pkeyGet($cls, $kv) {
-               $i = Memcached_DataObject::multicache($cls, $kv);
-               if ($i) {
-                       return $i;
-               } else {
-                       $i = new $cls();
-                       foreach ($kv as $k => $v) {
-                               $i->$k = $v;
-                       }
-                       if ($i->find(true)) {
-                               $i->encache();
-                       } else {
-                               $i = NULL;
-                       }
+    function &pkeyGet($cls, $kv) {
+        $i = Memcached_DataObject::multicache($cls, $kv);
+        if ($i) {
+            return $i;
+        } else {
+            $i = new $cls();
+            foreach ($kv as $k => $v) {
+                $i->$k = $v;
+            }
+            if ($i->find(true)) {
+                $i->encache();
+            } else {
+                $i = NULL;
+            }
             return $i;
-               }
-       }
+        }
+    }
 
-       function insert() {
-               $result = parent::insert();
-               return $result;
-       }
-       
-       function update($orig=NULL) {
-               if (is_object($orig) && $orig instanceof Memcached_DataObject) {
-                       $orig->decache(); # might be different keys
-               }
-               $result = parent::update($orig);
-               if ($result) {
-                       $this->encache();
-               }
-               return $result;
-       }
-       
-       function delete() {
-               $this->decache(); # while we still have the values!
-               return parent::delete();
-       }
-       
-       static function memcache() {
-               return common_memcache();
-       }
-       
-       static function cacheKey($cls, $k, $v) {
-               return common_cache_key(strtolower($cls).':'.$k.':'.$v);
-       }
-       
-       static function getcached($cls, $k, $v) {
-               $c = Memcached_DataObject::memcache();
-               if (!$c) {
-                       return false;
-               } else {
-                       return $c->get(Memcached_DataObject::cacheKey($cls, $k, $v));
-               }
-       }
+    function insert() {
+        $result = parent::insert();
+        return $result;
+    }
+    
+    function update($orig=NULL) {
+        if (is_object($orig) && $orig instanceof Memcached_DataObject) {
+            $orig->decache(); # might be different keys
+        }
+        $result = parent::update($orig);
+        if ($result) {
+            $this->encache();
+        }
+        return $result;
+    }
+    
+    function delete() {
+        $this->decache(); # while we still have the values!
+        return parent::delete();
+    }
+    
+    static function memcache() {
+        return common_memcache();
+    }
+    
+    static function cacheKey($cls, $k, $v) {
+        return common_cache_key(strtolower($cls).':'.$k.':'.$v);
+    }
+    
+    static function getcached($cls, $k, $v) {
+        $c = Memcached_DataObject::memcache();
+        if (!$c) {
+            return false;
+        } else {
+            return $c->get(Memcached_DataObject::cacheKey($cls, $k, $v));
+        }
+    }
 
-       function keyTypes() {
-               global $_DB_DATAOBJECT;
+    function keyTypes() {
+        global $_DB_DATAOBJECT;
         if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"])) {
-                       $this->databaseStructure();
+            $this->databaseStructure();
 
         }
-               return $_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"];
-       }
-       
-       function encache() {
-               $c = $this->memcache();
-               if (!$c) {
-                       return false;
-               } else {
-                       $pkey = array();
-                       $pval = array();                        
-                       $types = $this->keyTypes();
-                       ksort($types);
-                       foreach ($types as $key => $type) {
-                               if ($type == 'K') {
-                                       $pkey[] = $key;
-                                       $pval[] = $this->$key;
-                               } else {
-                                       $c->set($this->cacheKey($this->tableName(), $key, $this->$key), $this);
-                               }
-                       }
-                       # XXX: should work for both compound and scalar pkeys
-                       $pvals = implode(',', $pval);
-                       $pkeys = implode(',', $pkey);
-                       $c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this);
-               }
-       }
-       
-       function decache() {
-               $c = $this->memcache();
-               if (!$c) {
-                       return false;
-               } else {
-                       $pkey = array();
-                       $pval = array();                        
-                       $types = $this->keyTypes();
-                       ksort($types);
-                       foreach ($types as $key => $type) {
-                               if ($type == 'K') {
-                                       $pkey[] = $key;
-                                       $pval[] = $this->$key;
-                               } else {
-                                       $c->delete($this->cacheKey($this->tableName(), $key, $this->$key));
-                               }
-                       }
-                       # should work for both compound and scalar pkeys
-                       # XXX: comma works for now but may not be safe separator for future keys
-                       $pvals = implode(',', $pval);
-                       $pkeys = implode(',', $pkey);
-                       $c->delete($this->cacheKey($this->tableName(), $pkeys, $pvals));
-               }
-       }
+        return $_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"];
+    }
+    
+    function encache() {
+        $c = $this->memcache();
+        if (!$c) {
+            return false;
+        } else {
+            $pkey = array();
+            $pval = array();            
+            $types = $this->keyTypes();
+            ksort($types);
+            foreach ($types as $key => $type) {
+                if ($type == 'K') {
+                    $pkey[] = $key;
+                    $pval[] = $this->$key;
+                } else {
+                    $c->set($this->cacheKey($this->tableName(), $key, $this->$key), $this);
+                }
+            }
+            # XXX: should work for both compound and scalar pkeys
+            $pvals = implode(',', $pval);
+            $pkeys = implode(',', $pkey);
+            $c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this);
+        }
+    }
+    
+    function decache() {
+        $c = $this->memcache();
+        if (!$c) {
+            return false;
+        } else {
+            $pkey = array();
+            $pval = array();            
+            $types = $this->keyTypes();
+            ksort($types);
+            foreach ($types as $key => $type) {
+                if ($type == 'K') {
+                    $pkey[] = $key;
+                    $pval[] = $this->$key;
+                } else {
+                    $c->delete($this->cacheKey($this->tableName(), $key, $this->$key));
+                }
+            }
+            # should work for both compound and scalar pkeys
+            # XXX: comma works for now but may not be safe separator for future keys
+            $pvals = implode(',', $pval);
+            $pkeys = implode(',', $pkey);
+            $c->delete($this->cacheKey($this->tableName(), $pkeys, $pvals));
+        }
+    }
 
-       function multicache($cls, $kv) {
-               ksort($kv);
-               $c = Memcached_DataObject::memcache();
-               if (!$c) {
-                       return false;
-               } else {
-                       $pkeys = implode(',', array_keys($kv));
-                       $pvals = implode(',', array_values($kv));
-                       return $c->get(Memcached_DataObject::cacheKey($cls, $pkeys, $pvals));
-               }
-       }
+    function multicache($cls, $kv) {
+        ksort($kv);
+        $c = Memcached_DataObject::memcache();
+        if (!$c) {
+            return false;
+        } else {
+            $pkeys = implode(',', array_keys($kv));
+            $pvals = implode(',', array_values($kv));
+            return $c->get(Memcached_DataObject::cacheKey($cls, $pkeys, $pvals));
+        }
+    }
 
     function getSearchEngine($table) {
         require_once INSTALLDIR.'/lib/search_engines.php';
index ef4bd03161cf2978c866acd4ed45f4af8043fb4c..dc527fcb13774ebb0c52cd60844499ea728c5711 100644 (file)
@@ -26,43 +26,43 @@ class Message extends Memcached_DataObject
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
-       
-       function getFrom() {
-               return Profile::staticGet('id', $this->from_profile);
-       }
-       
-       function getTo() {
-               return Profile::staticGet('id', $this->to_profile);
-       }
-       
-       static function saveNew($from, $to, $content, $source) {
-               
-               $msg = new Message();
-               
-               $msg->from_profile = $from;
-               $msg->to_profile = $to;
-               $msg->content = common_shorten_links($content);
-               $msg->rendered = common_render_text($content);
-               $msg->created = common_sql_now();
-               $msg->source = $source;
-               
-               $result = $msg->insert();
-               
-               if (!$result) {
-                       common_log_db_error($msg, 'INSERT', __FILE__);
-                       return _('Could not insert message.');
-               }
-               
-               $orig = clone($msg);
-               $msg->uri = common_local_url('showmessage', array('message' => $msg->id));
-               
-               $result = $msg->update($orig);
-               
-               if (!$result) {
-                       common_log_db_error($msg, 'UPDATE', __FILE__);
-                       return _('Could not update message with new URI.');
-               }
-               
-               return $msg;
-       }
+    
+    function getFrom() {
+        return Profile::staticGet('id', $this->from_profile);
+    }
+    
+    function getTo() {
+        return Profile::staticGet('id', $this->to_profile);
+    }
+    
+    static function saveNew($from, $to, $content, $source) {
+        
+        $msg = new Message();
+        
+        $msg->from_profile = $from;
+        $msg->to_profile = $to;
+        $msg->content = common_shorten_links($content);
+        $msg->rendered = common_render_text($content);
+        $msg->created = common_sql_now();
+        $msg->source = $source;
+        
+        $result = $msg->insert();
+        
+        if (!$result) {
+            common_log_db_error($msg, 'INSERT', __FILE__);
+            return _('Could not insert message.');
+        }
+        
+        $orig = clone($msg);
+        $msg->uri = common_local_url('showmessage', array('message' => $msg->id));
+        
+        $result = $msg->update($orig);
+        
+        if (!$result) {
+            common_log_db_error($msg, 'UPDATE', __FILE__);
+            return _('Could not update message with new URI.');
+        }
+        
+        return $msg;
+    }
 }
index ca8283bcef35221d2a952dd6d284d565d43ca804..35e03e342d81c6b8c1aae0a948c6a77882f5d3fd 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -31,69 +31,69 @@ define('NOTICE_CACHE_WINDOW', 61);
 
 class Notice extends Memcached_DataObject
 {
-       ###START_AUTOCODE
-       /* the code below is auto generated do not remove the above tag */
-
-       public $__table = 'notice';                                                      // table name
-       public $id;                                                              // int(4)      primary_key not_null
-       public $profile_id;                                              // int(4)       not_null
-       public $uri;                                                     // varchar(255)  unique_key
-       public $content;                                                 // varchar(140)
-       public $rendered;                                                // text()
-       public $url;                                                     // varchar(255)
-       public $created;                                                 // datetime()   not_null
-       public $modified;                                                // timestamp()   not_null default_CURRENT_TIMESTAMP
-       public $reply_to;                                                // int(4)
-       public $is_local;                                                // tinyint(1)
-       public $source;                                                  // varchar(32)
-
-       /* Static get */
-       function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Notice',$k,$v); }
-
-       /* the code above is auto generated do not remove the tag below */
-       ###END_AUTOCODE
-
-       function getProfile() {
-               return Profile::staticGet('id', $this->profile_id);
-       }
-
-       function delete() {
-               $this->blowCaches(true);
-               $this->blowFavesCache(true);
-               $this->blowInboxes();
-               return parent::delete();
-       }
-
-       function saveTags() {
-               /* extract all #hastags */
-               $count = preg_match_all('/(?:^|\s)#([A-Za-z0-9_\-\.]{1,64})/', strtolower($this->content), $match);
-               if (!$count) {
-                       return true;
-               }
-
-               /* elide characters we don't want in the tag */
-               $match[1] = str_replace(array('-', '_', '.'), '', $match[1]);
-
-               /* Add them to the database */
-               foreach(array_unique($match[1]) as $hashtag) {
-                       $tag = DB_DataObject::factory('Notice_tag');
-                       $tag->notice_id = $this->id;
-                       $tag->tag = $hashtag;
-                       $tag->created = $this->created;
-                       $id = $tag->insert();
-                       if (!$id) {
-                               $last_error = PEAR::getStaticProperty('DB_DataObject','lastError');
-                               common_log(LOG_ERR, 'DB error inserting hashtag: ' . $last_error->message);
-                               common_server_error(sprintf(_('DB error inserting hashtag: %s'), $last_error->message));
-                               return;
-                       }
-               }
-               return true;
-       }
-
-       static function saveNew($profile_id, $content, $source=NULL, $is_local=1, $reply_to=NULL, $uri=NULL) {
-
-               $profile = Profile::staticGet($profile_id);
+    ###START_AUTOCODE
+    /* the code below is auto generated do not remove the above tag */
+
+    public $__table = 'notice';                             // table name
+    public $id;                                 // int(4)    primary_key not_null
+    public $profile_id;                         // int(4)     not_null
+    public $uri;                             // varchar(255)  unique_key
+    public $content;                         // varchar(140)
+    public $rendered;                         // text()
+    public $url;                             // varchar(255)
+    public $created;                         // datetime()     not_null
+    public $modified;                         // timestamp()      not_null default_CURRENT_TIMESTAMP
+    public $reply_to;                         // int(4)
+    public $is_local;                         // tinyint(1)
+    public $source;                             // varchar(32)
+
+    /* Static get */
+    function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Notice',$k,$v); }
+
+    /* the code above is auto generated do not remove the tag below */
+    ###END_AUTOCODE
+
+    function getProfile() {
+        return Profile::staticGet('id', $this->profile_id);
+    }
+
+    function delete() {
+        $this->blowCaches(true);
+        $this->blowFavesCache(true);
+        $this->blowInboxes();
+        return parent::delete();
+    }
+
+    function saveTags() {
+        /* extract all #hastags */
+        $count = preg_match_all('/(?:^|\s)#([A-Za-z0-9_\-\.]{1,64})/', strtolower($this->content), $match);
+        if (!$count) {
+            return true;
+        }
+
+        /* elide characters we don't want in the tag */
+        $match[1] = str_replace(array('-', '_', '.'), '', $match[1]);
+
+        /* Add them to the database */
+        foreach(array_unique($match[1]) as $hashtag) {
+            $tag = DB_DataObject::factory('Notice_tag');
+            $tag->notice_id = $this->id;
+            $tag->tag = $hashtag;
+            $tag->created = $this->created;
+            $id = $tag->insert();
+            if (!$id) {
+                $last_error = PEAR::getStaticProperty('DB_DataObject','lastError');
+                common_log(LOG_ERR, 'DB error inserting hashtag: ' . $last_error->message);
+                common_server_error(sprintf(_('DB error inserting hashtag: %s'), $last_error->message));
+                return;
+            }
+        }
+        return true;
+    }
+
+    static function saveNew($profile_id, $content, $source=NULL, $is_local=1, $reply_to=NULL, $uri=NULL) {
+
+        $profile = Profile::staticGet($profile_id);
 
         if (!$profile) {
             common_log(LOG_ERR, 'Problem saving notice. Unknown user.');
@@ -102,69 +102,69 @@ class Notice extends Memcached_DataObject
 
         if (common_config('throttle', 'enabled') && !Notice::checkEditThrottle($profile_id)) {
             common_log(LOG_WARNING, 'Excessive posting by profile #' . $profile_id . '; throttled.');
-                       return _('Too many notices too fast; take a breather and post again in a few minutes.');
+            return _('Too many notices too fast; take a breather and post again in a few minutes.');
         }
 
-               $banned = common_config('profile', 'banned');
+        $banned = common_config('profile', 'banned');
 
-               if ( in_array($profile_id, $banned) || in_array($profile->nickname, $banned)) {
-                       common_log(LOG_WARNING, "Attempted post from banned user: $profile->nickname (user id = $profile_id).");
+        if ( in_array($profile_id, $banned) || in_array($profile->nickname, $banned)) {
+            common_log(LOG_WARNING, "Attempted post from banned user: $profile->nickname (user id = $profile_id).");
             return _('You are banned from posting notices on this site.');
-               }
+        }
 
-               $notice = new Notice();
-               $notice->profile_id = $profile_id;
+        $notice = new Notice();
+        $notice->profile_id = $profile_id;
 
-               $blacklist = common_config('public', 'blacklist');
+        $blacklist = common_config('public', 'blacklist');
 
-               # Blacklisted are non-false, but not 1, either
+        # Blacklisted are non-false, but not 1, either
 
-               if ($blacklist && in_array($profile_id, $blacklist)) {
-                       $notice->is_local = -1;
-               } else {
-                       $notice->is_local = $is_local;
-               }
+        if ($blacklist && in_array($profile_id, $blacklist)) {
+            $notice->is_local = -1;
+        } else {
+            $notice->is_local = $is_local;
+        }
 
-               $notice->reply_to = $reply_to;
-               $notice->created = common_sql_now();
-               $notice->content = common_shorten_links($content);
-               $notice->rendered = common_render_content($notice->content, $notice);
-               $notice->source = $source;
-               $notice->uri = $uri;
+        $notice->reply_to = $reply_to;
+        $notice->created = common_sql_now();
+        $notice->content = common_shorten_links($content);
+        $notice->rendered = common_render_content($notice->content, $notice);
+        $notice->source = $source;
+        $notice->uri = $uri;
 
-               $id = $notice->insert();
+        $id = $notice->insert();
 
-               if (!$id) {
-                       common_log_db_error($notice, 'INSERT', __FILE__);
-                       return _('Problem saving notice.');
-               }
+        if (!$id) {
+            common_log_db_error($notice, 'INSERT', __FILE__);
+            return _('Problem saving notice.');
+        }
 
-               # Update the URI after the notice is in the database
-               if (!$uri) {
-                       $orig = clone($notice);
-                       $notice->uri = common_notice_uri($notice);
+        # Update the URI after the notice is in the database
+        if (!$uri) {
+            $orig = clone($notice);
+            $notice->uri = common_notice_uri($notice);
 
-                       if (!$notice->update($orig)) {
-                               common_log_db_error($notice, 'UPDATE', __FILE__);
-                               return _('Problem saving notice.');
-                       }
-               }
+            if (!$notice->update($orig)) {
+                common_log_db_error($notice, 'UPDATE', __FILE__);
+                return _('Problem saving notice.');
+            }
+        }
 
-               # XXX: do we need to change this for remote users?
+        # XXX: do we need to change this for remote users?
 
-               common_save_replies($notice);
-               $notice->saveTags();
+        common_save_replies($notice);
+        $notice->saveTags();
 
-               # Clear the cache for subscribed users, so they'll update at next request
-               # XXX: someone clever could prepend instead of clearing the cache
+        # Clear the cache for subscribed users, so they'll update at next request
+        # XXX: someone clever could prepend instead of clearing the cache
 
-               if (common_config('memcached', 'enabled')) {
-                       $notice->blowCaches();
-               }
+        if (common_config('memcached', 'enabled')) {
+            $notice->blowCaches();
+        }
 
-               $notice->addToInboxes();
-               return $notice;
-       }
+        $notice->addToInboxes();
+        return $notice;
+    }
 
     static function checkEditThrottle($profile_id) {
         $profile = Profile::staticGet($profile_id);
@@ -184,356 +184,356 @@ class Notice extends Memcached_DataObject
         return true;
     }
 
-       function blowCaches($blowLast=false) {
-               $this->blowSubsCache($blowLast);
-               $this->blowNoticeCache($blowLast);
-               $this->blowRepliesCache($blowLast);
-               $this->blowPublicCache($blowLast);
-               $this->blowTagCache($blowLast);
-       }
-
-       function blowTagCache($blowLast=false) {
-               $cache = common_memcache();
-               if ($cache) {
-                       $tag = new Notice_tag();
-                       $tag->notice_id = $this->id;
-                       if ($tag->find()) {
-                               while ($tag->fetch()) {
-                                       $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag));
-                                       if ($blowLast) {
-                                               $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag . ';last'));
-                                       }
-                               }
-                       }
-                       $tag->free();
-                       unset($tag);
-               }
-       }
-
-       function blowSubsCache($blowLast=false) {
-               $cache = common_memcache();
-               if ($cache) {
-                       $user = new User();
-
-                       $user->query('SELECT id ' .
-                                                'FROM user JOIN subscription ON user.id = subscription.subscriber ' .
-                                                'WHERE subscription.subscribed = ' . $this->profile_id);
-
-                       while ($user->fetch()) {
-                               $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
-                               if ($blowLast) {
-                                       $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id . ';last'));
-                               }
-                       }
-                       $user->free();
-                       unset($user);
-               }
-       }
-
-       function blowNoticeCache($blowLast=false) {
-               if ($this->is_local) {
-                       $cache = common_memcache();
-                       if ($cache) {
-                               $cache->delete(common_cache_key('profile:notices:'.$this->profile_id));
-                               if ($blowLast) {
-                                       $cache->delete(common_cache_key('profile:notices:'.$this->profile_id.';last'));
-                               }
-                       }
-               }
-       }
-
-       function blowRepliesCache($blowLast=false) {
-               $cache = common_memcache();
-               if ($cache) {
-                       $reply = new Reply();
-                       $reply->notice_id = $this->id;
-                       if ($reply->find()) {
-                               while ($reply->fetch()) {
-                                       $cache->delete(common_cache_key('user:replies:'.$reply->profile_id));
-                                       if ($blowLast) {
-                                               $cache->delete(common_cache_key('user:replies:'.$reply->profile_id.';last'));
-                                       }
-                               }
-                       }
-                       $reply->free();
-                       unset($reply);
-               }
-       }
-
-       function blowPublicCache($blowLast=false) {
-               if ($this->is_local == 1) {
-                       $cache = common_memcache();
-                       if ($cache) {
-                               $cache->delete(common_cache_key('public'));
-                               if ($blowLast) {
-                                       $cache->delete(common_cache_key('public').';last');
-                               }
-                       }
-               }
-       }
-
-       function blowFavesCache($blowLast=false) {
-               $cache = common_memcache();
-               if ($cache) {
-                       $fave = new Fave();
-                       $fave->notice_id = $this->id;
-                       if ($fave->find()) {
-                               while ($fave->fetch()) {
-                                       $cache->delete(common_cache_key('user:faves:'.$fave->user_id));
-                                       if ($blowLast) {
-                                               $cache->delete(common_cache_key('user:faves:'.$fave->user_id.';last'));
-                                       }
-                               }
-                       }
-                       $fave->free();
-                       unset($fave);
-               }
-       }
-
-       # XXX: too many args; we need to move to named params or even a separate
-       # class for notice streams
-
-       static function getStream($qry, $cachekey, $offset=0, $limit=20, $since_id=0, $before_id=0, $order=NULL, $since=NULL) {
-
-               if (common_config('memcached', 'enabled')) {
-
-                       # Skip the cache if this is a since, since_id or before_id qry
-                       if ($since_id > 0 || $before_id > 0 || $since) {
-                               return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
-                       } else {
-                               return Notice::getCachedStream($qry, $cachekey, $offset, $limit, $order);
-                       }
-               }
-
-               return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
-       }
-
-       static function getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since) {
-
-               $needAnd = FALSE;
-               $needWhere = TRUE;
-
-               if (preg_match('/\bWHERE\b/i', $qry)) {
-                       $needWhere = FALSE;
-                       $needAnd = TRUE;
-               }
-
-               if ($since_id > 0) {
-
-                       if ($needWhere) {
-                               $qry .= ' WHERE ';
-                               $needWhere = FALSE;
-                       } else {
-                               $qry .= ' AND ';
-                       }
-
-                       $qry .= ' notice.id > ' . $since_id;
-               }
-
-               if ($before_id > 0) {
-
-                       if ($needWhere) {
-                               $qry .= ' WHERE ';
-                               $needWhere = FALSE;
-                       } else {
-                               $qry .= ' AND ';
-                       }
-
-                       $qry .= ' notice.id < ' . $before_id;
-               }
+    function blowCaches($blowLast=false) {
+        $this->blowSubsCache($blowLast);
+        $this->blowNoticeCache($blowLast);
+        $this->blowRepliesCache($blowLast);
+        $this->blowPublicCache($blowLast);
+        $this->blowTagCache($blowLast);
+    }
+
+    function blowTagCache($blowLast=false) {
+        $cache = common_memcache();
+        if ($cache) {
+            $tag = new Notice_tag();
+            $tag->notice_id = $this->id;
+            if ($tag->find()) {
+                while ($tag->fetch()) {
+                    $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag));
+                    if ($blowLast) {
+                        $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag . ';last'));
+                    }
+                }
+            }
+            $tag->free();
+            unset($tag);
+        }
+    }
+
+    function blowSubsCache($blowLast=false) {
+        $cache = common_memcache();
+        if ($cache) {
+            $user = new User();
+
+            $user->query('SELECT id ' .
+                         'FROM user JOIN subscription ON user.id = subscription.subscriber ' .
+                         'WHERE subscription.subscribed = ' . $this->profile_id);
+
+            while ($user->fetch()) {
+                $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+                if ($blowLast) {
+                    $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id . ';last'));
+                }
+            }
+            $user->free();
+            unset($user);
+        }
+    }
+
+    function blowNoticeCache($blowLast=false) {
+        if ($this->is_local) {
+            $cache = common_memcache();
+            if ($cache) {
+                $cache->delete(common_cache_key('profile:notices:'.$this->profile_id));
+                if ($blowLast) {
+                    $cache->delete(common_cache_key('profile:notices:'.$this->profile_id.';last'));
+                }
+            }
+        }
+    }
+
+    function blowRepliesCache($blowLast=false) {
+        $cache = common_memcache();
+        if ($cache) {
+            $reply = new Reply();
+            $reply->notice_id = $this->id;
+            if ($reply->find()) {
+                while ($reply->fetch()) {
+                    $cache->delete(common_cache_key('user:replies:'.$reply->profile_id));
+                    if ($blowLast) {
+                        $cache->delete(common_cache_key('user:replies:'.$reply->profile_id.';last'));
+                    }
+                }
+            }
+            $reply->free();
+            unset($reply);
+        }
+    }
+
+    function blowPublicCache($blowLast=false) {
+        if ($this->is_local == 1) {
+            $cache = common_memcache();
+            if ($cache) {
+                $cache->delete(common_cache_key('public'));
+                if ($blowLast) {
+                    $cache->delete(common_cache_key('public').';last');
+                }
+            }
+        }
+    }
+
+    function blowFavesCache($blowLast=false) {
+        $cache = common_memcache();
+        if ($cache) {
+            $fave = new Fave();
+            $fave->notice_id = $this->id;
+            if ($fave->find()) {
+                while ($fave->fetch()) {
+                    $cache->delete(common_cache_key('user:faves:'.$fave->user_id));
+                    if ($blowLast) {
+                        $cache->delete(common_cache_key('user:faves:'.$fave->user_id.';last'));
+                    }
+                }
+            }
+            $fave->free();
+            unset($fave);
+        }
+    }
+
+    # XXX: too many args; we need to move to named params or even a separate
+    # class for notice streams
 
-               if ($since) {
-
-                       if ($needWhere) {
-                               $qry .= ' WHERE ';
-                               $needWhere = FALSE;
-                       } else {
-                               $qry .= ' AND ';
-                       }
+    static function getStream($qry, $cachekey, $offset=0, $limit=20, $since_id=0, $before_id=0, $order=NULL, $since=NULL) {
 
-                       $qry .= ' notice.created > \'' . date('Y-m-d H:i:s', $since) . '\'';
-               }
+        if (common_config('memcached', 'enabled')) {
 
-               # Allow ORDER override
+            # Skip the cache if this is a since, since_id or before_id qry
+            if ($since_id > 0 || $before_id > 0 || $since) {
+                return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
+            } else {
+                return Notice::getCachedStream($qry, $cachekey, $offset, $limit, $order);
+            }
+        }
 
-               if ($order) {
-                       $qry .= $order;
-               } else {
-                       $qry .= ' ORDER BY notice.created DESC, notice.id DESC ';
-               }
+        return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
+    }
 
-               if (common_config('db','type') == 'pgsql') {
-                       $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
-               } else {
-                       $qry .= ' LIMIT ' . $offset . ', ' . $limit;
-               }
+    static function getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since) {
 
-               $notice = new Notice();
+        $needAnd = FALSE;
+        $needWhere = TRUE;
 
-               $notice->query($qry);
+        if (preg_match('/\bWHERE\b/i', $qry)) {
+            $needWhere = FALSE;
+            $needAnd = TRUE;
+        }
 
-               return $notice;
-       }
+        if ($since_id > 0) {
 
-       # XXX: this is pretty long and should probably be broken up into
-       # some helper functions
+            if ($needWhere) {
+                $qry .= ' WHERE ';
+                $needWhere = FALSE;
+            } else {
+                $qry .= ' AND ';
+            }
 
-       static function getCachedStream($qry, $cachekey, $offset, $limit, $order) {
+            $qry .= ' notice.id > ' . $since_id;
+        }
 
-               # If outside our cache window, just go to the DB
+        if ($before_id > 0) {
 
-               if ($offset + $limit > NOTICE_CACHE_WINDOW) {
-                       return Notice::getStreamDirect($qry, $offset, $limit, NULL, NULL, $order, NULL);
-               }
+            if ($needWhere) {
+                $qry .= ' WHERE ';
+                $needWhere = FALSE;
+            } else {
+                $qry .= ' AND ';
+            }
 
-               # Get the cache; if we can't, just go to the DB
+            $qry .= ' notice.id < ' . $before_id;
+        }
 
-               $cache = common_memcache();
+        if ($since) {
 
-               if (!$cache) {
-                       return Notice::getStreamDirect($qry, $offset, $limit, NULL, NULL, $order, NULL);
-               }
+            if ($needWhere) {
+                $qry .= ' WHERE ';
+                $needWhere = FALSE;
+            } else {
+                $qry .= ' AND ';
+            }
 
-               # Get the notices out of the cache
+            $qry .= ' notice.created > \'' . date('Y-m-d H:i:s', $since) . '\'';
+        }
 
-               $notices = $cache->get(common_cache_key($cachekey));
+        # Allow ORDER override
 
-               # On a cache hit, return a DB-object-like wrapper
+        if ($order) {
+            $qry .= $order;
+        } else {
+            $qry .= ' ORDER BY notice.created DESC, notice.id DESC ';
+        }
 
-               if ($notices !== FALSE) {
-                       $wrapper = new NoticeWrapper(array_slice($notices, $offset, $limit));
-                       return $wrapper;
-               }
+        if (common_config('db','type') == 'pgsql') {
+            $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+        } else {
+            $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+        }
 
-               # If the cache was invalidated because of new data being
-               # added, we can try and just get the new stuff. We keep an additional
-               # copy of the data at the key + ';last'
+        $notice = new Notice();
 
-               # No cache hit. Try to get the *last* cached version
+        $notice->query($qry);
 
-               $last_notices = $cache->get(common_cache_key($cachekey) . ';last');
+        return $notice;
+    }
 
-               if ($last_notices) {
+    # XXX: this is pretty long and should probably be broken up into
+    # some helper functions
 
-                       # Reverse-chron order, so last ID is last.
+    static function getCachedStream($qry, $cachekey, $offset, $limit, $order) {
 
-                       $last_id = $last_notices[0]->id;
+        # If outside our cache window, just go to the DB
 
-                       # XXX: this assumes monotonically increasing IDs; a fair
-                       # bet with our DB.
+        if ($offset + $limit > NOTICE_CACHE_WINDOW) {
+            return Notice::getStreamDirect($qry, $offset, $limit, NULL, NULL, $order, NULL);
+        }
 
-                       $new_notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW,
-                                                                                                 $last_id, NULL, $order, NULL);
+        # Get the cache; if we can't, just go to the DB
 
-                       if ($new_notice) {
-                               $new_notices = array();
-                               while ($new_notice->fetch()) {
-                                       $new_notices[] = clone($new_notice);
-                               }
-                               $new_notice->free();
-                               $notices = array_slice(array_merge($new_notices, $last_notices),
-                                                                          0, NOTICE_CACHE_WINDOW);
+        $cache = common_memcache();
 
-                               # Store the array in the cache for next time
+        if (!$cache) {
+            return Notice::getStreamDirect($qry, $offset, $limit, NULL, NULL, $order, NULL);
+        }
 
-                               $result = $cache->set(common_cache_key($cachekey), $notices);
-                               $result = $cache->set(common_cache_key($cachekey) . ';last', $notices);
+        # Get the notices out of the cache
 
-                               # return a wrapper of the array for use now
+        $notices = $cache->get(common_cache_key($cachekey));
 
-                               return new NoticeWrapper(array_slice($notices, $offset, $limit));
-                       }
-               }
+        # On a cache hit, return a DB-object-like wrapper
 
-               # Otherwise, get the full cache window out of the DB
+        if ($notices !== FALSE) {
+            $wrapper = new NoticeWrapper(array_slice($notices, $offset, $limit));
+            return $wrapper;
+        }
 
-               $notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW, NULL, NULL, $order, NULL);
+        # If the cache was invalidated because of new data being
+        # added, we can try and just get the new stuff. We keep an additional
+        # copy of the data at the key + ';last'
 
-               # If there are no hits, just return the value
+        # No cache hit. Try to get the *last* cached version
 
-               if (!$notice) {
-                       return $notice;
-               }
+        $last_notices = $cache->get(common_cache_key($cachekey) . ';last');
 
-               # Pack results into an array
+        if ($last_notices) {
 
-               $notices = array();
+            # Reverse-chron order, so last ID is last.
 
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
+            $last_id = $last_notices[0]->id;
 
-               $notice->free();
+            # XXX: this assumes monotonically increasing IDs; a fair
+            # bet with our DB.
 
-               # Store the array in the cache for next time
+            $new_notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW,
+                                                  $last_id, NULL, $order, NULL);
 
-               $result = $cache->set(common_cache_key($cachekey), $notices);
-               $result = $cache->set(common_cache_key($cachekey) . ';last', $notices);
+            if ($new_notice) {
+                $new_notices = array();
+                while ($new_notice->fetch()) {
+                    $new_notices[] = clone($new_notice);
+                }
+                $new_notice->free();
+                $notices = array_slice(array_merge($new_notices, $last_notices),
+                                       0, NOTICE_CACHE_WINDOW);
 
-               # return a wrapper of the array for use now
+                # Store the array in the cache for next time
 
-               $wrapper = new NoticeWrapper(array_slice($notices, $offset, $limit));
+                $result = $cache->set(common_cache_key($cachekey), $notices);
+                $result = $cache->set(common_cache_key($cachekey) . ';last', $notices);
 
-               return $wrapper;
-       }
+                # return a wrapper of the array for use now
 
-       function publicStream($offset=0, $limit=20, $since_id=0, $before_id=0, $since=NULL) {
+                return new NoticeWrapper(array_slice($notices, $offset, $limit));
+            }
+        }
 
-               $parts = array();
+        # Otherwise, get the full cache window out of the DB
 
-               $qry = 'SELECT * FROM notice ';
+        $notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW, NULL, NULL, $order, NULL);
 
-               if (common_config('public', 'localonly')) {
-                       $parts[] = 'is_local = 1';
-               } else {
-                       # -1 == blacklisted
-                       $parts[] = 'is_local != -1';
-               }
+        # If there are no hits, just return the value
 
-               if ($parts) {
-                       $qry .= ' WHERE ' . implode(' AND ', $parts);
-               }
+        if (!$notice) {
+            return $notice;
+        }
 
-               return Notice::getStream($qry,
-                                                                'public',
-                                                                $offset, $limit, $since_id, $before_id, NULL, $since);
-       }
+        # Pack results into an array
 
-       function addToInboxes() {
-               $enabled = common_config('inboxes', 'enabled');
+        $notices = array();
 
-               if ($enabled === true || $enabled === 'transitional') {
-                       $inbox = new Notice_inbox();
-                       $qry = 'INSERT INTO notice_inbox (user_id, notice_id, created) ' .
-                         'SELECT user.id, ' . $this->id . ', "' . $this->created . '" ' .
-                         'FROM user JOIN subscription ON user.id = subscription.subscriber ' .
-                         'WHERE subscription.subscribed = ' . $this->profile_id . ' ' .
-                         'AND NOT EXISTS (SELECT user_id, notice_id ' .
-                         'FROM notice_inbox ' .
-                         'WHERE user_id = user.id ' .
-                         'AND notice_id = ' . $this->id . ' )';
-                       if ($enabled === 'transitional') {
-                               $qry .= ' AND user.inboxed = 1';
-                       }
-                       $inbox->query($qry);
-               }
-               return;
-       }
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
 
-       # Delete from inboxes if we're deleted.
+        $notice->free();
 
-       function blowInboxes() {
+        # Store the array in the cache for next time
 
-               $enabled = common_config('inboxes', 'enabled');
+        $result = $cache->set(common_cache_key($cachekey), $notices);
+        $result = $cache->set(common_cache_key($cachekey) . ';last', $notices);
 
-               if ($enabled === true || $enabled === 'transitional') {
-                       $inbox = new Notice_inbox();
-                       $inbox->notice_id = $this->id;
-                       $inbox->delete();
-               }
+        # return a wrapper of the array for use now
 
-               return;
-       }
+        $wrapper = new NoticeWrapper(array_slice($notices, $offset, $limit));
+
+        return $wrapper;
+    }
+
+    function publicStream($offset=0, $limit=20, $since_id=0, $before_id=0, $since=NULL) {
+
+        $parts = array();
+
+        $qry = 'SELECT * FROM notice ';
+
+        if (common_config('public', 'localonly')) {
+            $parts[] = 'is_local = 1';
+        } else {
+            # -1 == blacklisted
+            $parts[] = 'is_local != -1';
+        }
+
+        if ($parts) {
+            $qry .= ' WHERE ' . implode(' AND ', $parts);
+        }
+
+        return Notice::getStream($qry,
+                                 'public',
+                                 $offset, $limit, $since_id, $before_id, NULL, $since);
+    }
+
+    function addToInboxes() {
+        $enabled = common_config('inboxes', 'enabled');
+
+        if ($enabled === true || $enabled === 'transitional') {
+            $inbox = new Notice_inbox();
+            $qry = 'INSERT INTO notice_inbox (user_id, notice_id, created) ' .
+              'SELECT user.id, ' . $this->id . ', "' . $this->created . '" ' .
+              'FROM user JOIN subscription ON user.id = subscription.subscriber ' .
+              'WHERE subscription.subscribed = ' . $this->profile_id . ' ' .
+              'AND NOT EXISTS (SELECT user_id, notice_id ' .
+              'FROM notice_inbox ' .
+              'WHERE user_id = user.id ' .
+              'AND notice_id = ' . $this->id . ' )';
+            if ($enabled === 'transitional') {
+                $qry .= ' AND user.inboxed = 1';
+            }
+            $inbox->query($qry);
+        }
+        return;
+    }
+
+    # Delete from inboxes if we're deleted.
+
+    function blowInboxes() {
+
+        $enabled = common_config('inboxes', 'enabled');
+
+        if ($enabled === true || $enabled === 'transitional') {
+            $inbox = new Notice_inbox();
+            $inbox->notice_id = $this->id;
+            $inbox->delete();
+        }
+
+        return;
+    }
 
 }
 
index f8c0aa38199400ec926a4283fb7ab9b17d350536..edecb30922aa537846289ea61064183a9cf447b3 100644 (file)
@@ -35,25 +35,25 @@ class NoticeWrapper extends Notice {
     public $is_local;                        // tinyint(1)  
     public $source;                          // varchar(32)  
 
-       var $notices = NULL;
-       var $i = -1;
-       
-       function __construct($arr) {
-               $this->notices = $arr;
-       }
-       
-       function fetch() {
-               static $fields = array('id', 'profile_id', 'uri', 'content', 'rendered',
-                                                          'url', 'created', 'modified', 'reply_to', 'is_local', 'source');
-               $this->i++;
-               if ($this->i >= count($this->notices)) {
-                       return false;
-               } else {
-                       $n = $this->notices[$this->i];
-                       foreach ($fields as $f) {
-                               $this->$f = $n->$f;
-                       }
-                       return true;
-               }
-       }
+    var $notices = NULL;
+    var $i = -1;
+    
+    function __construct($arr) {
+        $this->notices = $arr;
+    }
+    
+    function fetch() {
+        static $fields = array('id', 'profile_id', 'uri', 'content', 'rendered',
+                               'url', 'created', 'modified', 'reply_to', 'is_local', 'source');
+        $this->i++;
+        if ($this->i >= count($this->notices)) {
+            return false;
+        } else {
+            $n = $this->notices[$this->i];
+            foreach ($fields as $f) {
+                $this->$f = $n->$f;
+            }
+            return true;
+        }
+    }
 }
\ No newline at end of file
index 5b75ff13feb05a22bf48596ac5d73fdaf69f1759..84c4a1020b5bf47bfcad4d504a8e387b2bf052cf 100644 (file)
@@ -34,22 +34,22 @@ class Notice_tag extends Memcached_DataObject
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
-       
-       static function getStream($tag, $offset=0, $limit=20) {
-               $qry = 
-                 'SELECT notice.* ' .
-                 'FROM notice JOIN notice_tag ON notice.id = notice_tag.notice_id ' .
-                 'WHERE notice_tag.tag = "%s" ';
+    
+    static function getStream($tag, $offset=0, $limit=20) {
+        $qry = 
+          'SELECT notice.* ' .
+          'FROM notice JOIN notice_tag ON notice.id = notice_tag.notice_id ' .
+          'WHERE notice_tag.tag = "%s" ';
 
-               return Notice::getStream(sprintf($qry, $tag),
-                                                                'notice_tag:notice_stream:' . common_keyize($tag),
-                                                                $offset, $limit);
-       }
-       
-       function blowCache() {
-               $cache = common_memcache();
-               if ($cache) {
-                       $cache->delete(common_cache_key('notice_tag:notice_stream:' . $this->tag));
-               }
-       }
+        return Notice::getStream(sprintf($qry, $tag),
+                                 'notice_tag:notice_stream:' . common_keyize($tag),
+                                 $offset, $limit);
+    }
+    
+    function blowCache() {
+        $cache = common_memcache();
+        if ($cache) {
+            $cache->delete(common_cache_key('notice_tag:notice_stream:' . $this->tag));
+        }
+    }
 }
index b57d7e38ddfd8913010415321df22ae5da584d98..1f4508bf158d13b8e4df94ff9a69fedc41857f73 100644 (file)
@@ -46,114 +46,114 @@ class Profile extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-       function getAvatar($width, $height=NULL) {
-               if (is_null($height)) {
-                       $height = $width;
-               }
-               return Avatar::pkeyGet(array('profile_id' => $this->id,
-                                                                        'width' => $width,
-                                                                        'height' => $height));
-       }
-
-       function getOriginalAvatar() {
-               $avatar = DB_DataObject::factory('avatar');
-               $avatar->profile_id = $this->id;
-               $avatar->original = true;
-               if ($avatar->find(true)) {
-                       return $avatar;
-               } else {
-                       return NULL;
-               }
-       }
-
-       function setOriginal($source) {
-
-               $info = @getimagesize($source);
-
-               if (!$info) {
-                       return NULL;
-               }
-
-               $filename = common_avatar_filename($this->id,
-                                                                                  image_type_to_extension($info[2]),
-                                                                                  NULL, common_timestamp());
-               $filepath = common_avatar_path($filename);
-
-               copy($source, $filepath);
-
-               $avatar = new Avatar();
-
-               $avatar->profile_id = $this->id;
-               $avatar->width = $info[0];
-               $avatar->height = $info[1];
-               $avatar->mediatype = image_type_to_mime_type($info[2]);
-               $avatar->filename = $filename;
-               $avatar->original = true;
-               $avatar->url = common_avatar_url($filename);
-               $avatar->created = DB_DataObject_Cast::dateTime(); # current time
-
-               # XXX: start a transaction here
-
-               if (!$this->delete_avatars()) {
-                       @unlink($filepath);
-                       return NULL;
-               }
-
-               if (!$avatar->insert()) {
-                       @unlink($filepath);
-                       return NULL;
-               }
-
-               foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
-                       # We don't do a scaled one if original is our scaled size
-                       if (!($avatar->width == $size && $avatar->height == $size)) {
-                               $s = $avatar->scale($size);
-                               if (!$s) {
-                                       return NULL;
-                               }
-                       }
-               }
-
-               return $avatar;
-       }
-
-       function delete_avatars() {
-               $avatar = new Avatar();
-               $avatar->profile_id = $this->id;
-               $avatar->find();
-               while ($avatar->fetch()) {
-                       $avatar->delete();
-               }
-               return true;
-       }
-
-       function getBestName() {
-               return ($this->fullname) ? $this->fullname : $this->nickname;
-       }
+    function getAvatar($width, $height=NULL) {
+        if (is_null($height)) {
+            $height = $width;
+        }
+        return Avatar::pkeyGet(array('profile_id' => $this->id,
+                                     'width' => $width,
+                                     'height' => $height));
+    }
+
+    function getOriginalAvatar() {
+        $avatar = DB_DataObject::factory('avatar');
+        $avatar->profile_id = $this->id;
+        $avatar->original = true;
+        if ($avatar->find(true)) {
+            return $avatar;
+        } else {
+            return NULL;
+        }
+    }
+
+    function setOriginal($source) {
+
+        $info = @getimagesize($source);
+
+        if (!$info) {
+            return NULL;
+        }
+
+        $filename = common_avatar_filename($this->id,
+                                           image_type_to_extension($info[2]),
+                                           NULL, common_timestamp());
+        $filepath = common_avatar_path($filename);
+
+        copy($source, $filepath);
+
+        $avatar = new Avatar();
+
+        $avatar->profile_id = $this->id;
+        $avatar->width = $info[0];
+        $avatar->height = $info[1];
+        $avatar->mediatype = image_type_to_mime_type($info[2]);
+        $avatar->filename = $filename;
+        $avatar->original = true;
+        $avatar->url = common_avatar_url($filename);
+        $avatar->created = DB_DataObject_Cast::dateTime(); # current time
+
+        # XXX: start a transaction here
+
+        if (!$this->delete_avatars()) {
+            @unlink($filepath);
+            return NULL;
+        }
+
+        if (!$avatar->insert()) {
+            @unlink($filepath);
+            return NULL;
+        }
+
+        foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
+            # We don't do a scaled one if original is our scaled size
+            if (!($avatar->width == $size && $avatar->height == $size)) {
+                $s = $avatar->scale($size);
+                if (!$s) {
+                    return NULL;
+                }
+            }
+        }
+
+        return $avatar;
+    }
+
+    function delete_avatars() {
+        $avatar = new Avatar();
+        $avatar->profile_id = $this->id;
+        $avatar->find();
+        while ($avatar->fetch()) {
+            $avatar->delete();
+        }
+        return true;
+    }
+
+    function getBestName() {
+        return ($this->fullname) ? $this->fullname : $this->nickname;
+    }
 
     # Get latest notice on or before date; default now
-       function getCurrentNotice($dt=NULL) {
-               $notice = new Notice();
-               $notice->profile_id = $this->id;
-               if ($dt) {
-                       $notice->whereAdd('created < "' . $dt . '"');
-               }
-               $notice->orderBy('created DESC, notice.id DESC');
-               $notice->limit(1);
-               if ($notice->find(true)) {
-                       return $notice;
-               }
-               return NULL;
-       }
-
-       function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
-               $qry =
-                 'SELECT * ' .
-                 'FROM notice ' .
-                 'WHERE profile_id = %d ';
-
-               return Notice::getStream(sprintf($qry, $this->id),
-                                                                'profile:notices:'.$this->id,
-                                                                $offset, $limit, $since_id, $before_id);
-       }
+    function getCurrentNotice($dt=NULL) {
+        $notice = new Notice();
+        $notice->profile_id = $this->id;
+        if ($dt) {
+            $notice->whereAdd('created < "' . $dt . '"');
+        }
+        $notice->orderBy('created DESC, notice.id DESC');
+        $notice->limit(1);
+        if ($notice->find(true)) {
+            return $notice;
+        }
+        return NULL;
+    }
+
+    function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
+        $qry =
+          'SELECT * ' .
+          'FROM notice ' .
+          'WHERE profile_id = %d ';
+
+        return Notice::getStream(sprintf($qry, $this->id),
+                                 'profile:notices:'.$this->id,
+                                 $offset, $limit, $since_id, $before_id);
+    }
 }
index dde19aea250a5e1dc724202cd50cefc802d15ce1..2daabf86710c2974ef0cec42b03d8e27b2f882e7 100644 (file)
@@ -21,81 +21,81 @@ class Profile_tag extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-       static function getTags($tagger, $tagged) {
-               
-               $tags = array();
+    static function getTags($tagger, $tagged) {
+        
+        $tags = array();
 
-               # XXX: store this in memcached
-               
-               $profile_tag = new Profile_tag();
-               $profile_tag->tagger = $tagger;
-               $profile_tag->tagged = $tagged;
-               
-               $profile_tag->find();
-               
-               while ($profile_tag->fetch()) {
-                       $tags[] = $profile_tag->tag;
-               }
-               
-               $profile_tag->free();
-               
-               return $tags;
-       }
-       
-       static function setTags($tagger, $tagged, $newtags) {
-               
-               $oldtags = Profile_tag::getTags($tagger, $tagged);
-               
-               # Delete stuff that's old that not in new
-               
-               $to_delete = array_diff($oldtags, $newtags);
-               
-               # Insert stuff that's in new and not in old
-               
-               $to_insert = array_diff($newtags, $oldtags);
-               
-               $profile_tag = new Profile_tag();
-               
-               $profile_tag->tagger = $tagger;
-               $profile_tag->tagged = $tagged;
-               
-               $profile_tag->query('BEGIN');
-               
-               foreach ($to_delete as $deltag) {
-                       $profile_tag->tag = $deltag;
-                       $result = $profile_tag->delete();
-                       if (!$result) {
-                               common_log_db_error($profile_tag, 'DELETE', __FILE__);
-                               return false;
-                       }
-               }
-               
-               foreach ($to_insert as $instag) {
-                       $profile_tag->tag = $instag;
-                       $result = $profile_tag->insert();
-                       if (!$result) {
-                               common_log_db_error($profile_tag, 'INSERT', __FILE__);
-                               return false;
-                       }
-               }
-               
-               $profile_tag->query('COMMIT');
-               
-               return true;
-       }
-       
-       # Return profiles with a given tag
-       static function getTagged($tagger, $tag) {
-               $profile = new Profile();
-               $profile->query('SELECT profile.* ' .
-                                               'FROM profile JOIN profile_tag ' .
-                                               'ON profile.id = profile_tag.tagged ' .
-                                               'WHERE profile_tag.tagger = ' . $tagger . ' ' .
-                                               'AND profile_tag.tag = "' . $tag . '" ');
-               $tagged = array();
-               while ($profile->fetch()) {
-                       $tagged[] = clone($profile);
-               }
-               return $tagged;
-       }
+        # XXX: store this in memcached
+        
+        $profile_tag = new Profile_tag();
+        $profile_tag->tagger = $tagger;
+        $profile_tag->tagged = $tagged;
+        
+        $profile_tag->find();
+        
+        while ($profile_tag->fetch()) {
+            $tags[] = $profile_tag->tag;
+        }
+        
+        $profile_tag->free();
+        
+        return $tags;
+    }
+    
+    static function setTags($tagger, $tagged, $newtags) {
+        
+        $oldtags = Profile_tag::getTags($tagger, $tagged);
+        
+        # Delete stuff that's old that not in new
+        
+        $to_delete = array_diff($oldtags, $newtags);
+        
+        # Insert stuff that's in new and not in old
+        
+        $to_insert = array_diff($newtags, $oldtags);
+        
+        $profile_tag = new Profile_tag();
+        
+        $profile_tag->tagger = $tagger;
+        $profile_tag->tagged = $tagged;
+        
+        $profile_tag->query('BEGIN');
+        
+        foreach ($to_delete as $deltag) {
+            $profile_tag->tag = $deltag;
+            $result = $profile_tag->delete();
+            if (!$result) {
+                common_log_db_error($profile_tag, 'DELETE', __FILE__);
+                return false;
+            }
+        }
+        
+        foreach ($to_insert as $instag) {
+            $profile_tag->tag = $instag;
+            $result = $profile_tag->insert();
+            if (!$result) {
+                common_log_db_error($profile_tag, 'INSERT', __FILE__);
+                return false;
+            }
+        }
+        
+        $profile_tag->query('COMMIT');
+        
+        return true;
+    }
+    
+    # Return profiles with a given tag
+    static function getTagged($tagger, $tag) {
+        $profile = new Profile();
+        $profile->query('SELECT profile.* ' .
+                        'FROM profile JOIN profile_tag ' .
+                        'ON profile.id = profile_tag.tagged ' .
+                        'WHERE profile_tag.tagger = ' . $tagger . ' ' .
+                        'AND profile_tag.tag = "' . $tag . '" ');
+        $tagged = array();
+        while ($profile->fetch()) {
+            $tagged[] = clone($profile);
+        }
+        return $tagged;
+    }
 }
index 8ba3281de39cf30846b57eb61d4403f9099cb22b..e54b4976bdb5b5a5de4e1158c02e5837f64c7933 100644 (file)
@@ -22,34 +22,34 @@ class Queue_item extends Memcached_DataObject
     ###END_AUTOCODE
 
     function sequenceKey() { return array(false, false); }
-       
-       static function top($transport) {
-
-               $qi = new Queue_item();
-               $qi->transport = $transport;
-               $qi->orderBy('created');
-               $qi->whereAdd('claimed is NULL');
-
-               $qi->limit(1);
-
-               $cnt = $qi->find(TRUE);
-
-               if ($cnt) {
-                       # XXX: potential race condition
-                       # can we force it to only update if claimed is still NULL
-                       # (or old)?
-                       common_log(LOG_INFO, 'claiming queue item = ' . $qi->notice_id . ' for transport ' . $transport);
-                       $orig = clone($qi);
-                       $qi->claimed = common_sql_now();
-                       $result = $qi->update($orig);
-                       if ($result) {
-                               common_log(LOG_INFO, 'claim succeeded.');
-                               return $qi;
-                       } else {
-                               common_log(LOG_INFO, 'claim failed.');
-                       }
-               }
-               $qi = NULL;
-               return NULL;
-       }
+    
+    static function top($transport) {
+
+        $qi = new Queue_item();
+        $qi->transport = $transport;
+        $qi->orderBy('created');
+        $qi->whereAdd('claimed is NULL');
+
+        $qi->limit(1);
+
+        $cnt = $qi->find(TRUE);
+
+        if ($cnt) {
+            # XXX: potential race condition
+            # can we force it to only update if claimed is still NULL
+            # (or old)?
+            common_log(LOG_INFO, 'claiming queue item = ' . $qi->notice_id . ' for transport ' . $transport);
+            $orig = clone($qi);
+            $qi->claimed = common_sql_now();
+            $result = $qi->update($orig);
+            if ($result) {
+                common_log(LOG_INFO, 'claim succeeded.');
+                return $qi;
+            } else {
+                common_log(LOG_INFO, 'claim failed.');
+            }
+        }
+        $qi = NULL;
+        return NULL;
+    }
 }
index 6ecb5134684633e982eebcbe9c4493e56d6e88ca..f6e0791f997e2ec612711f98792337d06cd1cb2f 100644 (file)
@@ -21,8 +21,8 @@ class Sms_carrier extends Memcached_DataObject
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
-       
-       function toEmailAddress($sms) {
-               return sprintf($this->email_pattern, $sms);
-       }
+    
+    function toEmailAddress($sms) {
+        return sprintf($this->email_pattern, $sms);
+    }
 }
index cc174fccee3fce58e022825e893767f82ff8f3ed..a3b5e4b90d60721edc8670689bd96a5c31390d42 100644 (file)
@@ -44,8 +44,8 @@ class Subscription extends Memcached_DataObject
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
-       
-       function &pkeyGet($kv) {
-               return Memcached_DataObject::pkeyGet('Subscription', $kv);
-       }
+    
+    function &pkeyGet($kv) {
+        return Memcached_DataObject::pkeyGet('Subscription', $kv);
+    }
 }
index 32d5bedde1b72b6430637c1311aa6c1d84aa485d..c2c6ad57f115677cd077313be464e99769406f6f 100644 (file)
@@ -67,82 +67,82 @@ class User extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-       function getProfile() {
-               return Profile::staticGet('id', $this->id);
-       }
-
-       function isSubscribed($other) {
-               assert(!is_null($other));
-               # XXX: cache results of this query
-               $sub = Subscription::pkeyGet(array('subscriber' => $this->id,
-                                                                                  'subscribed' => $other->id));
-               return (is_null($sub)) ? false : true;
-       }
-
-       # 'update' won't write key columns, so we have to do it ourselves.
-
-       function updateKeys(&$orig) {
-               $parts = array();
-               foreach (array('nickname', 'email', 'jabber', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) {
-                       if (strcmp($this->$k, $orig->$k) != 0) {
-                               $parts[] = $k . ' = ' . $this->_quote($this->$k);
-                       }
-               }
-               if (count($parts) == 0) {
-                       # No changes
-                       return true;
-               }
-               $toupdate = implode(', ', $parts);
-
-               $table = $this->tableName();
-               if(common_config('db','quote_identifiers')) {
-                       $table = '"' . $table . '"';
-               }
-               $qry = 'UPDATE ' . $table . ' SET ' . $toupdate .
-                 ' WHERE id = ' . $this->id;
-               $orig->decache();
-               $result = $this->query($qry);
-               if ($result) {
-                       $this->encache();
-               }
-               return $result;
-       }
-
-       function allowed_nickname($nickname) {
-               # XXX: should already be validated for size, content, etc.
-               static $blacklist = array('rss', 'xrds', 'doc', 'main',
-                                                                 'settings', 'notice', 'user',
-                                                                 'search', 'avatar', 'tag', 'tags',
-                                                                 'api', 'message');
-               $merged = array_merge($blacklist, common_config('nickname', 'blacklist'));
-               return !in_array($nickname, $merged);
-       }
-
-       function getCurrentNotice($dt=NULL) {
-               $profile = $this->getProfile();
-               if (!$profile) {
-                       return NULL;
-               }
-               return $profile->getCurrentNotice($dt);
-       }
-
-       function getCarrier() {
-               return Sms_carrier::staticGet('id', $this->carrier);
-       }
-
-       function subscribeTo($other) {
-               $sub = new Subscription();
-               $sub->subscriber = $this->id;
-               $sub->subscribed = $other->id;
-
-               $sub->created = common_sql_now(); # current time
-
-               if (!$sub->insert()) {
-                       return false;
-               }
-
-               return true;
-       }
+    function getProfile() {
+        return Profile::staticGet('id', $this->id);
+    }
+
+    function isSubscribed($other) {
+        assert(!is_null($other));
+        # XXX: cache results of this query
+        $sub = Subscription::pkeyGet(array('subscriber' => $this->id,
+                                           'subscribed' => $other->id));
+        return (is_null($sub)) ? false : true;
+    }
+
+    # 'update' won't write key columns, so we have to do it ourselves.
+
+    function updateKeys(&$orig) {
+        $parts = array();
+        foreach (array('nickname', 'email', 'jabber', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) {
+            if (strcmp($this->$k, $orig->$k) != 0) {
+                $parts[] = $k . ' = ' . $this->_quote($this->$k);
+            }
+        }
+        if (count($parts) == 0) {
+            # No changes
+            return true;
+        }
+        $toupdate = implode(', ', $parts);
+
+        $table = $this->tableName();
+        if(common_config('db','quote_identifiers')) {
+            $table = '"' . $table . '"';
+        }
+        $qry = 'UPDATE ' . $table . ' SET ' . $toupdate .
+          ' WHERE id = ' . $this->id;
+        $orig->decache();
+        $result = $this->query($qry);
+        if ($result) {
+            $this->encache();
+        }
+        return $result;
+    }
+
+    function allowed_nickname($nickname) {
+        # XXX: should already be validated for size, content, etc.
+        static $blacklist = array('rss', 'xrds', 'doc', 'main',
+                                  'settings', 'notice', 'user',
+                                  'search', 'avatar', 'tag', 'tags',
+                                  'api', 'message');
+        $merged = array_merge($blacklist, common_config('nickname', 'blacklist'));
+        return !in_array($nickname, $merged);
+    }
+
+    function getCurrentNotice($dt=NULL) {
+        $profile = $this->getProfile();
+        if (!$profile) {
+            return NULL;
+        }
+        return $profile->getCurrentNotice($dt);
+    }
+
+    function getCarrier() {
+        return Sms_carrier::staticGet('id', $this->carrier);
+    }
+
+    function subscribeTo($other) {
+        $sub = new Subscription();
+        $sub->subscriber = $this->id;
+        $sub->subscribed = $other->id;
+
+        $sub->created = common_sql_now(); # current time
+
+        if (!$sub->insert()) {
+            return false;
+        }
+
+        return true;
+    }
 
     function hasBlocked($other) {
 
@@ -158,193 +158,193 @@ class User extends Memcached_DataObject
         return $result;
     }
 
-       static function register($fields) {
+    static function register($fields) {
+
+        # MAGICALLY put fields into current scope
+
+        extract($fields);
+
+        $profile = new Profile();
+
+        $profile->query('BEGIN');
+
+        $profile->nickname = $nickname;
+        $profile->profileurl = common_profile_url($nickname);
+
+        if ($fullname) {
+            $profile->fullname = $fullname;
+        }
+        if ($homepage) {
+            $profile->homepage = $homepage;
+        }
+        if ($bio) {
+            $profile->bio = $bio;
+        }
+        if ($location) {
+            $profile->location = $location;
+        }
+
+        $profile->created = common_sql_now();
+
+        $id = $profile->insert();
+
+        if (!$id) {
+            common_log_db_error($profile, 'INSERT', __FILE__);
+            return FALSE;
+        }
+
+        $user = new User();
 
-               # MAGICALLY put fields into current scope
+        $user->id = $id;
+        $user->nickname = $nickname;
 
-               extract($fields);
+        if ($password) { # may not have a password for OpenID users
+            $user->password = common_munge_password($password, $id);
+        }
+
+        # Users who respond to invite email have proven their ownership of that address
+
+        if ($code) {
+            $invite = Invitation::staticGet($code);
+            if ($invite && $invite->address && $invite->address_type == 'email' && $invite->address == $email) {
+                $user->email = $invite->address;
+            }
+        }
+
+        $inboxes = common_config('inboxes', 'enabled');
 
-               $profile = new Profile();
+        if ($inboxes === true || $inboxes == 'transitional') {
+            $user->inboxed = 1;
+        }
+
+        $user->created = common_sql_now();
+        $user->uri = common_user_uri($user);
+
+        $result = $user->insert();
+
+        if (!$result) {
+            common_log_db_error($user, 'INSERT', __FILE__);
+            return FALSE;
+        }
 
-               $profile->query('BEGIN');
+        # Everyone is subscribed to themself
 
-               $profile->nickname = $nickname;
-               $profile->profileurl = common_profile_url($nickname);
+        $subscription = new Subscription();
+        $subscription->subscriber = $user->id;
+        $subscription->subscribed = $user->id;
+        $subscription->created = $user->created;
 
-               if ($fullname) {
-                       $profile->fullname = $fullname;
-               }
-               if ($homepage) {
-                       $profile->homepage = $homepage;
-               }
-               if ($bio) {
-                       $profile->bio = $bio;
-               }
-               if ($location) {
-                       $profile->location = $location;
-               }
+        $result = $subscription->insert();
+
+        if (!$result) {
+            common_log_db_error($subscription, 'INSERT', __FILE__);
+            return FALSE;
+        }
+
+        if ($email && !$user->email) {
+
+            $confirm = new Confirm_address();
+            $confirm->code = common_confirmation_code(128);
+            $confirm->user_id = $user->id;
+            $confirm->address = $email;
+            $confirm->address_type = 'email';
+
+            $result = $confirm->insert();
+            if (!$result) {
+                common_log_db_error($confirm, 'INSERT', __FILE__);
+                return FALSE;
+            }
+        }
+
+        if ($code && $user->email) {
+            $user->emailChanged();
+        }
 
-               $profile->created = common_sql_now();
+        $profile->query('COMMIT');
 
-               $id = $profile->insert();
+        if ($email && !$user->email) {
+            mail_confirm_address($user, $confirm->code, $profile->nickname, $email);
+        }
 
-               if (!$id) {
-                       common_log_db_error($profile, 'INSERT', __FILE__);
-                   return FALSE;
-               }
+        return $user;
+    }
 
-               $user = new User();
+    # Things we do when the email changes
 
-               $user->id = $id;
-               $user->nickname = $nickname;
+    function emailChanged() {
 
-               if ($password) { # may not have a password for OpenID users
-                       $user->password = common_munge_password($password, $id);
-               }
+        $invites = new Invitation();
+        $invites->address = $this->email;
+        $invites->address_type = 'email';
 
-               # Users who respond to invite email have proven their ownership of that address
+        if ($invites->find()) {
+            while ($invites->fetch()) {
+                $other = User::staticGet($invites->user_id);
+                subs_subscribe_to($other, $this);
+            }
+        }
+    }
 
-               if ($code) {
-                       $invite = Invitation::staticGet($code);
-                       if ($invite && $invite->address && $invite->address_type == 'email' && $invite->address == $email) {
-                               $user->email = $invite->address;
-                       }
-               }
-
-               $inboxes = common_config('inboxes', 'enabled');
-
-               if ($inboxes === true || $inboxes == 'transitional') {
-                       $user->inboxed = 1;
-               }
-
-               $user->created = common_sql_now();
-               $user->uri = common_user_uri($user);
-
-               $result = $user->insert();
-
-               if (!$result) {
-                       common_log_db_error($user, 'INSERT', __FILE__);
-                       return FALSE;
-               }
-
-               # Everyone is subscribed to themself
-
-               $subscription = new Subscription();
-               $subscription->subscriber = $user->id;
-               $subscription->subscribed = $user->id;
-               $subscription->created = $user->created;
-
-               $result = $subscription->insert();
-
-               if (!$result) {
-                       common_log_db_error($subscription, 'INSERT', __FILE__);
-                       return FALSE;
-               }
-
-               if ($email && !$user->email) {
-
-                       $confirm = new Confirm_address();
-                       $confirm->code = common_confirmation_code(128);
-                       $confirm->user_id = $user->id;
-                       $confirm->address = $email;
-                       $confirm->address_type = 'email';
-
-                       $result = $confirm->insert();
-                       if (!$result) {
-                               common_log_db_error($confirm, 'INSERT', __FILE__);
-                               return FALSE;
-                       }
-               }
-
-               if ($code && $user->email) {
-                       $user->emailChanged();
-               }
-
-               $profile->query('COMMIT');
-
-               if ($email && !$user->email) {
-                       mail_confirm_address($user, $confirm->code, $profile->nickname, $email);
-               }
-
-               return $user;
-       }
-
-       # Things we do when the email changes
-
-       function emailChanged() {
-
-               $invites = new Invitation();
-               $invites->address = $this->email;
-               $invites->address_type = 'email';
-
-               if ($invites->find()) {
-                       while ($invites->fetch()) {
-                               $other = User::staticGet($invites->user_id);
-                               subs_subscribe_to($other, $this);
-                       }
-               }
-       }
-
-       function hasFave($notice) {
-               $cache = common_memcache();
-
-               # XXX: Kind of a hack.
-               if ($cache) {
-                       # This is the stream of favorite notices, in rev chron
-                       # order. This forces it into cache.
-                       $faves = $this->favoriteNotices(0, NOTICE_CACHE_WINDOW);
-                       $cnt = 0;
-                       while ($faves->fetch()) {
-                               if ($faves->id < $notice->id) {
-                                       # If we passed it, it's not a fave
-                                       return false;
-                               } else if ($faves->id == $notice->id) {
-                                       # If it matches a cached notice, then it's a fave
-                                       return true;
-                               }
-                               $cnt++;
-                       }
-                       # If we're not past the end of the cache window,
-                       # then the cache has all available faves, so this one
-                       # is not a fave.
-                       if ($cnt < NOTICE_CACHE_WINDOW) {
-                               return false;
-                       }
-                       # Otherwise, cache doesn't have all faves;
-                       # fall through to the default
-               }
-               $fave = Fave::pkeyGet(array('user_id' => $this->id,
-                                                                       'notice_id' => $notice->id));
-               return ((is_null($fave)) ? false : true);
-       }
-       function mutuallySubscribed($other) {
-               return $this->isSubscribed($other) &&
-                 $other->isSubscribed($this);
-       }
+    function hasFave($notice) {
+        $cache = common_memcache();
+
+        # XXX: Kind of a hack.
+        if ($cache) {
+            # This is the stream of favorite notices, in rev chron
+            # order. This forces it into cache.
+            $faves = $this->favoriteNotices(0, NOTICE_CACHE_WINDOW);
+            $cnt = 0;
+            while ($faves->fetch()) {
+                if ($faves->id < $notice->id) {
+                    # If we passed it, it's not a fave
+                    return false;
+                } else if ($faves->id == $notice->id) {
+                    # If it matches a cached notice, then it's a fave
+                    return true;
+                }
+                $cnt++;
+            }
+            # If we're not past the end of the cache window,
+            # then the cache has all available faves, so this one
+            # is not a fave.
+            if ($cnt < NOTICE_CACHE_WINDOW) {
+                return false;
+            }
+            # Otherwise, cache doesn't have all faves;
+            # fall through to the default
+        }
+        $fave = Fave::pkeyGet(array('user_id' => $this->id,
+                                    'notice_id' => $notice->id));
+        return ((is_null($fave)) ? false : true);
+    }
+    function mutuallySubscribed($other) {
+        return $this->isSubscribed($other) &&
+          $other->isSubscribed($this);
+    }
 
         function mutuallySubscribedUsers() {
 
-               # 3-way join; probably should get cached
-               $qry = 'SELECT user.* ' .
-                 'FROM subscription sub1 JOIN user ON sub1.subscribed = user.id ' .
-                 'JOIN subscription sub2 ON user.id = sub2.subscriber ' .
-                 'WHERE sub1.subscriber = %d and sub2.subscribed = %d ' .
-                 'ORDER BY user.nickname';
-               $user = new User();
-               $user->query(sprintf($qry, $this->id, $this->id));
-
-               return $user;
-       }
-
-       function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) {
-               $qry =
-                 'SELECT notice.* ' .
-                 'FROM notice JOIN reply ON notice.id = reply.notice_id ' .
-                 'WHERE reply.profile_id = %d ';
-               return Notice::getStream(sprintf($qry, $this->id),
-                                                                'user:replies:'.$this->id,
-                                                                $offset, $limit, $since_id, $before_id, NULL, $since);
-       }
+        # 3-way join; probably should get cached
+        $qry = 'SELECT user.* ' .
+          'FROM subscription sub1 JOIN user ON sub1.subscribed = user.id ' .
+          'JOIN subscription sub2 ON user.id = sub2.subscriber ' .
+          'WHERE sub1.subscriber = %d and sub2.subscribed = %d ' .
+          'ORDER BY user.nickname';
+        $user = new User();
+        $user->query(sprintf($qry, $this->id, $this->id));
+
+        return $user;
+    }
+
+    function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) {
+        $qry =
+          'SELECT notice.* ' .
+          'FROM notice JOIN reply ON notice.id = reply.notice_id ' .
+          'WHERE reply.profile_id = %d ';
+        return Notice::getStream(sprintf($qry, $this->id),
+                                 'user:replies:'.$this->id,
+                                 $offset, $limit, $since_id, $before_id, NULL, $since);
+    }
 
         function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) {
         $profile = $this->getProfile();
@@ -353,64 +353,64 @@ class User extends Memcached_DataObject
         } else {
             return $profile->getNotices($offset, $limit, $since_id, $before_id);
         }
-       }
+    }
 
       function favoriteNotices($offset=0, $limit=NOTICES_PER_PAGE) {
-               $qry =
-                 'SELECT notice.* ' .
-                 'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
-                 'WHERE fave.user_id = %d ';
-               return Notice::getStream(sprintf($qry, $this->id),
-                                                                'user:faves:'.$this->id,
-                                                                $offset, $limit);
-       }
+        $qry =
+          'SELECT notice.* ' .
+          'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
+          'WHERE fave.user_id = %d ';
+        return Notice::getStream(sprintf($qry, $this->id),
+                                 'user:faves:'.$this->id,
+                                 $offset, $limit);
+    }
 
         function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) {
-               $enabled = common_config('inboxes', 'enabled');
-
-               # Complicated code, depending on whether we support inboxes yet
-               # XXX: make this go away when inboxes become mandatory
-
-               if ($enabled === false ||
-                       ($enabled == 'transitional' && $this->inboxed == 0)) {
-                       $qry =
-                         'SELECT notice.* ' .
-                         'FROM notice JOIN subscription ON notice.profile_id = subscription.subscribed ' .
-                         'WHERE subscription.subscriber = %d ';
-                       $order = NULL;
-               } else if ($enabled === true ||
-                          ($enabled == 'transitional' && $this->inboxed == 1)) {
-
-                       $qry =
-                         'SELECT notice.* ' .
-                         'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' .
-                         'WHERE notice_inbox.user_id = %d ';
-                       # NOTE: we override ORDER
-                       $order = 'ORDER BY notice_inbox.created DESC, notice_inbox.notice_id DESC ';
-               }
-               return Notice::getStream(sprintf($qry, $this->id),
-                                                                'user:notices_with_friends:' . $this->id,
-                                                                $offset, $limit, $since_id, $before_id,
-                                                                $order, $since);
-       }
+        $enabled = common_config('inboxes', 'enabled');
+
+        # Complicated code, depending on whether we support inboxes yet
+        # XXX: make this go away when inboxes become mandatory
+
+        if ($enabled === false ||
+            ($enabled == 'transitional' && $this->inboxed == 0)) {
+            $qry =
+              'SELECT notice.* ' .
+              'FROM notice JOIN subscription ON notice.profile_id = subscription.subscribed ' .
+              'WHERE subscription.subscriber = %d ';
+            $order = NULL;
+        } else if ($enabled === true ||
+               ($enabled == 'transitional' && $this->inboxed == 1)) {
+
+            $qry =
+              'SELECT notice.* ' .
+              'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' .
+              'WHERE notice_inbox.user_id = %d ';
+            # NOTE: we override ORDER
+            $order = 'ORDER BY notice_inbox.created DESC, notice_inbox.notice_id DESC ';
+        }
+        return Notice::getStream(sprintf($qry, $this->id),
+                                 'user:notices_with_friends:' . $this->id,
+                                 $offset, $limit, $since_id, $before_id,
+                                 $order, $since);
+    }
 
         function blowFavesCache() {
-               $cache = common_memcache();
-               if ($cache) {
-                       # Faves don't happen chronologically, so we need to blow
-                       # ;last cache, too
-                       $cache->delete(common_cache_key('user:faves:'.$this->id));
-                       $cache->delete(common_cache_key('user:faves:'.$this->id).';last');
-               }
-       }
+        $cache = common_memcache();
+        if ($cache) {
+            # Faves don't happen chronologically, so we need to blow
+            # ;last cache, too
+            $cache->delete(common_cache_key('user:faves:'.$this->id));
+            $cache->delete(common_cache_key('user:faves:'.$this->id).';last');
+        }
+    }
 
         function getSelfTags() {
-               return Profile_tag::getTags($this->id, $this->id);
-       }
+        return Profile_tag::getTags($this->id, $this->id);
+    }
 
         function setSelfTags($newtags) {
-               return Profile_tag::setTags($this->id, $this->id, $newtags);
-       }
+        return Profile_tag::setTags($this->id, $this->id, $newtags);
+    }
 
     function block($other) {
 
@@ -434,8 +434,8 @@ class User extends Memcached_DataObject
 
         # Cancel their subscription, if it exists
 
-               $sub = Subscription::pkeyGet(array('subscriber' => $other->id,
-                                                                                  'subscribed' => $this->id));
+        $sub = Subscription::pkeyGet(array('subscriber' => $other->id,
+                                           'subscribed' => $this->id));
 
         if ($sub) {
             $result = $sub->delete();
index 5a28c309133a54648024a246b85cb2689b65f9ea..95ba64d0fee5f63c646e38dc0211b185d62d3a68 100644 (file)
@@ -54,100 +54,100 @@ require_once(INSTALLDIR.'/lib/language.php');
 
 $config =
   array('site' =>
-               array('name' => 'Just another Laconica microblog',
-                         'server' => 'localhost',
-                         'theme' => 'default',
-                         'path' => '/',
-                         'logfile' => NULL,
-                         'fancy' => false,
-                         'locale_path' => INSTALLDIR.'/locale',
-                         'language' => 'en_US',
-                         'languages' => get_all_languages(),
-                     'email' =>
-                     array_key_exists('SERVER_ADMIN', $_SERVER) ? $_SERVER['SERVER_ADMIN'] : NULL,
-                         'broughtby' => NULL,
-                         'timezone' => 'UTC',
-                         'broughtbyurl' => NULL,
-                         'closed' => false,
-                         'inviteonly' => false,
+        array('name' => 'Just another Laconica microblog',
+              'server' => 'localhost',
+              'theme' => 'default',
+              'path' => '/',
+              'logfile' => NULL,
+              'fancy' => false,
+              'locale_path' => INSTALLDIR.'/locale',
+              'language' => 'en_US',
+              'languages' => get_all_languages(),
+              'email' =>
+              array_key_exists('SERVER_ADMIN', $_SERVER) ? $_SERVER['SERVER_ADMIN'] : NULL,
+              'broughtby' => NULL,
+              'timezone' => 'UTC',
+              'broughtbyurl' => NULL,
+              'closed' => false,
+              'inviteonly' => false,
               'private' => false),
-               'syslog' =>
-               array('appname' => 'laconica', # for syslog
-                         'priority' => 'debug'), # XXX: currently ignored
-               'queue' =>
-               array('enabled' => false),
-               'license' =>
-               array('url' => 'http://creativecommons.org/licenses/by/3.0/',
-                         'title' => 'Creative Commons Attribution 3.0',
-                         'image' => 'http://i.creativecommons.org/l/by/3.0/88x31.png'),
-               'mail' =>
-               array('backend' => 'mail',
-                         'params' => NULL),
-               'nickname' =>
-               array('blacklist' => array(),
-                         'featured' => array()),
-               'profile' =>
-               array('banned' => array()),
-               'avatar' =>
-               array('server' => NULL),
-               'public' =>
-               array('localonly' => true,
-                         'blacklist' => array()),
-               'theme' =>
-               array('server' => NULL),
-               'throttle' =>
+        'syslog' =>
+        array('appname' => 'laconica', # for syslog
+              'priority' => 'debug'), # XXX: currently ignored
+        'queue' =>
+        array('enabled' => false),
+        'license' =>
+        array('url' => 'http://creativecommons.org/licenses/by/3.0/',
+              'title' => 'Creative Commons Attribution 3.0',
+              'image' => 'http://i.creativecommons.org/l/by/3.0/88x31.png'),
+        'mail' =>
+        array('backend' => 'mail',
+              'params' => NULL),
+        'nickname' =>
+        array('blacklist' => array(),
+              'featured' => array()),
+        'profile' =>
+        array('banned' => array()),
+        'avatar' =>
+        array('server' => NULL),
+        'public' =>
+        array('localonly' => true,
+              'blacklist' => array()),
+        'theme' =>
+        array('server' => NULL),
+        'throttle' =>
         array('enabled' => false, // whether to throttle edits; false by default
               'count' => 20, // number of allowed messages in timespan
               'timespan' => 600), // timespan for throttling
-               'xmpp' =>
-               array('enabled' => false,
-                         'server' => 'INVALID SERVER',
-                         'port' => 5222,
-                         'user' => 'update',
-                         'encryption' => true,
-                         'resource' => 'uniquename',
-                         'password' => 'blahblahblah',
-                         'host' => NULL, # only set if != server
-                         'debug' => false, # print extra debug info
-                         'public' => array()), # JIDs of users who want to receive the public stream
+        'xmpp' =>
+        array('enabled' => false,
+              'server' => 'INVALID SERVER',
+              'port' => 5222,
+              'user' => 'update',
+              'encryption' => true,
+              'resource' => 'uniquename',
+              'password' => 'blahblahblah',
+              'host' => NULL, # only set if != server
+              'debug' => false, # print extra debug info
+              'public' => array()), # JIDs of users who want to receive the public stream
         'sphinx' =>
         array('enabled' => false,
               'server' => 'localhost',
               'port' => 3312),
-               'tag' =>
-               array('dropoff' => 864000.0),
-               'popular' =>
-               array('dropoff' => 864000.0),
-               'daemon' =>
-               array('piddir' => '/var/run',
-                         'user' => false,
-                         'group' => false),
-               'integration' =>
-               array('source' => 'Laconica'), # source attribute for Twitter
-               'memcached' =>
-               array('enabled' => false,
-                         'server' => 'localhost',
-                         'port' => 11211),
-               'inboxes' =>
-               array('enabled' => true), # on by default for new sites
-               );
+        'tag' =>
+        array('dropoff' => 864000.0),
+        'popular' =>
+        array('dropoff' => 864000.0),
+        'daemon' =>
+        array('piddir' => '/var/run',
+              'user' => false,
+              'group' => false),
+        'integration' =>
+        array('source' => 'Laconica'), # source attribute for Twitter
+        'memcached' =>
+        array('enabled' => false,
+              'server' => 'localhost',
+              'port' => 11211),
+        'inboxes' =>
+        array('enabled' => true), # on by default for new sites
+        );
 
 $config['db'] = &PEAR::getStaticProperty('DB_DataObject','options');
 
 $config['db'] =
   array('database' => 'YOU HAVE TO SET THIS IN config.php',
-           'schema_location' => INSTALLDIR . '/classes',
-               'class_location' => INSTALLDIR . '/classes',
-               'require_prefix' => 'classes/',
-               'class_prefix' => '',
-               'mirror' => NULL,
+        'schema_location' => INSTALLDIR . '/classes',
+        'class_location' => INSTALLDIR . '/classes',
+        'require_prefix' => 'classes/',
+        'class_prefix' => '',
+        'mirror' => NULL,
         'db_driver' => 'DB', # XXX: JanRain libs only work with DB
-               'quote_identifiers' => false,
-               'type' => 'mysql' );
+        'quote_identifiers' => false,
+        'type' => 'mysql' );
 
 if (function_exists('date_default_timezone_set')) {
-       /* Work internally in UTC */
-       date_default_timezone_set('UTC');
+    /* Work internally in UTC */
+    date_default_timezone_set('UTC');
 }
 
 require_once(INSTALLDIR.'/config.php');
@@ -164,9 +164,9 @@ require_once(INSTALLDIR.'/lib/Shorturl_api.php');
 require_once(INSTALLDIR.'/lib/twitter.php');
 
 function __autoload($class) {
-       if ($class == 'OAuthRequest') {
-               require_once('OAuth.php');
-       } else if (file_exists(INSTALLDIR.'/classes/' . $class . '.php')) {
+    if ($class == 'OAuthRequest') {
+        require_once('OAuth.php');
+    } else if (file_exists(INSTALLDIR.'/classes/' . $class . '.php')) {
         require_once(INSTALLDIR.'/classes/' . $class . '.php');
     }
 }
index 5ba0e7e44283d3705dac1dddae4e73df69a1fcfc..335070cc4dcf815fe44af0f1f09329b9e20bcef2 100644 (file)
@@ -21,41 +21,41 @@ if (!defined('LACONICA')) { exit(1); }
 
 class DeleteAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-               $user = common_current_user();
-               $notice_id = $this->trimmed('notice');
-               $notice = Notice::staticGet($notice_id);
-               if (!$notice) {
-                       common_user_error(_('No such notice.'));
-                       exit;
-               }
-
-               $profile = $notice->getProfile();
-               $user_profile = $user->getProfile();
-
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-                       exit;
-               } else if ($notice->profile_id != $user_profile->id) {
-                       common_user_error(_('Can\'t delete this notice.'));
-                       exit;
-               }
-       }
-
-       function show_top($arr=NULL) {
-               $instr = $this->get_instructions();
-               $output = common_markup_to_html($instr);
-               common_element_start('div', 'instructions');
-               common_raw($output);
-               common_element_end('div');
-       }
-
-       function get_title() {
-               return NULL;
-       }
-
-       function show_header() {
-               return;
-       }
+    function handle($args) {
+        parent::handle($args);
+        $user = common_current_user();
+        $notice_id = $this->trimmed('notice');
+        $notice = Notice::staticGet($notice_id);
+        if (!$notice) {
+            common_user_error(_('No such notice.'));
+            exit;
+        }
+
+        $profile = $notice->getProfile();
+        $user_profile = $user->getProfile();
+
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+            exit;
+        } else if ($notice->profile_id != $user_profile->id) {
+            common_user_error(_('Can\'t delete this notice.'));
+            exit;
+        }
+    }
+
+    function show_top($arr=NULL) {
+        $instr = $this->get_instructions();
+        $output = common_markup_to_html($instr);
+        common_element_start('div', 'instructions');
+        common_raw($output);
+        common_element_end('div');
+    }
+
+    function get_title() {
+        return NULL;
+    }
+
+    function show_header() {
+        return;
+    }
 }
index 87a82ba01e59e9dba31db4dbcb6625a69bd5c548..67595861f07c3343c4a0bf7ae9811c79920c923d 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,261 +23,261 @@ require_once(INSTALLDIR.'/extlib/facebook/facebook.php');
 
 class FacebookAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-       }
-
-       function get_facebook() {
-               $apikey = common_config('facebook', 'apikey');
-               $secret = common_config('facebook', 'secret');
-               return new Facebook($apikey, $secret);
-       }
-
-       function update_profile_box($facebook, $fbuid, $user) {
-
-               $notice = $user->getCurrentNotice();
-
-               # Need to include inline CSS for styling the Profile box
-
-               $style = '<style>
-               #notices {
-               clear: both;
-               margin: 0 auto;
-               padding: 0;
-               list-style-type: none;
-               width: 600px;
-               border-top: 1px solid #dec5b5;
-               }
-               #notices a:hover {
-               text-decoration: underline;
-               }
-               .notice_single {
-               clear: both;
-               display: block;
-               margin: 0;
-               padding: 5px 5px 5px 0;
-               min-height: 48px;
-               font-family: Georgia, "Times New Roman", Times, serif;
-               font-size: 13px;
-               line-height: 16px;
-               border-bottom: 1px solid #dec5b5;
-               background-color:#FCFFF5;
-               opacity:1;
-               }
-               .notice_single:hover {
-               background-color: #f7ebcc;
-               }
-               .notice_single p {
-               display: inline;
-               margin: 0;
-               padding: 0;
-               }
-               </style>';
-
-               $html = $this->render_notice($notice);
-
-               $fbml = "<fb:wide>$content $html</fb:wide>";
-               $fbml .= "<fb:narrow>$content $html</fb:narrow>";
-
-               $fbml_main = "<fb:narrow>$content $html</fb:narrow>";
-
-               $facebook->api_client->profile_setFBML(NULL, $fbuid, $fbml, NULL, NULL, $fbml_main);
-       }
-
-       # Display methods
-
-       function show_header($selected ='Home') {
-
-               # Add a timestamp to the CSS file so Facebook cache wont ignore our changes
-               $ts = filemtime(theme_file('facebookapp.css'));
-               $cssurl = theme_path('facebookapp.css') . "?ts=$ts";
-
-               $header = '<link rel="stylesheet" type="text/css" href="'. $cssurl . '" />';
-               # $header .='<script src="" ></script>';
-               $header .= '<fb:dashboard/>';
-
-               $header .=
-                       '<fb:tabs>'
-                       .'<fb:tab-item title="Home" href="index.php" selected="' . ($selected == 'Home') .'" />'
-                       .'<fb:tab-item title="Invite Friends"  href="invite.php" selected="' . ($selected == 'Invite') . '" />'
-                       .'<fb:tab-item title="Settings"  href="settings.php" selected="' . ($selected == 'Settings') . '" />'
-                       .'</fb:tabs>';
-               $header .= '<div id="main_body">';
-
-         echo $header;
-
-       }
-
-       function show_footer() {
-         $footer = '</div>';
-         echo $footer;
-       }
-
-       function show_login_form() {
-
-               $loginform =
-                       ' <h2>To add the Identi.ca application, you need to log into your Identi.ca account.</h2>'
-                       .'<a href="http://identi.ca/">'
-                       .'      <img src="http://theme.identi.ca/identica/logo.png" alt="Identi.ca" id="logo"/>'
-                       .'</a>'
-                       .'<h1 class="pagetitle">Login</h1>'
-                       .'<div class="instructions">'
-                       .'      <p>Login with your username and password. Don\'t have a username yet?'
-                       .'        <a href="http://identi.ca/main/register">Register</a> a new account.'
-                       .'      </p>'
-                       .'</div>'
-                       .'<div id="content">'
-                       .'      <form method="post" id="login">'
-                       .'        <p>'
-                       .'              <label for="nickname">Nickname</label>'
-                       .'              <input name="nickname" type="text" class="input_text" id="nickname"/>'
-                       .'        </p>'
-                       .'        <p>'
-                       .'                <label for="password">Password</label>'
-                       .'              <input name="password" type="password" class="password" id="password"/>'
-                       .'        </p>'
-                       .'        <p>'
-                       .'              <input type="submit" id="submit" name="submit" class="submit" value="Login"/>'
-                       .'        </p>'
-                       .'      </form>'
-                       .'      <p>'
-                       .'        <a href="http://identi.ca/main/recoverpassword">Lost or forgotten password?</a>'
-                       .'      </p>'
-                       .'</div';
-
-                       echo $loginform;
-       }
-
-       function render_notice($notice) {
-
-               global $config;
-
-               $profile = $notice->getProfile();
-               $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
-
-               $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
-
-               # XXX: we need to figure this out better. Is this right?
-               if (strcmp($notice->uri, $noticeurl) != 0 && preg_match('/^http/', $notice->uri)) {
-                       $noticeurl = $notice->uri;
-               }
-
-               $html =
-               '<li class="notice_single" id="' . $notice->id . '">'
-               .'<a href="' . $profile->profileurl . '">'
-               .'<img src="';
-
-               if ($avatar) {
-                       $html .= common_avatar_display_url($avatar);
-               } else {
-                       $html .= common_default_avatar(AVATAR_STREAM_SIZE);
-               }
-
-               $html .=
-               '" class="avatar stream" width="'
-               . AVATAR_STREAM_SIZE . '" height="' . AVATAR_STREAM_SIZE .'"'
-               .' alt="';
-
-               if ($profile->fullname) {
-                       $html .= $profile->fullname;
-               } else {
-                       $html .= $profile->nickname;
-               }
-
-               $html .=
-               '"></a>'
-               .'<a href="' .  $profile->profileurl . '" class="nickname">' . $profile->nickname . '</a>'
-               .'<p class="content">' . $notice->rendered . '</p>'
-               .'<p class="time">'
-               .'<a class="permalink" href="' . $noticeurl . '" title="' . common_exact_date($notice->created) . '">' . common_date_string($notice->created) . '</a>';
-
-               if ($notice->source) {
-                       $html .= _(' from ');
-                       $html .= $this->source_link($notice->source);
-               }
-
-               if ($notice->reply_to) {
-                       $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to));
-                       $html .=
-                       ' (<a class="inreplyto" href="' . $replyurl . '">' . _('in reply to...') . ')';
-               }
-
-               $html .= '</p></li>';
-
-               return $html;
-       }
-
-       function source_link($source) {
-               $source_name = _($source);
-
-               $html = '<span class="noticesource">';
-
-               switch ($source) {
-                case 'web':
-                case 'xmpp':
-                case 'mail':
-                case 'omb':
-                case 'api':
-                       $html .= $source_name;
-                       break;
-                default:
-                       $ns = Notice_source::staticGet($source);
-                       if ($ns) {
-                               $html .= '<a href="' . $ns->url . '">' . $ns->name . '</a>';
-                       } else {
-                               $html .= $source_name;
-                       }
-                       break;
-               }
-
-               $html .= '</span>';
-
-               return $html;
-       }
-
-       function pagination($have_before, $have_after, $page, $fbaction, $args=NULL) {
-
-               $html = '';
-
-               if ($have_before || $have_after) {
-                       $html = '<div id="pagination">';
-                       $html .'<ul id="nav_pagination">';
-               }
-
-               if ($have_before) {
-                       $pargs = array('page' => $page-1);
-                       $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
-                       $html .= '<li class="before">';
-                       $html .'<a href="' . $this->pagination_url($fbaction, $newargs) . '">' . _('« After') . '</a>';
-                       $html .'</li>';
-               }
-
-               if ($have_after) {
-                       $pargs = array('page' => $page+1);
-                       $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
-                       $html .= '<li class="after">';
-                       $html .'<a href="' . $this->pagination_url($fbaction, $newargs) . '">' . _('Before Â»') . '</a>';
-                       $html .'</li>';
-               }
-
-               if ($have_before || $have_after) {
-                       $html .= '<ul>';
-                       $html .'<div>';
-               }
-       }
-
-       function pagination_url($fbaction, $args=NULL) {
-               global $config;
-
-               $extra = '';
-
-               if ($args) {
-                       foreach ($args as $key => $value) {
-                               $extra .= "&${key}=${value}";
-                       }
-               }
-
-               return "$fbaction?${extra}";
-       }
+    function handle($args) {
+        parent::handle($args);
+    }
+
+    function get_facebook() {
+        $apikey = common_config('facebook', 'apikey');
+        $secret = common_config('facebook', 'secret');
+        return new Facebook($apikey, $secret);
+    }
+
+    function update_profile_box($facebook, $fbuid, $user) {
+
+        $notice = $user->getCurrentNotice();
+
+        # Need to include inline CSS for styling the Profile box
+
+        $style = '<style>
+        #notices {
+        clear: both;
+        margin: 0 auto;
+        padding: 0;
+        list-style-type: none;
+        width: 600px;
+        border-top: 1px solid #dec5b5;
+        }
+        #notices a:hover {
+        text-decoration: underline;
+        }
+        .notice_single {
+        clear: both;
+        display: block;
+        margin: 0;
+        padding: 5px 5px 5px 0;
+        min-height: 48px;
+        font-family: Georgia, "Times New Roman", Times, serif;
+        font-size: 13px;
+        line-height: 16px;
+        border-bottom: 1px solid #dec5b5;
+        background-color:#FCFFF5;
+        opacity:1;
+        }
+        .notice_single:hover {
+        background-color: #f7ebcc;
+        }
+        .notice_single p {
+        display: inline;
+        margin: 0;
+        padding: 0;
+        }
+        </style>';
+
+        $html = $this->render_notice($notice);
+
+        $fbml = "<fb:wide>$content $html</fb:wide>";
+        $fbml .= "<fb:narrow>$content $html</fb:narrow>";
+
+        $fbml_main = "<fb:narrow>$content $html</fb:narrow>";
+
+        $facebook->api_client->profile_setFBML(NULL, $fbuid, $fbml, NULL, NULL, $fbml_main);
+    }
+
+    # Display methods
+
+    function show_header($selected ='Home') {
+
+        # Add a timestamp to the CSS file so Facebook cache wont ignore our changes
+        $ts = filemtime(theme_file('facebookapp.css'));
+        $cssurl = theme_path('facebookapp.css') . "?ts=$ts";
+
+         $header = '<link rel="stylesheet" type="text/css" href="'. $cssurl . '" />';
+         # $header .='<script src="" ></script>';
+          $header .= '<fb:dashboard/>';
+
+          $header .=
+            '<fb:tabs>'
+            .'<fb:tab-item title="Home" href="index.php" selected="' . ($selected == 'Home') .'" />'
+            .'<fb:tab-item title="Invite Friends"  href="invite.php" selected="' . ($selected == 'Invite') . '" />'
+            .'<fb:tab-item title="Settings"     href="settings.php" selected="' . ($selected == 'Settings') . '" />'
+            .'</fb:tabs>';
+          $header .= '<div id="main_body">';
+
+      echo $header;
+
+    }
+
+    function show_footer() {
+      $footer = '</div>';
+      echo $footer;
+    }
+
+    function show_login_form() {
+
+        $loginform =
+            ' <h2>To add the Identi.ca application, you need to log into your Identi.ca account.</h2>'
+            .'<a href="http://identi.ca/">'
+            .'    <img src="http://theme.identi.ca/identica/logo.png" alt="Identi.ca" id="logo"/>'
+            .'</a>'
+            .'<h1 class="pagetitle">Login</h1>'
+            .'<div class="instructions">'
+            .'    <p>Login with your username and password. Don\'t have a username yet?'
+            .'      <a href="http://identi.ca/main/register">Register</a> a new account.'
+            .'    </p>'
+            .'</div>'
+            .'<div id="content">'
+            .'    <form method="post" id="login">'
+            .'      <p>'
+            .'        <label for="nickname">Nickname</label>'
+            .'        <input name="nickname" type="text" class="input_text" id="nickname"/>'
+            .'      </p>'
+            .'      <p>'
+            .'          <label for="password">Password</label>'
+            .'        <input name="password" type="password" class="password" id="password"/>'
+            .'      </p>'
+            .'      <p>'
+            .'        <input type="submit" id="submit" name="submit" class="submit" value="Login"/>'
+            .'      </p>'
+            .'    </form>'
+            .'    <p>'
+            .'      <a href="http://identi.ca/main/recoverpassword">Lost or forgotten password?</a>'
+            .'    </p>'
+            .'</div';
+
+            echo $loginform;
+    }
+
+    function render_notice($notice) {
+
+        global $config;
+
+        $profile = $notice->getProfile();
+        $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
+
+        $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
+
+        # XXX: we need to figure this out better. Is this right?
+        if (strcmp($notice->uri, $noticeurl) != 0 && preg_match('/^http/', $notice->uri)) {
+            $noticeurl = $notice->uri;
+        }
+
+        $html =
+        '<li class="notice_single" id="' . $notice->id . '">'
+        .'<a href="' . $profile->profileurl . '">'
+        .'<img src="';
+
+        if ($avatar) {
+            $html .= common_avatar_display_url($avatar);
+        } else {
+            $html .= common_default_avatar(AVATAR_STREAM_SIZE);
+        }
+
+        $html .=
+        '" class="avatar stream" width="'
+        . AVATAR_STREAM_SIZE . '" height="' . AVATAR_STREAM_SIZE .'"'
+        .' alt="';
+
+        if ($profile->fullname) {
+            $html .= $profile->fullname;
+        } else {
+            $html .= $profile->nickname;
+        }
+
+        $html .=
+        '"></a>'
+        .'<a href="' .    $profile->profileurl . '" class="nickname">' . $profile->nickname . '</a>'
+        .'<p class="content">' . $notice->rendered . '</p>'
+        .'<p class="time">'
+        .'<a class="permalink" href="' . $noticeurl . '" title="' . common_exact_date($notice->created) . '">' . common_date_string($notice->created) . '</a>';
+
+        if ($notice->source) {
+            $html .= _(' from ');
+            $html .= $this->source_link($notice->source);
+        }
+
+        if ($notice->reply_to) {
+            $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to));
+            $html .=
+            ' (<a class="inreplyto" href="' . $replyurl . '">' . _('in reply to...') . ')';
+        }
+
+        $html .= '</p></li>';
+
+        return $html;
+    }
+
+    function source_link($source) {
+        $source_name = _($source);
+
+        $html = '<span class="noticesource">';
+
+        switch ($source) {
+         case 'web':
+         case 'xmpp':
+         case 'mail':
+         case 'omb':
+         case 'api':
+            $html .= $source_name;
+            break;
+         default:
+            $ns = Notice_source::staticGet($source);
+            if ($ns) {
+                $html .= '<a href="' . $ns->url . '">' . $ns->name . '</a>';
+            } else {
+                $html .= $source_name;
+            }
+            break;
+        }
+
+        $html .= '</span>';
+
+        return $html;
+    }
+
+    function pagination($have_before, $have_after, $page, $fbaction, $args=NULL) {
+
+        $html = '';
+
+        if ($have_before || $have_after) {
+            $html = '<div id="pagination">';
+            $html .'<ul id="nav_pagination">';
+        }
+
+        if ($have_before) {
+            $pargs = array('page' => $page-1);
+            $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
+            $html .= '<li class="before">';
+            $html .'<a href="' . $this->pagination_url($fbaction, $newargs) . '">' . _('« After') . '</a>';
+            $html .'</li>';
+        }
+
+        if ($have_after) {
+            $pargs = array('page' => $page+1);
+            $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
+            $html .= '<li class="after">';
+            $html .'<a href="' . $this->pagination_url($fbaction, $newargs) . '">' . _('Before Â»') . '</a>';
+            $html .'</li>';
+        }
+
+        if ($have_before || $have_after) {
+            $html .= '<ul>';
+            $html .'<div>';
+        }
+    }
+
+    function pagination_url($fbaction, $args=NULL) {
+        global $config;
+
+        $extra = '';
+
+        if ($args) {
+            foreach ($args as $key => $value) {
+                $extra .= "&${key}=${value}";
+            }
+        }
+
+        return "$fbaction?${extra}";
+    }
 
 }
index d7f9c9ff1b91b9959aafa8365612ce09fb15e022..aa705be30dbf6558ad6af696e411f284e9cb6bec 100644 (file)
@@ -23,122 +23,122 @@ require_once(INSTALLDIR.'/lib/omb.php');
 
 class LaconicaOAuthDataStore extends OAuthDataStore {
 
-       # We keep a record of who's contacted us
+    # We keep a record of who's contacted us
 
-       function lookup_consumer($consumer_key) {
-               $con = Consumer::staticGet('consumer_key', $consumer_key);
-               if (!$con) {
-                       $con = new Consumer();
-                       $con->consumer_key = $consumer_key;
-                       $con->seed = common_good_rand(16);
-                       $con->created = DB_DataObject_Cast::dateTime();
-                       if (!$con->insert()) {
-                               return NULL;
-                       }
-               }
-               return new OAuthConsumer($con->consumer_key, '');
-       }
+    function lookup_consumer($consumer_key) {
+        $con = Consumer::staticGet('consumer_key', $consumer_key);
+        if (!$con) {
+            $con = new Consumer();
+            $con->consumer_key = $consumer_key;
+            $con->seed = common_good_rand(16);
+            $con->created = DB_DataObject_Cast::dateTime();
+            if (!$con->insert()) {
+                return NULL;
+            }
+        }
+        return new OAuthConsumer($con->consumer_key, '');
+    }
 
-       function lookup_token($consumer, $token_type, $token_key) {
-               $t = new Token();
-               $t->consumer_key = $consumer->key;
-               $t->tok = $token_key;
-               $t->type = ($token_type == 'access') ? 1 : 0;
-               if ($t->find(true)) {
-                       return new OAuthToken($t->tok, $t->secret);
-               } else {
-                       return NULL;
-               }
-       }
+    function lookup_token($consumer, $token_type, $token_key) {
+        $t = new Token();
+        $t->consumer_key = $consumer->key;
+        $t->tok = $token_key;
+        $t->type = ($token_type == 'access') ? 1 : 0;
+        if ($t->find(true)) {
+            return new OAuthToken($t->tok, $t->secret);
+        } else {
+            return NULL;
+        }
+    }
 
-       function lookup_nonce($consumer, $token, $nonce, $timestamp) {
-               $n = new Nonce();
-               $n->consumer_key = $consumer->key;
-               $n->tok = $token->key;
-               $n->nonce = $nonce;
-               if ($n->find(TRUE)) {
-                       return TRUE;
-               } else {
-                       $n->timestamp = $timestamp;
-                       $n->created = DB_DataObject_Cast::dateTime();
-                       $n->insert();
-                       return FALSE;
-               }
-       }
+    function lookup_nonce($consumer, $token, $nonce, $timestamp) {
+        $n = new Nonce();
+        $n->consumer_key = $consumer->key;
+        $n->tok = $token->key;
+        $n->nonce = $nonce;
+        if ($n->find(TRUE)) {
+            return TRUE;
+        } else {
+            $n->timestamp = $timestamp;
+            $n->created = DB_DataObject_Cast::dateTime();
+            $n->insert();
+            return FALSE;
+        }
+    }
 
-       function new_request_token($consumer) {
-               $t = new Token();
-               $t->consumer_key = $consumer->key;
-               $t->tok = common_good_rand(16);
-               $t->secret = common_good_rand(16);
-               $t->type = 0; # request
-               $t->state = 0; # unauthorized
-               $t->created = DB_DataObject_Cast::dateTime();
-               if (!$t->insert()) {
-                       return NULL;
-               } else {
-                       return new OAuthToken($t->tok, $t->secret);
-               }
-       }
+    function new_request_token($consumer) {
+        $t = new Token();
+        $t->consumer_key = $consumer->key;
+        $t->tok = common_good_rand(16);
+        $t->secret = common_good_rand(16);
+        $t->type = 0; # request
+        $t->state = 0; # unauthorized
+        $t->created = DB_DataObject_Cast::dateTime();
+        if (!$t->insert()) {
+            return NULL;
+        } else {
+            return new OAuthToken($t->tok, $t->secret);
+        }
+    }
 
-       # defined in OAuthDataStore, but not implemented anywhere
+    # defined in OAuthDataStore, but not implemented anywhere
 
-       function fetch_request_token($consumer) {
-               return $this->new_request_token($consumer);
-       }
+    function fetch_request_token($consumer) {
+        return $this->new_request_token($consumer);
+    }
 
-       function new_access_token($token, $consumer) {
-               common_debug('new_access_token("'.$token->key.'","'.$consumer->key.'")', __FILE__);
-               $rt = new Token();
-               $rt->consumer_key = $consumer->key;
-               $rt->tok = $token->key;
-               $rt->type = 0; # request
-               if ($rt->find(TRUE) && $rt->state == 1) { # authorized
-                       common_debug('request token found.', __FILE__);
-                       $at = new Token();
-                       $at->consumer_key = $consumer->key;
-                       $at->tok = common_good_rand(16);
-                       $at->secret = common_good_rand(16);
-                       $at->type = 1; # access
-                       $at->created = DB_DataObject_Cast::dateTime();
-                       if (!$at->insert()) {
-                               $e = $at->_lastError;
-                               common_debug('access token "'.$at->tok.'" not inserted: "'.$e->message.'"', __FILE__);
-                               return NULL;
-                       } else {
-                               common_debug('access token "'.$at->tok.'" inserted', __FILE__);
-                               # burn the old one
-                               $orig_rt = clone($rt);
-                               $rt->state = 2; # used
-                               if (!$rt->update($orig_rt)) {
-                                       return NULL;
-                               }
-                               common_debug('request token "'.$rt->tok.'" updated', __FILE__);
-                               # Update subscription
-                               # XXX: mixing levels here
-                               $sub = Subscription::staticGet('token', $rt->tok);
-                               if (!$sub) {
-                                       return NULL;
-                               }
-                               common_debug('subscription for request token found', __FILE__);
-                               $orig_sub = clone($sub);
-                               $sub->token = $at->tok;
-                               $sub->secret = $at->secret;
-                               if (!$sub->update($orig_sub)) {
-                                       return NULL;
-                               } else {
-                                       common_debug('subscription updated to use access token', __FILE__);
-                                       return new OAuthToken($at->tok, $at->secret);
-                               }
-                       }
-               } else {
-                       return NULL;
-               }
-       }
+    function new_access_token($token, $consumer) {
+        common_debug('new_access_token("'.$token->key.'","'.$consumer->key.'")', __FILE__);
+        $rt = new Token();
+        $rt->consumer_key = $consumer->key;
+        $rt->tok = $token->key;
+        $rt->type = 0; # request
+        if ($rt->find(TRUE) && $rt->state == 1) { # authorized
+            common_debug('request token found.', __FILE__);
+            $at = new Token();
+            $at->consumer_key = $consumer->key;
+            $at->tok = common_good_rand(16);
+            $at->secret = common_good_rand(16);
+            $at->type = 1; # access
+            $at->created = DB_DataObject_Cast::dateTime();
+            if (!$at->insert()) {
+                $e = $at->_lastError;
+                common_debug('access token "'.$at->tok.'" not inserted: "'.$e->message.'"', __FILE__);
+                return NULL;
+            } else {
+                common_debug('access token "'.$at->tok.'" inserted', __FILE__);
+                # burn the old one
+                $orig_rt = clone($rt);
+                $rt->state = 2; # used
+                if (!$rt->update($orig_rt)) {
+                    return NULL;
+                }
+                common_debug('request token "'.$rt->tok.'" updated', __FILE__);
+                # Update subscription
+                # XXX: mixing levels here
+                $sub = Subscription::staticGet('token', $rt->tok);
+                if (!$sub) {
+                    return NULL;
+                }
+                common_debug('subscription for request token found', __FILE__);
+                $orig_sub = clone($sub);
+                $sub->token = $at->tok;
+                $sub->secret = $at->secret;
+                if (!$sub->update($orig_sub)) {
+                    return NULL;
+                } else {
+                    common_debug('subscription updated to use access token', __FILE__);
+                    return new OAuthToken($at->tok, $at->secret);
+                }
+            }
+        } else {
+            return NULL;
+        }
+    }
 
-       # defined in OAuthDataStore, but not implemented anywhere
+    # defined in OAuthDataStore, but not implemented anywhere
 
-       function fetch_access_token($consumer) {
-               return $this->new_access_token($consumer);
-       }
+    function fetch_access_token($consumer) {
+        return $this->new_access_token($consumer);
+    }
 }
index 96736b4d47918bd11a25a3092cabfac838695864..94ccc2ecd2b1aceee4d8a5cf3ea3b5e59718bd33 100644 (file)
@@ -44,256 +44,256 @@ define('OAUTH_POST_BODY', OAUTH_NAMESPACE.'parameters/post-body');
 define('OAUTH_HMAC_SHA1', OAUTH_NAMESPACE.'signature/HMAC-SHA1');
 
 function omb_oauth_consumer() {
-       static $con = NULL;
-       if (!$con) {
-               $con = new OAuthConsumer(common_root_url(), '');
-       }
-       return $con;
+    static $con = NULL;
+    if (!$con) {
+        $con = new OAuthConsumer(common_root_url(), '');
+    }
+    return $con;
 }
 
 function omb_oauth_server() {
-       static $server = null;
-       if (!$server) {
-               $server = new OAuthServer(omb_oauth_datastore());
-               $server->add_signature_method(omb_hmac_sha1());
-       }
-       return $server;
+    static $server = null;
+    if (!$server) {
+        $server = new OAuthServer(omb_oauth_datastore());
+        $server->add_signature_method(omb_hmac_sha1());
+    }
+    return $server;
 }
 
 function omb_oauth_datastore() {
-       static $store = NULL;
-       if (!$store) {
-               $store = new LaconicaOAuthDataStore();
-       }
-       return $store;
+    static $store = NULL;
+    if (!$store) {
+        $store = new LaconicaOAuthDataStore();
+    }
+    return $store;
 }
 
 function omb_hmac_sha1() {
-       static $hmac_method = NULL;
-       if (!$hmac_method) {
-               $hmac_method = new OAuthSignatureMethod_HMAC_SHA1();
-       }
-       return $hmac_method;
+    static $hmac_method = NULL;
+    if (!$hmac_method) {
+        $hmac_method = new OAuthSignatureMethod_HMAC_SHA1();
+    }
+    return $hmac_method;
 }
 
 function omb_get_services($xrd, $type) {
-       return $xrd->services(array(omb_service_filter($type)));
+    return $xrd->services(array(omb_service_filter($type)));
 }
 
 function omb_service_filter($type) {
-       return create_function('$s',
-                                                  'return omb_match_service($s, \''.$type.'\');');
+    return create_function('$s',
+                           'return omb_match_service($s, \''.$type.'\');');
 }
 
 function omb_match_service($service, $type) {
-       return in_array($type, $service->getTypes());
+    return in_array($type, $service->getTypes());
 }
 
 function omb_service_uri($service) {
-       if (!$service) {
-               return NULL;
-       }
-       $uris = $service->getURIs();
-       if (!$uris) {
-               return NULL;
-       }
-       return $uris[0];
+    if (!$service) {
+        return NULL;
+    }
+    $uris = $service->getURIs();
+    if (!$uris) {
+        return NULL;
+    }
+    return $uris[0];
 }
 
 function omb_local_id($service) {
-       if (!$service) {
-               return NULL;
-       }
-       $els = $service->getElements('xrd:LocalID');
-       if (!$els) {
-               return NULL;
-       }
-       $el = $els[0];
-       return $service->parser->content($el);
+    if (!$service) {
+        return NULL;
+    }
+    $els = $service->getElements('xrd:LocalID');
+    if (!$els) {
+        return NULL;
+    }
+    $el = $els[0];
+    return $service->parser->content($el);
 }
 
 function omb_broadcast_remote_subscribers($notice) {
 
-       # First, get remote users subscribed to this profile
-       $rp = new Remote_profile();
+    # First, get remote users subscribed to this profile
+    $rp = new Remote_profile();
 
-       $rp->query('SELECT postnoticeurl, token, secret ' .
-                          'FROM subscription JOIN remote_profile ' .
-                          'ON subscription.subscriber = remote_profile.id ' .
-                          'WHERE subscription.subscribed = ' . $notice->profile_id . ' ');
+    $rp->query('SELECT postnoticeurl, token, secret ' .
+               'FROM subscription JOIN remote_profile ' .
+               'ON subscription.subscriber = remote_profile.id ' .
+               'WHERE subscription.subscribed = ' . $notice->profile_id . ' ');
 
-       $posted = array();
+    $posted = array();
 
-       while ($rp->fetch()) {
-               if (!$posted[$rp->postnoticeurl]) {
-                       common_log(LOG_DEBUG, 'Posting to ' . $rp->postnoticeurl);
-                       if (omb_post_notice_keys($notice, $rp->postnoticeurl, $rp->token, $rp->secret)) {
-                               common_log(LOG_DEBUG, 'Finished to ' . $rp->postnoticeurl);
-                               $posted[$rp->postnoticeurl] = TRUE;
-                       } else {
-                               common_log(LOG_DEBUG, 'Failed posting to ' . $rp->postnoticeurl);
-                       }
-               }
-       }
+    while ($rp->fetch()) {
+        if (!$posted[$rp->postnoticeurl]) {
+            common_log(LOG_DEBUG, 'Posting to ' . $rp->postnoticeurl);
+            if (omb_post_notice_keys($notice, $rp->postnoticeurl, $rp->token, $rp->secret)) {
+                common_log(LOG_DEBUG, 'Finished to ' . $rp->postnoticeurl);
+                $posted[$rp->postnoticeurl] = TRUE;
+            } else {
+                common_log(LOG_DEBUG, 'Failed posting to ' . $rp->postnoticeurl);
+            }
+        }
+    }
 
-       $rp->free();
-       unset($rp);
+    $rp->free();
+    unset($rp);
 
-       return true;
+    return true;
 }
 
 function omb_post_notice($notice, $remote_profile, $subscription) {
-       return omb_post_notice_keys($notice, $remote_profile->postnoticeurl, $subscription->token, $subscription->secret);
+    return omb_post_notice_keys($notice, $remote_profile->postnoticeurl, $subscription->token, $subscription->secret);
 }
 
 function omb_post_notice_keys($notice, $postnoticeurl, $tk, $secret) {
 
-       common_debug('Posting notice ' . $notice->id . ' to ' . $postnoticeurl, __FILE__);
+    common_debug('Posting notice ' . $notice->id . ' to ' . $postnoticeurl, __FILE__);
 
-       $user = User::staticGet('id', $notice->profile_id);
+    $user = User::staticGet('id', $notice->profile_id);
 
-       if (!$user) {
-               common_debug('Failed to get user for notice ' . $notice->id . ', profile = ' . $notice->profile_id, __FILE__);
-               return false;
-       }
+    if (!$user) {
+        common_debug('Failed to get user for notice ' . $notice->id . ', profile = ' . $notice->profile_id, __FILE__);
+        return false;
+    }
 
-       $con = omb_oauth_consumer();
+    $con = omb_oauth_consumer();
 
-       $token = new OAuthToken($tk, $secret);
+    $token = new OAuthToken($tk, $secret);
 
-       $url = $postnoticeurl;
-       $parsed = parse_url($url);
-       $params = array();
-       parse_str($parsed['query'], $params);
+    $url = $postnoticeurl;
+    $parsed = parse_url($url);
+    $params = array();
+    parse_str($parsed['query'], $params);
 
-       $req = OAuthRequest::from_consumer_and_token($con, $token,
-                                                                                                'POST', $url, $params);
+    $req = OAuthRequest::from_consumer_and_token($con, $token,
+                                                 'POST', $url, $params);
 
-       $req->set_parameter('omb_version', OMB_VERSION_01);
-       $req->set_parameter('omb_listenee', $user->uri);
-       $req->set_parameter('omb_notice', $notice->uri);
-       $req->set_parameter('omb_notice_content', $notice->content);
-       $req->set_parameter('omb_notice_url', common_local_url('shownotice',
-                                                                                                                  array('notice' =>
-                                                                                                                                $notice->id)));
-       $req->set_parameter('omb_notice_license', common_config('license', 'url'));
+    $req->set_parameter('omb_version', OMB_VERSION_01);
+    $req->set_parameter('omb_listenee', $user->uri);
+    $req->set_parameter('omb_notice', $notice->uri);
+    $req->set_parameter('omb_notice_content', $notice->content);
+    $req->set_parameter('omb_notice_url', common_local_url('shownotice',
+                                                           array('notice' =>
+                                                                 $notice->id)));
+    $req->set_parameter('omb_notice_license', common_config('license', 'url'));
 
-       $user->free();
-       unset($user);
+    $user->free();
+    unset($user);
 
-       $req->sign_request(omb_hmac_sha1(), $con, $token);
+    $req->sign_request(omb_hmac_sha1(), $con, $token);
 
-       # We re-use this tool's fetcher, since it's pretty good
+    # We re-use this tool's fetcher, since it's pretty good
 
-       $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+    $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
 
-       if (!$fetcher) {
-               common_log(LOG_WARNING, 'Failed to initialize Yadis fetcher.', __FILE__);
-               return false;
-       }
+    if (!$fetcher) {
+        common_log(LOG_WARNING, 'Failed to initialize Yadis fetcher.', __FILE__);
+        return false;
+    }
 
-       $result = $fetcher->post($req->get_normalized_http_url(),
-                                                        $req->to_postdata(),
+    $result = $fetcher->post($req->get_normalized_http_url(),
+                             $req->to_postdata(),
                              array('User-Agent' => 'Laconica/' . LACONICA_VERSION));
 
-       common_debug('Got HTTP result "'.print_r($result,TRUE).'"', __FILE__);
-
-       if ($result->status == 403) { # not authorized, don't send again
-               common_debug('403 result, deleting subscription', __FILE__);
-               # FIXME: figure out how to delete this
-               # $subscription->delete();
-               return false;
-       } else if ($result->status != 200) {
-               common_debug('Error status '.$result->status, __FILE__);
-               return false;
-       } else { # success!
-               parse_str($result->body, $return);
-               if ($return['omb_version'] == OMB_VERSION_01) {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
+    common_debug('Got HTTP result "'.print_r($result,TRUE).'"', __FILE__);
+
+    if ($result->status == 403) { # not authorized, don't send again
+        common_debug('403 result, deleting subscription', __FILE__);
+        # FIXME: figure out how to delete this
+        # $subscription->delete();
+        return false;
+    } else if ($result->status != 200) {
+        common_debug('Error status '.$result->status, __FILE__);
+        return false;
+    } else { # success!
+        parse_str($result->body, $return);
+        if ($return['omb_version'] == OMB_VERSION_01) {
+            return true;
+        } else {
+            return false;
+        }
+    }
 }
 
 function omb_broadcast_profile($profile) {
-       # First, get remote users subscribed to this profile
-       # XXX: use a join here rather than looping through results
-       $sub = new Subscription();
-       $sub->subscribed = $profile->id;
-       if ($sub->find()) {
-               $updated = array();
-               while ($sub->fetch()) {
-                       $rp = Remote_profile::staticGet('id', $sub->subscriber);
-                       if ($rp) {
-                               if (!$updated[$rp->updateprofileurl]) {
-                                       if (omb_update_profile($profile, $rp, $sub)) {
-                                               $updated[$rp->updateprofileurl] = TRUE;
-                                       }
-                               }
-                       }
-               }
-       }
+    # First, get remote users subscribed to this profile
+    # XXX: use a join here rather than looping through results
+    $sub = new Subscription();
+    $sub->subscribed = $profile->id;
+    if ($sub->find()) {
+        $updated = array();
+        while ($sub->fetch()) {
+            $rp = Remote_profile::staticGet('id', $sub->subscriber);
+            if ($rp) {
+                if (!$updated[$rp->updateprofileurl]) {
+                    if (omb_update_profile($profile, $rp, $sub)) {
+                        $updated[$rp->updateprofileurl] = TRUE;
+                    }
+                }
+            }
+        }
+    }
 }
 
 function omb_update_profile($profile, $remote_profile, $subscription) {
-       global $config; # for license URL
-       $user = User::staticGet($profile->id);
-       $con = omb_oauth_consumer();
-       $token = new OAuthToken($subscription->token, $subscription->secret);
-       $url = $remote_profile->updateprofileurl;
-       $parsed = parse_url($url);
-       $params = array();
-       parse_str($parsed['query'], $params);
-       $req = OAuthRequest::from_consumer_and_token($con, $token,
-                                                                                                "POST", $url, $params);
-       $req->set_parameter('omb_version', OMB_VERSION_01);
-       $req->set_parameter('omb_listenee', $user->uri);
-       $req->set_parameter('omb_listenee_profile', common_profile_url($profile->nickname));
-       $req->set_parameter('omb_listenee_nickname', $profile->nickname);
-
-       # We use blanks to force emptying any existing values in these optional fields
-
-       $req->set_parameter('omb_listenee_fullname',
-                                               ($profile->fullname) ? $profile->fullname : '');
-       $req->set_parameter('omb_listenee_homepage',
-                                               ($profile->homepage) ? $profile->homepage : '');
-       $req->set_parameter('omb_listenee_bio',
-                                               ($profile->bio) ? $profile->bio : '');
-       $req->set_parameter('omb_listenee_location',
-                                               ($profile->location) ? $profile->location : '');
-
-       $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-       $req->set_parameter('omb_listenee_avatar',
-                                               ($avatar) ? $avatar->url : '');
-
-       $req->sign_request(omb_hmac_sha1(), $con, $token);
-
-       # We re-use this tool's fetcher, since it's pretty good
-
-       $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
-
-       common_debug('request URL = '.$req->get_normalized_http_url(), __FILE__);
-       common_debug('postdata = '.$req->to_postdata(), __FILE__);
-       $result = $fetcher->post($req->get_normalized_http_url(),
-                                                        $req->to_postdata(),
+    global $config; # for license URL
+    $user = User::staticGet($profile->id);
+    $con = omb_oauth_consumer();
+    $token = new OAuthToken($subscription->token, $subscription->secret);
+    $url = $remote_profile->updateprofileurl;
+    $parsed = parse_url($url);
+    $params = array();
+    parse_str($parsed['query'], $params);
+    $req = OAuthRequest::from_consumer_and_token($con, $token,
+                                                 "POST", $url, $params);
+    $req->set_parameter('omb_version', OMB_VERSION_01);
+    $req->set_parameter('omb_listenee', $user->uri);
+    $req->set_parameter('omb_listenee_profile', common_profile_url($profile->nickname));
+    $req->set_parameter('omb_listenee_nickname', $profile->nickname);
+
+    # We use blanks to force emptying any existing values in these optional fields
+
+    $req->set_parameter('omb_listenee_fullname',
+                        ($profile->fullname) ? $profile->fullname : '');
+    $req->set_parameter('omb_listenee_homepage',
+                        ($profile->homepage) ? $profile->homepage : '');
+    $req->set_parameter('omb_listenee_bio',
+                        ($profile->bio) ? $profile->bio : '');
+    $req->set_parameter('omb_listenee_location',
+                        ($profile->location) ? $profile->location : '');
+
+    $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+    $req->set_parameter('omb_listenee_avatar',
+                        ($avatar) ? $avatar->url : '');
+
+    $req->sign_request(omb_hmac_sha1(), $con, $token);
+
+    # We re-use this tool's fetcher, since it's pretty good
+
+    $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+
+    common_debug('request URL = '.$req->get_normalized_http_url(), __FILE__);
+    common_debug('postdata = '.$req->to_postdata(), __FILE__);
+    $result = $fetcher->post($req->get_normalized_http_url(),
+                             $req->to_postdata(),
                              array('User-Agent' => 'Laconica/' . LACONICA_VERSION));
 
-       common_debug('Got HTTP result "'.print_r($result,TRUE).'"', __FILE__);
-
-       if ($result->status == 403) { # not authorized, don't send again
-               common_debug('403 result, deleting subscription', __FILE__);
-               $subscription->delete();
-               return false;
-       } else if ($result->status != 200) {
-               common_debug('Error status '.$result->status, __FILE__);
-               return false;
-       } else { # success!
-               parse_str($result->body, $return);
-               if ($return['omb_version'] == OMB_VERSION_01) {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
+    common_debug('Got HTTP result "'.print_r($result,TRUE).'"', __FILE__);
+
+    if ($result->status == 403) { # not authorized, don't send again
+        common_debug('403 result, deleting subscription', __FILE__);
+        $subscription->delete();
+        return false;
+    } else if ($result->status != 200) {
+        common_debug('Error status '.$result->status, __FILE__);
+        return false;
+    } else { # success!
+        parse_str($result->body, $return);
+        if ($return['omb_version'] == OMB_VERSION_01) {
+            return true;
+        } else {
+            return false;
+        }
+    }
 }
index 6e501c2b10727211cf64d4ee8a7eabb07c55772c..ebc5ed168dc70235f844ba053f312336bf98a905 100644 (file)
@@ -33,210 +33,210 @@ define('OPENID_COOKIE_KEY', 'lastusedopenid');
 
 function oid_store() {
     static $store = NULL;
-       if (!$store) {
-               # Can't be called statically
-               $user = new User();
-               $conn = $user->getDatabaseConnection();
-               $store = new Auth_OpenID_MySQLStore($conn);
-       }
-       return $store;
+    if (!$store) {
+        # Can't be called statically
+        $user = new User();
+        $conn = $user->getDatabaseConnection();
+        $store = new Auth_OpenID_MySQLStore($conn);
+    }
+    return $store;
 }
 
 function oid_consumer() {
-       $store = oid_store();
-       $consumer = new Auth_OpenID_Consumer($store);
-       return $consumer;
+    $store = oid_store();
+    $consumer = new Auth_OpenID_Consumer($store);
+    return $consumer;
 }
 
 function oid_clear_last() {
-       oid_set_last('');
+    oid_set_last('');
 }
 
 function oid_set_last($openid_url) {
-       common_set_cookie(OPENID_COOKIE_KEY,
-                                $openid_url,
-                                time() + OPENID_COOKIE_EXPIRY);
+    common_set_cookie(OPENID_COOKIE_KEY,
+                     $openid_url,
+                     time() + OPENID_COOKIE_EXPIRY);
 }
 
 function oid_get_last() {
-       $openid_url = $_COOKIE[OPENID_COOKIE_KEY];
-       if ($openid_url && strlen($openid_url) > 0) {
-               return $openid_url;
-       } else {
-               return NULL;
-       }
+    $openid_url = $_COOKIE[OPENID_COOKIE_KEY];
+    if ($openid_url && strlen($openid_url) > 0) {
+        return $openid_url;
+    } else {
+        return NULL;
+    }
 }
 
 function oid_link_user($id, $canonical, $display) {
 
-       $oid = new User_openid();
-       $oid->user_id = $id;
-       $oid->canonical = $canonical;
-       $oid->display = $display;
-       $oid->created = DB_DataObject_Cast::dateTime();
+    $oid = new User_openid();
+    $oid->user_id = $id;
+    $oid->canonical = $canonical;
+    $oid->display = $display;
+    $oid->created = DB_DataObject_Cast::dateTime();
 
-       if (!$oid->insert()) {
-               $err = PEAR::getStaticProperty('DB_DataObject','lastError');
-               common_debug('DB error ' . $err->code . ': ' . $err->message, __FILE__);
-               return false;
-       }
+    if (!$oid->insert()) {
+        $err = PEAR::getStaticProperty('DB_DataObject','lastError');
+        common_debug('DB error ' . $err->code . ': ' . $err->message, __FILE__);
+        return false;
+    }
 
-       return true;
+    return true;
 }
 
 function oid_get_user($openid_url) {
-       $user = NULL;
-       $oid = User_openid::staticGet('canonical', $openid_url);
-       if ($oid) {
-               $user = User::staticGet('id', $oid->user_id);
-       }
-       return $user;
+    $user = NULL;
+    $oid = User_openid::staticGet('canonical', $openid_url);
+    if ($oid) {
+        $user = User::staticGet('id', $oid->user_id);
+    }
+    return $user;
 }
 
 function oid_check_immediate($openid_url, $backto=NULL) {
-       if (!$backto) {
-               $action = $_REQUEST['action'];
-               $args = common_copy_args($_GET);
-               unset($args['action']);
-               $backto = common_local_url($action, $args);
-       }
-       common_debug('going back to "' . $backto . '"', __FILE__);
-
-       common_ensure_session();
-
-       $_SESSION['openid_immediate_backto'] = $backto;
-       common_debug('passed-in variable is "' . $backto . '"', __FILE__);
-       common_debug('session variable is "' . $_SESSION['openid_immediate_backto'] . '"', __FILE__);
-
-       oid_authenticate($openid_url,
-                                        'finishimmediate',
-                                        true);
+    if (!$backto) {
+        $action = $_REQUEST['action'];
+        $args = common_copy_args($_GET);
+        unset($args['action']);
+        $backto = common_local_url($action, $args);
+    }
+    common_debug('going back to "' . $backto . '"', __FILE__);
+
+    common_ensure_session();
+
+    $_SESSION['openid_immediate_backto'] = $backto;
+    common_debug('passed-in variable is "' . $backto . '"', __FILE__);
+    common_debug('session variable is "' . $_SESSION['openid_immediate_backto'] . '"', __FILE__);
+
+    oid_authenticate($openid_url,
+                     'finishimmediate',
+                     true);
 }
 
 function oid_authenticate($openid_url, $returnto, $immediate=false) {
 
-       $consumer = oid_consumer();
-
-       if (!$consumer) {
-               common_server_error(_('Cannot instantiate OpenID consumer object.'));
-               return false;
-       }
-
-       common_ensure_session();
-
-       $auth_request = $consumer->begin($openid_url);
-
-       // Handle failure status return values.
-       if (!$auth_request) {
-               return _('Not a valid OpenID.');
-       } else if (Auth_OpenID::isFailure($auth_request)) {
-               return sprintf(_('OpenID failure: %s'), $auth_request->message);
-       }
-
-       $sreg_request = Auth_OpenID_SRegRequest::build(// Required
-                                                                                                  array(),
-                                                                                                  // Optional
-                                                                                                  array('nickname',
-                                                                                                                'email',
-                                                                                                                'fullname',
-                                                                                                                'language',
-                                                                                                                'timezone',
-                                                                                                                'postcode',
-                                                                                                                'country'));
-
-       if ($sreg_request) {
-               $auth_request->addExtension($sreg_request);
-       }
-
-       $trust_root = common_local_url('public');
-       $process_url = common_local_url($returnto);
-
-       if ($auth_request->shouldSendRedirect()) {
-               $redirect_url = $auth_request->redirectURL($trust_root,
-                                                                                                  $process_url,
-                                                                                                  $immediate);
-               if (!$redirect_url) {
-               } else if (Auth_OpenID::isFailure($redirect_url)) {
-                       return sprintf(_('Could not redirect to server: %s'), $redirect_url->message);
-               } else {
-                       common_redirect($redirect_url);
-               }
-       } else {
-               // Generate form markup and render it.
-               $form_id = 'openid_message';
-               $form_html = $auth_request->formMarkup($trust_root, $process_url,
-                                                                                          $immediate, array('id' => $form_id));
-
-               # XXX: This is cheap, but things choke if we don't escape ampersands
-               # in the HTML attributes
-
-               $form_html = preg_replace('/&/', '&amp;', $form_html);
-
-               // Display an error if the form markup couldn't be generated;
-               // otherwise, render the HTML.
-               if (Auth_OpenID::isFailure($form_html)) {
-                       $this->show_form(sprintf(_('Could not create OpenID form: %s'), $form_html->message));
-               } else {
-                       common_show_header(_('OpenID Auto-Submit'), NULL, NULL, '_oid_print_instructions');
-                       common_raw($form_html);
-                       common_element('script', NULL,
-                                                  '$(document).ready(function() { ' .
-                                                  '    $("#'. $form_id .'").submit(); '.
-                                                  '});');
-                       common_show_footer();
-               }
-       }
+    $consumer = oid_consumer();
+
+    if (!$consumer) {
+        common_server_error(_('Cannot instantiate OpenID consumer object.'));
+        return false;
+    }
+
+    common_ensure_session();
+
+    $auth_request = $consumer->begin($openid_url);
+
+    // Handle failure status return values.
+    if (!$auth_request) {
+        return _('Not a valid OpenID.');
+    } else if (Auth_OpenID::isFailure($auth_request)) {
+        return sprintf(_('OpenID failure: %s'), $auth_request->message);
+    }
+
+    $sreg_request = Auth_OpenID_SRegRequest::build(// Required
+                                                   array(),
+                                                   // Optional
+                                                   array('nickname',
+                                                         'email',
+                                                         'fullname',
+                                                         'language',
+                                                         'timezone',
+                                                         'postcode',
+                                                         'country'));
+
+    if ($sreg_request) {
+        $auth_request->addExtension($sreg_request);
+    }
+
+    $trust_root = common_local_url('public');
+    $process_url = common_local_url($returnto);
+
+    if ($auth_request->shouldSendRedirect()) {
+        $redirect_url = $auth_request->redirectURL($trust_root,
+                                                   $process_url,
+                                                   $immediate);
+        if (!$redirect_url) {
+        } else if (Auth_OpenID::isFailure($redirect_url)) {
+            return sprintf(_('Could not redirect to server: %s'), $redirect_url->message);
+        } else {
+            common_redirect($redirect_url);
+        }
+    } else {
+        // Generate form markup and render it.
+        $form_id = 'openid_message';
+        $form_html = $auth_request->formMarkup($trust_root, $process_url,
+                                               $immediate, array('id' => $form_id));
+
+        # XXX: This is cheap, but things choke if we don't escape ampersands
+        # in the HTML attributes
+
+        $form_html = preg_replace('/&/', '&amp;', $form_html);
+
+        // Display an error if the form markup couldn't be generated;
+        // otherwise, render the HTML.
+        if (Auth_OpenID::isFailure($form_html)) {
+            $this->show_form(sprintf(_('Could not create OpenID form: %s'), $form_html->message));
+        } else {
+            common_show_header(_('OpenID Auto-Submit'), NULL, NULL, '_oid_print_instructions');
+            common_raw($form_html);
+            common_element('script', NULL,
+                           '$(document).ready(function() { ' .
+                           '    $("#'. $form_id .'").submit(); '.
+                           '});');
+            common_show_footer();
+        }
+    }
 }
 
 # Half-assed attempt at a module-private function
 
 function _oid_print_instructions() {
-       common_element('div', 'instructions',
-                                  _('This form should automatically submit itself. '.
-                                         'If not, click the submit button to go to your '.
-                                         'OpenID provider.'));
+    common_element('div', 'instructions',
+                   _('This form should automatically submit itself. '.
+                      'If not, click the submit button to go to your '.
+                      'OpenID provider.'));
 }
 
 # update a user from sreg parameters
 
 function oid_update_user(&$user, &$sreg) {
 
-       $profile = $user->getProfile();
+    $profile = $user->getProfile();
 
-       $orig_profile = clone($profile);
+    $orig_profile = clone($profile);
 
-       if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
-               $profile->fullname = $sreg['fullname'];
-       }
+    if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
+        $profile->fullname = $sreg['fullname'];
+    }
 
-       if ($sreg['country']) {
-               if ($sreg['postcode']) {
-                       # XXX: use postcode to get city and region
-                       # XXX: also, store postcode somewhere -- it's valuable!
-                       $profile->location = $sreg['postcode'] . ', ' . $sreg['country'];
-               } else {
-                       $profile->location = $sreg['country'];
-               }
-       }
+    if ($sreg['country']) {
+        if ($sreg['postcode']) {
+            # XXX: use postcode to get city and region
+            # XXX: also, store postcode somewhere -- it's valuable!
+            $profile->location = $sreg['postcode'] . ', ' . $sreg['country'];
+        } else {
+            $profile->location = $sreg['country'];
+        }
+    }
 
-       # XXX save language if it's passed
-       # XXX save timezone if it's passed
+    # XXX save language if it's passed
+    # XXX save timezone if it's passed
 
-       if (!$profile->update($orig_profile)) {
-               common_server_error(_('Error saving the profile.'));
-               return false;
-       }
+    if (!$profile->update($orig_profile)) {
+        common_server_error(_('Error saving the profile.'));
+        return false;
+    }
 
-       $orig_user = clone($user);
+    $orig_user = clone($user);
 
-       if ($sreg['email'] && Validate::email($sreg['email'], true)) {
-               $user->email = $sreg['email'];
-       }
+    if ($sreg['email'] && Validate::email($sreg['email'], true)) {
+        $user->email = $sreg['email'];
+    }
 
-       if (!$user->update($orig_user)) {
-               common_server_error(_('Error saving the user.'));
-               return false;
-       }
+    if (!$user->update($orig_user)) {
+        common_server_error(_('Error saving the user.'));
+        return false;
+    }
 
-       return true;
+    return true;
 }
index 86433b4867fea94ea4e77f539ea7d81fb2d034ec..1928349a3904013028109baffba068cc66293543 100644 (file)
 if (!defined('LACONICA')) { exit(1); }
 
 class PersonalAction extends Action {
-       
-       function is_readonly() {
-               return true;
-       }
-       
-       function handle($args) {
-               parent::handle($args);
-           common_set_returnto($this->self_url());
-       }
-
-       function views_menu() {
-
-               $user = NULL;
-               $action = $this->trimmed('action');
-               $nickname = $this->trimmed('nickname');
-
-               if ($nickname) {
-                       $user = User::staticGet('nickname', $nickname);
-                       $user_profile = $user->getProfile();
-               } else {
-                       $user_profile = false;
-               }
-
-               common_element_start('ul', array('id' => 'nav_views'));
-
-               common_menu_item(common_local_url('all', array('nickname' =>
-                                                                                                          $nickname)),
-                                                _('Personal'),
-                                                sprintf(_('%s and friends'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
-                                                $action == 'all');
-               common_menu_item(common_local_url('replies', array('nickname' =>
-                                                                                                                         $nickname)),
-                                                _('Replies'),
-                                                sprintf(_('Replies to %s'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
-                                                $action == 'replies');
-               common_menu_item(common_local_url('showstream', array('nickname' =>
-                                                                                                                         $nickname)),
-                                                _('Profile'),
-                                                ($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname,
-                                                $action == 'showstream');
-               common_menu_item(common_local_url('showfavorites', array('nickname' =>
-                                                                                                                         $nickname)),
-                                                _('Favorites'),
-                                                sprintf(_('%s\'s favorite notices'), ($user_profile) ? $user_profile->getBestName() : _('User')),
-                                                $action == 'showfavorites');
-               
-               $cur = common_current_user();
-               
-               if ($cur && $cur->id == $user->id) {
-                       
-                       common_menu_item(common_local_url('inbox', array('nickname' =>
-                                                                                                                                        $nickname)),
-                                                        _('Inbox'),
-                                                        _('Your incoming messages'),
-                                                        $action == 'inbox');
-                       common_menu_item(common_local_url('outbox', array('nickname' =>
-                                                                                                                                        $nickname)),
-                                                        _('Outbox'),
-                                                        _('Your sent messages'),
-                                                        $action == 'outbox');
-               }
-               
-               common_element_end('ul');
-       }
-
-       function show_feeds_list($feeds) {
-               common_element_start('div', array('class' => 'feeds'));
-               common_element('p', null, 'Feeds:');
-               common_element_start('ul', array('class' => 'xoxo'));
-
-               foreach ($feeds as $key => $value) {
-                       $this->common_feed_item($feeds[$key]);
-               }
-               common_element_end('ul');
-               common_element_end('div');
-       }
-
-       function common_feed_item($feed) {
-               $nickname = $this->trimmed('nickname');
-
-               switch($feed['item']) {
-                       case 'notices': default:
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "$nickname's ".$feed['version']." notice feed";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'allrss':
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = $feed['version']." feed for $nickname and friends";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'repliesrss':
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = $feed['version']." feed for replies to $nickname";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'publicrss':
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "Public timeline ".$feed['version']." feed";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'publicatom':
-                               $feed_classname = "atom";
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "Public timeline ".$feed['version']." feed";
-                               $feed['textContent'] = "Atom";
-                               break;
-
-                       case 'tagrss':
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = $feed['version']." feed for this tag";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'favoritedrss':
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "Favorited ".$feed['version']." feed";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'foaf':
-                               $feed_classname = "foaf";
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "$nickname's FOAF file";
-                               $feed['textContent'] = "FOAF";
-                               break;
-
-                       case 'favoritesrss':
-                               $feed_classname = "favorites";
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "Feed for favorites of $nickname";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'usertimeline':
-                               $feed_classname = "atom";
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "$nickname's ".$feed['version']." notice feed";
-                               $feed['textContent'] = "Atom";
-                               break;
-               }
-               common_element_start('li');
-               common_element('a', array('href' => $feed['href'],
-                                                                 'class' => $feed_classname,
-                                                                 'type' => $feed_mimetype,
-                                                                 'title' => $feed_title),
-                                                       $feed['textContent']);
-               common_element_end('li');
-       }
-
-       
-       function source_link($source) {
-               $source_name = _($source);
-               switch ($source) {
-                case 'web':
-                case 'xmpp':
-                case 'mail':
-                case 'omb':
-                case 'api':
-                       common_element('span', 'noticesource', $source_name);
-                       break;
-                default:
-                       $ns = Notice_source::staticGet($source);
-                       if ($ns) {
-                               common_element('a', array('href' => $ns->url),
-                                                          $ns->name);
-                       } else {
-                               common_element('span', 'noticesource', $source_name);
-                       }
-                       break;
-               }
-               return;
-       }
+    
+    function is_readonly() {
+        return true;
+    }
+    
+    function handle($args) {
+        parent::handle($args);
+        common_set_returnto($this->self_url());
+    }
+
+    function views_menu() {
+
+        $user = NULL;
+        $action = $this->trimmed('action');
+        $nickname = $this->trimmed('nickname');
+
+        if ($nickname) {
+            $user = User::staticGet('nickname', $nickname);
+            $user_profile = $user->getProfile();
+        } else {
+            $user_profile = false;
+        }
+
+        common_element_start('ul', array('id' => 'nav_views'));
+
+        common_menu_item(common_local_url('all', array('nickname' =>
+                                                       $nickname)),
+                         _('Personal'),
+                         sprintf(_('%s and friends'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
+                         $action == 'all');
+        common_menu_item(common_local_url('replies', array('nickname' =>
+                                                              $nickname)),
+                         _('Replies'),
+                         sprintf(_('Replies to %s'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
+                         $action == 'replies');
+        common_menu_item(common_local_url('showstream', array('nickname' =>
+                                                              $nickname)),
+                         _('Profile'),
+                         ($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname,
+                         $action == 'showstream');
+        common_menu_item(common_local_url('showfavorites', array('nickname' =>
+                                                              $nickname)),
+                         _('Favorites'),
+                         sprintf(_('%s\'s favorite notices'), ($user_profile) ? $user_profile->getBestName() : _('User')),
+                         $action == 'showfavorites');
+        
+        $cur = common_current_user();
+        
+        if ($cur && $cur->id == $user->id) {
+            
+            common_menu_item(common_local_url('inbox', array('nickname' =>
+                                                                     $nickname)),
+                             _('Inbox'),
+                             _('Your incoming messages'),
+                             $action == 'inbox');
+            common_menu_item(common_local_url('outbox', array('nickname' =>
+                                                                     $nickname)),
+                             _('Outbox'),
+                             _('Your sent messages'),
+                             $action == 'outbox');
+        }
+        
+        common_element_end('ul');
+    }
+
+    function show_feeds_list($feeds) {
+        common_element_start('div', array('class' => 'feeds'));
+        common_element('p', null, 'Feeds:');
+        common_element_start('ul', array('class' => 'xoxo'));
+
+        foreach ($feeds as $key => $value) {
+            $this->common_feed_item($feeds[$key]);
+        }
+        common_element_end('ul');
+        common_element_end('div');
+    }
+
+    function common_feed_item($feed) {
+        $nickname = $this->trimmed('nickname');
+
+        switch($feed['item']) {
+            case 'notices': default:
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "$nickname's ".$feed['version']." notice feed";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'allrss':
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = $feed['version']." feed for $nickname and friends";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'repliesrss':
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = $feed['version']." feed for replies to $nickname";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'publicrss':
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "Public timeline ".$feed['version']." feed";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'publicatom':
+                $feed_classname = "atom";
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "Public timeline ".$feed['version']." feed";
+                $feed['textContent'] = "Atom";
+                break;
+
+            case 'tagrss':
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = $feed['version']." feed for this tag";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'favoritedrss':
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "Favorited ".$feed['version']." feed";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'foaf':
+                $feed_classname = "foaf";
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "$nickname's FOAF file";
+                $feed['textContent'] = "FOAF";
+                break;
+
+            case 'favoritesrss':
+                $feed_classname = "favorites";
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "Feed for favorites of $nickname";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'usertimeline':
+                $feed_classname = "atom";
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "$nickname's ".$feed['version']." notice feed";
+                $feed['textContent'] = "Atom";
+                break;
+        }
+        common_element_start('li');
+        common_element('a', array('href' => $feed['href'],
+                                  'class' => $feed_classname,
+                                  'type' => $feed_mimetype,
+                                  'title' => $feed_title),
+                            $feed['textContent']);
+        common_element_end('li');
+    }
+
+    
+    function source_link($source) {
+        $source_name = _($source);
+        switch ($source) {
+         case 'web':
+         case 'xmpp':
+         case 'mail':
+         case 'omb':
+         case 'api':
+            common_element('span', 'noticesource', $source_name);
+            break;
+         default:
+            $ns = Notice_source::staticGet($source);
+            if ($ns) {
+                common_element('a', array('href' => $ns->url),
+                               $ns->name);
+            } else {
+                common_element('span', 'noticesource', $source_name);
+            }
+            break;
+        }
+        return;
+    }
 }
index 9079ea9d7c64c162d3794c3720b09c884e8c1939..e32c5c25498662d461db6ae5366cf44ea1b71f0b 100644 (file)
@@ -24,138 +24,138 @@ define('PROFILES_PER_PAGE', 20);
 
 class ProfileList {
 
-       var $profile = NULL;
-       var $owner = NULL;
-       var $action = NULL;
-
-       function __construct($profile, $owner=NULL, $action=NULL) {
-               $this->profile = $profile;
-               $this->owner = $owner;
-               $this->action = $action;
-       }
-
-       function show_list() {
-
-               common_element_start('ul', array('id' => 'profiles', 'class' => 'profile_list'));
-
-               $cnt = 0;
-
-               while ($this->profile->fetch()) {
-                       $cnt++;
-                       if($cnt > PROFILES_PER_PAGE) {
-                               break;
-                       }
-                       $this->show();
-               }
-
-               common_element_end('ul');
-
-               return $cnt;
-       }
-
-       function show() {
-
-               common_element_start('li', array('class' => 'profile_single',
-                                                                                'id' => 'profile-' . $this->profile->id));
-
-               $user = common_current_user();
-
-               if ($user && $user->id != $this->profile->id) {
-                       # XXX: special-case for user looking at own
-                       # subscriptions page
-                       if ($user->isSubscribed($this->profile)) {
-                               common_unsubscribe_form($this->profile);
-                       } else {
-                               common_subscribe_form($this->profile);
-                       }
-               }
-
-               $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
-               common_element_start('a', array('href' => $this->profile->profileurl));
-               common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
-                                                                       'class' => 'avatar stream',
-                                                                       'width' => AVATAR_STREAM_SIZE,
-                                                                       'height' => AVATAR_STREAM_SIZE,
-                                                                       'alt' =>
-                                                                       ($this->profile->fullname) ? $this->profile->fullname :
-                                                                       $this->profile->nickname));
-               common_element_end('a');
-               common_element_start('p');
-               common_element_start('a', array('href' => $this->profile->profileurl,
-                                                                               'class' => 'nickname'));
-               common_raw($this->highlight($this->profile->nickname));
-               common_element_end('a');
-               if ($this->profile->fullname) {
-                       common_text(' | ');
-                       common_element_start('span', 'fullname');
-                       common_raw($this->highlight($this->profile->fullname));
-                       common_element_end('span');
-               }
-               if ($this->profile->location) {
-                       common_text(' | ');
-                       common_element_start('span', 'location');
-                       common_raw($this->highlight($this->profile->location));
-                       common_element_end('span');
-               }
-               common_element_end('p');
-               if ($this->profile->homepage) {
-                       common_element_start('p', 'website');
-                       common_element_start('a', array('href' => $this->profile->homepage));
-                       common_raw($this->highlight($this->profile->homepage));
-                       common_element_end('a');
-                       common_element_end('p');
-               }
-               if ($this->profile->bio) {
-                       common_element_start('p', 'bio');
-                       common_raw($this->highlight($this->profile->bio));
-                       common_element_end('p');
-               }
-
-               # If we're on a list with an owner (subscriptions or subscribers)...
-
-               if ($this->owner) {
-                       # Get tags
-                       $tags = Profile_tag::getTags($this->owner->id, $this->profile->id);
-
-                       common_element_start('div', 'tags_user');
-                       common_element_start('dl');
-                       common_element_start('dt');
-                       if ($user->id == $this->owner->id) {
-                               common_element('a', array('href' => common_local_url('tagother',
-                                                                                                                                        array('id' => $this->profile->id))),
-                                                          _('Tags'));
-                       } else {
-                               common_text(_('Tags'));
-                       }
-                       common_text(":");
-                       common_element_end('dt');
-                       common_element_start('dd');
-                       if ($tags) {
-                               common_element_start('ul', 'tags xoxo');
-                               foreach ($tags as $tag) {
-                                       common_element_start('li');
-                                       common_element('a', array('rel' => 'tag',
-                                                                                         'href' => common_local_url($this->action,
-                                                                                                                                                array('nickname' => $this->owner->nickname,
-                                                                                                                                                          'tag' => $tag))),
-                                                                  $tag);
-                                       common_element_end('li');
-                               }
-                               common_element_end('ul');
-                       } else {
-                               common_text(_('(none)'));
-                       }
-                       common_element_end('dd');
-                       common_element_end('dl');
-                       common_element_end('div');
-               }
+    var $profile = NULL;
+    var $owner = NULL;
+    var $action = NULL;
+
+    function __construct($profile, $owner=NULL, $action=NULL) {
+        $this->profile = $profile;
+        $this->owner = $owner;
+        $this->action = $action;
+    }
+
+    function show_list() {
+
+        common_element_start('ul', array('id' => 'profiles', 'class' => 'profile_list'));
+
+        $cnt = 0;
+
+        while ($this->profile->fetch()) {
+            $cnt++;
+            if($cnt > PROFILES_PER_PAGE) {
+                break;
+            }
+            $this->show();
+        }
+
+        common_element_end('ul');
+
+        return $cnt;
+    }
+
+    function show() {
+
+        common_element_start('li', array('class' => 'profile_single',
+                                         'id' => 'profile-' . $this->profile->id));
+
+        $user = common_current_user();
+
+        if ($user && $user->id != $this->profile->id) {
+            # XXX: special-case for user looking at own
+            # subscriptions page
+            if ($user->isSubscribed($this->profile)) {
+                common_unsubscribe_form($this->profile);
+            } else {
+                common_subscribe_form($this->profile);
+            }
+        }
+
+        $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
+        common_element_start('a', array('href' => $this->profile->profileurl));
+        common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
+                                    'class' => 'avatar stream',
+                                    'width' => AVATAR_STREAM_SIZE,
+                                    'height' => AVATAR_STREAM_SIZE,
+                                    'alt' =>
+                                    ($this->profile->fullname) ? $this->profile->fullname :
+                                    $this->profile->nickname));
+        common_element_end('a');
+        common_element_start('p');
+        common_element_start('a', array('href' => $this->profile->profileurl,
+                                        'class' => 'nickname'));
+        common_raw($this->highlight($this->profile->nickname));
+        common_element_end('a');
+        if ($this->profile->fullname) {
+            common_text(' | ');
+            common_element_start('span', 'fullname');
+            common_raw($this->highlight($this->profile->fullname));
+            common_element_end('span');
+        }
+        if ($this->profile->location) {
+            common_text(' | ');
+            common_element_start('span', 'location');
+            common_raw($this->highlight($this->profile->location));
+            common_element_end('span');
+        }
+        common_element_end('p');
+        if ($this->profile->homepage) {
+            common_element_start('p', 'website');
+            common_element_start('a', array('href' => $this->profile->homepage));
+            common_raw($this->highlight($this->profile->homepage));
+            common_element_end('a');
+            common_element_end('p');
+        }
+        if ($this->profile->bio) {
+            common_element_start('p', 'bio');
+            common_raw($this->highlight($this->profile->bio));
+            common_element_end('p');
+        }
+
+        # If we're on a list with an owner (subscriptions or subscribers)...
+
+        if ($this->owner) {
+            # Get tags
+            $tags = Profile_tag::getTags($this->owner->id, $this->profile->id);
+
+            common_element_start('div', 'tags_user');
+            common_element_start('dl');
+            common_element_start('dt');
+            if ($user->id == $this->owner->id) {
+                common_element('a', array('href' => common_local_url('tagother',
+                                                                     array('id' => $this->profile->id))),
+                               _('Tags'));
+            } else {
+                common_text(_('Tags'));
+            }
+            common_text(":");
+            common_element_end('dt');
+            common_element_start('dd');
+            if ($tags) {
+                common_element_start('ul', 'tags xoxo');
+                foreach ($tags as $tag) {
+                    common_element_start('li');
+                    common_element('a', array('rel' => 'tag',
+                                              'href' => common_local_url($this->action,
+                                                                         array('nickname' => $this->owner->nickname,
+                                                                               'tag' => $tag))),
+                                   $tag);
+                    common_element_end('li');
+                }
+                common_element_end('ul');
+            } else {
+                common_text(_('(none)'));
+            }
+            common_element_end('dd');
+            common_element_end('dl');
+            common_element_end('div');
+        }
 
         if ($user && $user->id == $this->owner->id) {
             $this->show_owner_controls($this->profile);
         }
 
-               common_element_end('li');
-       }
+        common_element_end('li');
+    }
 
     /* Override this in subclasses. */
 
@@ -163,7 +163,7 @@ class ProfileList {
         return;
     }
 
-       function highlight($text) {
-               return htmlspecialchars($text);
-       }
+    function highlight($text) {
+        return htmlspecialchars($text);
+    }
 }
\ No newline at end of file
index 23f295c45296fb480e233e4add9e7bb3fcc15782..5e3905f591ce3d8a37ffacb11cdaeb7789e8c7da 100644 (file)
@@ -27,106 +27,106 @@ require_once(INSTALLDIR.'/classes/Notice.php');
 
 class QueueHandler extends Daemon {
 
-       var $_id = 'generic';
+    var $_id = 'generic';
 
-       function QueueHandler($id=NULL) {
-               if ($id) {
-                       $this->set_id($id);
-               }
-       }
-       
-       function class_name() {
-               return ucfirst($this->transport()) . 'Handler';
-       }
+    function QueueHandler($id=NULL) {
+        if ($id) {
+            $this->set_id($id);
+        }
+    }
+    
+    function class_name() {
+        return ucfirst($this->transport()) . 'Handler';
+    }
 
-       function name() {
-               return strtolower($this->class_name().'.'.$this->get_id());
-       }
-       
-       function get_id() {
-               return $this->_id;
-       }
+    function name() {
+        return strtolower($this->class_name().'.'.$this->get_id());
+    }
+    
+    function get_id() {
+        return $this->_id;
+    }
 
-       function set_id($id) {
-               $this->_id = $id;
-       }
-       
-       function transport() {
-               return NULL;
-       }
-       
-       function start() {
-       }
-       
-       function finish() {
-       }
+    function set_id($id) {
+        $this->_id = $id;
+    }
+    
+    function transport() {
+        return NULL;
+    }
+    
+    function start() {
+    }
+    
+    function finish() {
+    }
 
-       function handle_notice($notice) {
-               return true;
-       }
-       
-       function run() {
-               if (!$this->start()) {
-                       return false;
-               }
-               $this->log(LOG_INFO, 'checking for queued notices');
-               $transport = $this->transport();
-               do {
-                       $qi = Queue_item::top($transport);
-                       if ($qi) {
-                               $this->log(LOG_INFO, 'Got item enqueued '.common_exact_date($qi->created));
-                               $notice = Notice::staticGet($qi->notice_id);
-                               if ($notice) {
-                                       $this->log(LOG_INFO, 'broadcasting notice ID = ' . $notice->id);
-                                       # XXX: what to do if broadcast fails?
-                                       $result = $this->handle_notice($notice);
-                                       if (!$result) {
-                                               $this->log(LOG_WARNING, 'Failed broadcast for notice ID = ' . $notice->id);
-                                               $orig = $qi;
-                                               $qi->claimed = NULL;
-                                               $qi->update($orig);
-                                               $this->log(LOG_WARNING, 'Abandoned claim for notice ID = ' . $notice->id);
-                                               continue;
-                                       }
-                                       $this->log(LOG_INFO, 'finished broadcasting notice ID = ' . $notice->id);
-                                       $notice->free();
-                                       unset($notice);
-                                       $notice = NULL;
-                               } else {
-                                       $this->log(LOG_WARNING, 'queue item for notice that does not exist');
-                               }
-                               $qi->delete();
-                               $qi->free();
-                               unset($qi);
-                               $this->idle(0);
-                       } else {
-                               $this->clear_old_claims();
-                               $this->idle(5);
-                       }       
-               } while (true);
-               if (!$this->finish()) {
-                       return false;
-               }
-               return true;
-       }
+    function handle_notice($notice) {
+        return true;
+    }
+    
+    function run() {
+        if (!$this->start()) {
+            return false;
+        }
+        $this->log(LOG_INFO, 'checking for queued notices');
+        $transport = $this->transport();
+        do {
+            $qi = Queue_item::top($transport);
+            if ($qi) {
+                $this->log(LOG_INFO, 'Got item enqueued '.common_exact_date($qi->created));
+                $notice = Notice::staticGet($qi->notice_id);
+                if ($notice) {
+                    $this->log(LOG_INFO, 'broadcasting notice ID = ' . $notice->id);
+                    # XXX: what to do if broadcast fails?
+                    $result = $this->handle_notice($notice);
+                    if (!$result) {
+                        $this->log(LOG_WARNING, 'Failed broadcast for notice ID = ' . $notice->id);
+                        $orig = $qi;
+                        $qi->claimed = NULL;
+                        $qi->update($orig);
+                        $this->log(LOG_WARNING, 'Abandoned claim for notice ID = ' . $notice->id);
+                        continue;
+                    }
+                    $this->log(LOG_INFO, 'finished broadcasting notice ID = ' . $notice->id);
+                    $notice->free();
+                    unset($notice);
+                    $notice = NULL;
+                } else {
+                    $this->log(LOG_WARNING, 'queue item for notice that does not exist');
+                }
+                $qi->delete();
+                $qi->free();
+                unset($qi);
+                $this->idle(0);
+            } else {
+                $this->clear_old_claims();
+                $this->idle(5);
+            }    
+        } while (true);
+        if (!$this->finish()) {
+            return false;
+        }
+        return true;
+    }
 
-       function idle($timeout=0) {
-               if ($timeout>0) {
-                       sleep($timeout);
-               }
-       }
-       
-       function clear_old_claims() {
-               $qi = new Queue_item();
-               $qi->transport = $this->transport();
-               $qi->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
-               $qi->update(DB_DATAOBJECT_WHEREADD_ONLY);
-               $qi->free();
-               unset($qi);
-       }
-       
-       function log($level, $msg) {
-               common_log($level, $this->class_name() . ' ('. $this->get_id() .'): '.$msg);
-       }
+    function idle($timeout=0) {
+        if ($timeout>0) {
+            sleep($timeout);
+        }
+    }
+    
+    function clear_old_claims() {
+        $qi = new Queue_item();
+        $qi->transport = $this->transport();
+        $qi->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
+        $qi->update(DB_DATAOBJECT_WHEREADD_ONLY);
+        $qi->free();
+        unset($qi);
+    }
+    
+    function log($level, $msg) {
+        common_log($level, $this->class_name() . ' ('. $this->get_id() .'): '.$msg);
+    }
 }
-       
\ No newline at end of file
+    
\ No newline at end of file
index 777511506dff0bf8b710a77bcc7029e3344cab5e..b647968887c28f3118e9df8331c21d18d09914c8 100644 (file)
@@ -23,167 +23,167 @@ define('DEFAULT_RSS_LIMIT', 48);
 
 class Rss10Action extends Action {
 
-       # This will contain the details of each feed item's author and be used to generate SIOC data.
-       var $creators = array();
-
-       function is_readonly() {
-               return true;
-       }
-
-       function handle($args) {
-               parent::handle($args);
-               $limit = (int) $this->trimmed('limit');
-               if ($limit == 0) {
-                       $limit = DEFAULT_RSS_LIMIT;
-               }
-               $this->show_rss($limit);
-       }
-
-       function init() {
-               return true;
-       }
-
-       function get_notices() {
-               return array();
-       }
-
-       function get_channel() {
-               return array('url' => '',
-                                        'title' => '',
-                                        'link' => '',
-                                        'description' => '');
-       }
-
-       function get_image() {
-               return NULL;
-       }
-
-       function show_rss($limit=0) {
-
-               if (!$this->init()) {
-                       return;
-               }
-
-               $notices = $this->get_notices($limit);
-
-               $this->init_rss();
-               $this->show_channel($notices);
-               $this->show_image();
-
-               foreach ($notices as $n) {
-                       $this->show_item($n);
-               }
-
-               $this->show_creators();
-               $this->end_rss();
-       }
-
-       function show_channel($notices) {
-
-               $channel = $this->get_channel();
-               $image = $this->get_image();
-
-               common_element_start('channel', array('rdf:about' => $channel['url']));
-               common_element('title', NULL, $channel['title']);
-               common_element('link', NULL, $channel['link']);
-               common_element('description', NULL, $channel['description']);
-               common_element('cc:licence', array('rdf:resource' => common_config('license','url')));
-
-               if ($image) {
-                       common_element('image', array('rdf:resource' => $image));
-               }
-
-               common_element_start('items');
-               common_element_start('rdf:Seq');
-
-               foreach ($notices as $notice) {
-                       common_element('sioct:MicroblogPost', array('rdf:resource' => $notice->uri));
-               }
-
-               common_element_end('rdf:Seq');
-               common_element_end('items');
-
-               common_element_end('channel');
-       }
-
-       function show_image() {
-               $image = $this->get_image();
-               if ($image) {
-                       $channel = $this->get_channel();
-                       common_element_start('image', array('rdf:about' => $image));
-                       common_element('title', NULL, $channel['title']);
-                       common_element('link', NULL, $channel['link']);
-                       common_element('url', NULL, $image);
-                       common_element_end('image');
-               }
-       }
-
-       function show_item($notice) {
-               $profile = Profile::staticGet($notice->profile_id);
-               $nurl = common_local_url('shownotice', array('notice' => $notice->id));
-               $creator_uri = common_profile_uri($profile);
-               common_element_start('item', array('rdf:about' => $notice->uri));
-               $title = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
-               common_element('title', NULL, $title);
-               common_element('link', NULL, $nurl);
-               common_element('description', NULL, $profile->nickname."'s status on ".common_exact_date($notice->created));
-               common_element('dc:date', NULL, common_date_w3dtf($notice->created));
-               common_element('dc:creator', NULL, ($profile->fullname) ? $profile->fullname : $profile->nickname);
-               common_element('sioc:has_creator', array('rdf:resource' => $creator_uri));
-               common_element('laconica:postIcon', array('rdf:resource' => common_profile_avatar_url($profile)));
-               common_element('cc:licence', array('rdf:resource' => common_config('license', 'url')));
-               common_element_end('item');
-               $this->creators[$creator_uri] = $profile;
-       }
-
-       function show_creators() {
-               foreach ($this->creators as $uri => $profile) {
-                       $id = $profile->id;
-                       $nickname = $profile->nickname;
-                       common_element_start('sioc:User', array('rdf:about' => $uri));
-                       common_element('foaf:nick', NULL, $nickname);
-                       if ($profile->fullname) {
-                               common_element('foaf:name', NULL, $profile->fullname);
-                       }
-                       common_element('sioc:id', NULL, $id);
-                       $avatar = common_profile_avatar_url($profile);
-                       common_element('sioc:avatar', array('rdf:resource' => $avatar));
-                       common_element_end('sioc:User');
-               }
-       }
-
-       function init_rss() {
-               $channel = $this->get_channel();
-               header('Content-Type: application/rdf+xml');
-
-               common_start_xml();
-               common_element_start('rdf:RDF', array('xmlns:rdf' =>
-                                                                                         'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
-                                                                                         'xmlns:dc' =>
-                                                                                         'http://purl.org/dc/elements/1.1/',
-                                                                                         'xmlns:cc' =>
-                                                                                         'http://web.resource.org/cc/',
+    # This will contain the details of each feed item's author and be used to generate SIOC data.
+    var $creators = array();
+
+    function is_readonly() {
+        return true;
+    }
+
+    function handle($args) {
+        parent::handle($args);
+        $limit = (int) $this->trimmed('limit');
+        if ($limit == 0) {
+            $limit = DEFAULT_RSS_LIMIT;
+        }
+        $this->show_rss($limit);
+    }
+
+    function init() {
+        return true;
+    }
+
+    function get_notices() {
+        return array();
+    }
+
+    function get_channel() {
+        return array('url' => '',
+                     'title' => '',
+                     'link' => '',
+                     'description' => '');
+    }
+
+    function get_image() {
+        return NULL;
+    }
+
+    function show_rss($limit=0) {
+
+        if (!$this->init()) {
+            return;
+        }
+
+        $notices = $this->get_notices($limit);
+
+        $this->init_rss();
+        $this->show_channel($notices);
+        $this->show_image();
+
+        foreach ($notices as $n) {
+            $this->show_item($n);
+        }
+
+        $this->show_creators();
+        $this->end_rss();
+    }
+
+    function show_channel($notices) {
+
+        $channel = $this->get_channel();
+        $image = $this->get_image();
+
+        common_element_start('channel', array('rdf:about' => $channel['url']));
+        common_element('title', NULL, $channel['title']);
+        common_element('link', NULL, $channel['link']);
+        common_element('description', NULL, $channel['description']);
+        common_element('cc:licence', array('rdf:resource' => common_config('license','url')));
+
+        if ($image) {
+            common_element('image', array('rdf:resource' => $image));
+        }
+
+        common_element_start('items');
+        common_element_start('rdf:Seq');
+
+        foreach ($notices as $notice) {
+            common_element('sioct:MicroblogPost', array('rdf:resource' => $notice->uri));
+        }
+
+        common_element_end('rdf:Seq');
+        common_element_end('items');
+
+        common_element_end('channel');
+    }
+
+    function show_image() {
+        $image = $this->get_image();
+        if ($image) {
+            $channel = $this->get_channel();
+            common_element_start('image', array('rdf:about' => $image));
+            common_element('title', NULL, $channel['title']);
+            common_element('link', NULL, $channel['link']);
+            common_element('url', NULL, $image);
+            common_element_end('image');
+        }
+    }
+
+    function show_item($notice) {
+        $profile = Profile::staticGet($notice->profile_id);
+        $nurl = common_local_url('shownotice', array('notice' => $notice->id));
+        $creator_uri = common_profile_uri($profile);
+        common_element_start('item', array('rdf:about' => $notice->uri));
+        $title = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
+        common_element('title', NULL, $title);
+        common_element('link', NULL, $nurl);
+        common_element('description', NULL, $profile->nickname."'s status on ".common_exact_date($notice->created));
+        common_element('dc:date', NULL, common_date_w3dtf($notice->created));
+        common_element('dc:creator', NULL, ($profile->fullname) ? $profile->fullname : $profile->nickname);
+        common_element('sioc:has_creator', array('rdf:resource' => $creator_uri));
+        common_element('laconica:postIcon', array('rdf:resource' => common_profile_avatar_url($profile)));
+        common_element('cc:licence', array('rdf:resource' => common_config('license', 'url')));
+        common_element_end('item');
+        $this->creators[$creator_uri] = $profile;
+    }
+
+    function show_creators() {
+        foreach ($this->creators as $uri => $profile) {
+            $id = $profile->id;
+            $nickname = $profile->nickname;
+            common_element_start('sioc:User', array('rdf:about' => $uri));
+            common_element('foaf:nick', NULL, $nickname);
+            if ($profile->fullname) {
+                common_element('foaf:name', NULL, $profile->fullname);
+            }
+            common_element('sioc:id', NULL, $id);
+            $avatar = common_profile_avatar_url($profile);
+            common_element('sioc:avatar', array('rdf:resource' => $avatar));
+            common_element_end('sioc:User');
+        }
+    }
+
+    function init_rss() {
+        $channel = $this->get_channel();
+        header('Content-Type: application/rdf+xml');
+
+        common_start_xml();
+        common_element_start('rdf:RDF', array('xmlns:rdf' =>
+                                              'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
+                                              'xmlns:dc' =>
+                                              'http://purl.org/dc/elements/1.1/',
+                                              'xmlns:cc' =>
+                                              'http://web.resource.org/cc/',
                                               'xmlns:content' =>
                                               'http://purl.org/rss/1.0/modules/content/',
-                                                                                         'xmlns:foaf' =>
-                                                                                         'http://xmlns.com/foaf/0.1/',
-                                                                                         'xmlns:sioc' =>
-                                                                                         'http://rdfs.org/sioc/ns#',
-                                                     'xmlns:sioct' =>
-                                                     'http://rdfs.org/sioc/types#',
-                                                     'xmlns:laconica' =>
-                                                     'http://laconi.ca/ont/',
-                                                                                         'xmlns' => 'http://purl.org/rss/1.0/'));
-               common_element_start('sioc:Site', array('rdf:about' => common_root_url()));
-               common_element('sioc:name', NULL, common_config('site', 'name'));
-               common_element_start('sioc:container_of');
-               common_element('sioc:Container', array('rdf:about' =>
-                                                      $channel['url']));
-               common_element_end('sioc:container_of');
-               common_element_end('sioc:Site');
-       }
-
-       function end_rss() {
-               common_element_end('rdf:RDF');
-       }
+                                              'xmlns:foaf' =>
+                                              'http://xmlns.com/foaf/0.1/',
+                                              'xmlns:sioc' =>
+                                              'http://rdfs.org/sioc/ns#',
+                                              'xmlns:sioct' =>
+                                              'http://rdfs.org/sioc/types#',
+                                              'xmlns:laconica' =>
+                                              'http://laconi.ca/ont/',
+                                              'xmlns' => 'http://purl.org/rss/1.0/'));
+        common_element_start('sioc:Site', array('rdf:about' => common_root_url()));
+        common_element('sioc:name', NULL, common_config('site', 'name'));
+        common_element_start('sioc:container_of');
+        common_element('sioc:Container', array('rdf:about' =>
+                                               $channel['url']));
+        common_element_end('sioc:container_of');
+        common_element_end('sioc:Site');
+    }
+
+    function end_rss() {
+        common_element_end('rdf:RDF');
+    }
 }
index 7fcc1ffcb027d375e120ea58271bbc379292b1d1..d53d7d8d8a731c2ca2c75de4628185821e1b666f 100644 (file)
@@ -98,10 +98,10 @@ class MySQLSearch extends SearchEngine {
     function query($q) {
         if ('identica_people' === $this->table)
             return $this->target->whereAdd('MATCH(nickname, fullname, location, bio, homepage) ' .
-                                                  'against (\''.addslashes($q).'\')');
+                           'against (\''.addslashes($q).'\')');
         if ('identica_notices' === $this->table)
             return $this->target->whereAdd('MATCH(content) ' .
-                                                  'against (\''.addslashes($q).'\')');
+                           'against (\''.addslashes($q).'\')');
     }
 }
 
index f99883b251ec7ca2eed5044f555155c5f1ed5166..8634bd99cfc8fe9f784679fff250fa85313ea77a 100644 (file)
@@ -21,90 +21,90 @@ if (!defined('LACONICA')) { exit(1); }
 
 class SearchAction extends Action {
 
-       function is_readonly() {
-               return true;
-       }
+    function is_readonly() {
+        return true;
+    }
 
-       function handle($args) {
-               parent::handle($args);
-               $this->show_form();
-       }
+    function handle($args) {
+        parent::handle($args);
+        $this->show_form();
+    }
 
-       function show_top($arr=NULL) {
-               if ($arr) {
-                       $error = $arr[1];
-               }
-               if ($error) {
-                       common_element('p', 'error', $error);
-               } else {
-                       $instr = $this->get_instructions();
-                       $output = common_markup_to_html($instr);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-               }
-               $this->search_menu();
-       }
+    function show_top($arr=NULL) {
+        if ($arr) {
+            $error = $arr[1];
+        }
+        if ($error) {
+            common_element('p', 'error', $error);
+        } else {
+            $instr = $this->get_instructions();
+            $output = common_markup_to_html($instr);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('div');
+        }
+        $this->search_menu();
+    }
 
-       function get_title() {
-               return NULL;
-       }
+    function get_title() {
+        return NULL;
+    }
 
-       function show_header($arr) {
-               return;
-       }
+    function show_header($arr) {
+        return;
+    }
 
-       function show_form($error=NULL) {
-               global $config;
+    function show_form($error=NULL) {
+        global $config;
 
-               $q = $this->trimmed('q');
-               $page = $this->trimmed('page', 1);
+        $q = $this->trimmed('q');
+        $page = $this->trimmed('page', 1);
 
-               common_show_header($this->get_title(), array($this, 'show_header'), array($q, $error),
-                                                  array($this, 'show_top'));
-               common_element_start('form', array('method' => 'get',
-                                                                                  'id' => 'login',
-                                                                                  'action' => common_local_url($this->trimmed('action'))));
-               common_element_start('p');
-               if (!isset($config['site']['fancy']) || !$config['site']['fancy']) {
-                       common_element('input', array('name' => 'action',
-                                                                                 'type' => 'hidden',
-                                                                                 'value' => $this->trimmed('action')));
-               }
-               common_element('input', array('name' => 'q',
-                                                                         'id' => 'q',
-                                                                         'type' => 'text',
-                                                                         'class' => 'input_text',
-                                                                         'value' => ($q) ? $q : ''));
-               common_text(' ');
-               common_element('input', array('type' => 'submit',
-                                                                         'id' => 'search',
-                                                                         'name' => 'search',
-                                                                         'class' => 'submit',
-                                                                         'value' => _('Search')));
+        common_show_header($this->get_title(), array($this, 'show_header'), array($q, $error),
+                           array($this, 'show_top'));
+        common_element_start('form', array('method' => 'get',
+                                           'id' => 'login',
+                                           'action' => common_local_url($this->trimmed('action'))));
+        common_element_start('p');
+        if (!isset($config['site']['fancy']) || !$config['site']['fancy']) {
+            common_element('input', array('name' => 'action',
+                                          'type' => 'hidden',
+                                          'value' => $this->trimmed('action')));
+        }
+        common_element('input', array('name' => 'q',
+                                      'id' => 'q',
+                                      'type' => 'text',
+                                      'class' => 'input_text',
+                                      'value' => ($q) ? $q : ''));
+        common_text(' ');
+        common_element('input', array('type' => 'submit',
+                                      'id' => 'search',
+                                      'name' => 'search',
+                                      'class' => 'submit',
+                                      'value' => _('Search')));
 
-               common_element_end('p');
-               common_element_end('form');
-               if ($q) {
-                       $this->show_results($q, $page);
-               }
-               common_show_footer();
-       }
+        common_element_end('p');
+        common_element_end('form');
+        if ($q) {
+            $this->show_results($q, $page);
+        }
+        common_show_footer();
+    }
 
-       function search_menu() {
-               # action => array('prompt', 'title', $args)
-               $action = $this->trimmed('action');
-               $menu =
-                 array('peoplesearch' =>
-                               array(
-                                         _('People'),
-                                         _('Find people on this site'),
-                                         ($action != 'peoplesearch' && $this->trimmed('q')) ? array('q' => $this->trimmed('q')) : NULL),
-                               'noticesearch' =>
-                               array( _('Text'),
-                                          _('Find content of notices'),
-                                          ($action != 'noticesearch' && $this->trimmed('q')) ? array('q' => $this->trimmed('q')) : NULL)
-                               );
-               $this->nav_menu($menu);
-       }
+    function search_menu() {
+        # action => array('prompt', 'title', $args)
+        $action = $this->trimmed('action');
+        $menu =
+          array('peoplesearch' =>
+                array(
+                      _('People'),
+                      _('Find people on this site'),
+                      ($action != 'peoplesearch' && $this->trimmed('q')) ? array('q' => $this->trimmed('q')) : NULL),
+                'noticesearch' =>
+                array( _('Text'),
+                       _('Find content of notices'),
+                       ($action != 'noticesearch' && $this->trimmed('q')) ? array('q' => $this->trimmed('q')) : NULL)
+                );
+        $this->nav_menu($menu);
+    }
 }
index 9e783431f23586073429c867546e3cddbc7b3a89..3021eb192e933c7cfd093c087abf5cc7650e03aa 100644 (file)
@@ -27,9 +27,9 @@ class SettingsAction extends Action {
             common_user_error(_('Not logged in.'));
             return;
         } else if (!common_is_real_login()) {
-               # Cookie theft means that automatic logins can't
-               # change important settings or see private info, and
-               # _all_ our settings are important
+            # Cookie theft means that automatic logins can't
+            # change important settings or see private info, and
+            # _all_ our settings are important
             common_set_returnto($this->self_url());
             common_redirect(common_local_url('login'));
         } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
@@ -55,60 +55,60 @@ class SettingsAction extends Action {
         }
     }
 
-       function form_header($title, $msg=NULL, $success=false) {
-               common_show_header($title,
-                                  NULL,
-                                  array($msg, $success),
-                                                  array($this, 'show_top'));
-       }
+    function form_header($title, $msg=NULL, $success=false) {
+        common_show_header($title,
+                           NULL,
+                           array($msg, $success),
+                           array($this, 'show_top'));
+    }
 
-       function show_top($arr) {
-               $msg = $arr[0];
-               $success = $arr[1];
-               if ($msg) {
-                       $this->message($msg, $success);
-               } else {
-                       $inst = $this->get_instructions();
-                       $output = common_markup_to_html($inst);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-               }
-               $this->settings_menu();
-       }
+    function show_top($arr) {
+        $msg = $arr[0];
+        $success = $arr[1];
+        if ($msg) {
+            $this->message($msg, $success);
+        } else {
+            $inst = $this->get_instructions();
+            $output = common_markup_to_html($inst);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('div');
+        }
+        $this->settings_menu();
+    }
 
     function settings_menu() {
         # action => array('prompt', 'title')
-               $menu =
-                 array('profilesettings' =>
-                               array(_('Profile'),
-                                         _('Change your profile settings')),
-                               'emailsettings' =>
-                               array(_('Email'),
-                                         _('Change email handling')),
-                               'openidsettings' =>
-                               array(_('OpenID'),
-                                         _('Add or remove OpenIDs')),
-                               'smssettings' =>
-                               array(_('SMS'),
-                                         _('Updates by SMS')),
-                               'imsettings' =>
-                               array(_('IM'),
-                                         _('Updates by instant messenger (IM)')),
-                               'twittersettings' =>
-                               array(_('Twitter'),
-                                         _('Twitter integration options')),
-                               'othersettings' =>
-                               array(_('Other'),
-                                         _('Other options')));
-               
+        $menu =
+          array('profilesettings' =>
+                array(_('Profile'),
+                      _('Change your profile settings')),
+                'emailsettings' =>
+                array(_('Email'),
+                      _('Change email handling')),
+                'openidsettings' =>
+                array(_('OpenID'),
+                      _('Add or remove OpenIDs')),
+                'smssettings' =>
+                array(_('SMS'),
+                      _('Updates by SMS')),
+                'imsettings' =>
+                array(_('IM'),
+                      _('Updates by instant messenger (IM)')),
+                'twittersettings' =>
+                array(_('Twitter'),
+                      _('Twitter integration options')),
+                'othersettings' =>
+                array(_('Other'),
+                      _('Other options')));
+        
         $action = $this->trimmed('action');
         common_element_start('ul', array('id' => 'nav_views'));
         foreach ($menu as $menuaction => $menudesc) {
-                       if ($menuaction == 'imsettings' &&
-                               !common_config('xmpp', 'enabled')) {
-                               continue;
-                       }
+            if ($menuaction == 'imsettings' &&
+                !common_config('xmpp', 'enabled')) {
+                continue;
+            }
             common_menu_item(common_local_url($menuaction),
                     $menudesc[0],
                     $menudesc[1],
index 27ab78137f430f7f6ba1205897d6e938815500c3..2d45df2d3aca1447a8b586c4b00cf407d1e495a1 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -24,29 +24,29 @@ require_once(INSTALLDIR.'/lib/noticelist.php');
 
 class StreamAction extends PersonalAction {
 
-       function public_views_menu() {
+    function public_views_menu() {
 
-               $action = $this->trimmed('action');
+        $action = $this->trimmed('action');
 
-               common_element_start('ul', array('id' => 'nav_views'));
+        common_element_start('ul', array('id' => 'nav_views'));
 
-               common_menu_item(common_local_url('public'), _('Public'),
-                       _('Public timeline'), $action == 'public');
+        common_menu_item(common_local_url('public'), _('Public'),
+            _('Public timeline'), $action == 'public');
 
-               common_menu_item(common_local_url('tag'), _('Recent tags'),
-                       _('Recent tags'), $action == 'tag');
+        common_menu_item(common_local_url('tag'), _('Recent tags'),
+            _('Recent tags'), $action == 'tag');
 
-               if (count(common_config('nickname', 'featured')) > 0) {
-                       common_menu_item(common_local_url('featured'), _('Featured'),
-                               _('Featured users'), $action == 'featured');
-               }
+        if (count(common_config('nickname', 'featured')) > 0) {
+            common_menu_item(common_local_url('featured'), _('Featured'),
+                _('Featured users'), $action == 'featured');
+        }
 
-               common_menu_item(common_local_url('favorited'), _('Popular'),
-                       _("Popular notices"), $action == 'favorited');
+        common_menu_item(common_local_url('favorited'), _('Popular'),
+            _("Popular notices"), $action == 'favorited');
 
-               common_element_end('ul');
+        common_element_end('ul');
 
-       }
+    }
 
     function show_notice_list($notice) {
         $nl = new NoticeList($notice);
index 91fc8445d7c34bc4a130819c5986f9ffd49a3350..55e74e0b2f8aa7cb7886c654adce639e28c90f2e 100644 (file)
@@ -27,13 +27,13 @@ require_once('XMPPHP/XMPP.php');
 
 function subs_subscribe_user($user, $other_nickname) {
 
-       $other = User::staticGet('nickname', $other_nickname);
+    $other = User::staticGet('nickname', $other_nickname);
 
-       if (!$other) {
-               return _('No such user.');
-       }
+    if (!$other) {
+        return _('No such user.');
+    }
 
-       return subs_subscribe_to($user, $other);
+    return subs_subscribe_to($user, $other);
 }
 
 /* Subscribe user $user to other user $other.
@@ -43,54 +43,54 @@ function subs_subscribe_user($user, $other_nickname) {
 
 function subs_subscribe_to($user, $other) {
 
-       if ($user->isSubscribed($other)) {
-               return _('Already subscribed!.');
-       }
+    if ($user->isSubscribed($other)) {
+        return _('Already subscribed!.');
+    }
 
     if ($other->hasBlocked($user)) {
-               return _('User has blocked you.');
+        return _('User has blocked you.');
     }
 
-       if (!$user->subscribeTo($other)) {
-               return _('Could not subscribe.');
-               return;
-       }
+    if (!$user->subscribeTo($other)) {
+        return _('Could not subscribe.');
+        return;
+    }
 
     subs_notify($other, $user);
 
-       if (common_config('memcached', 'enabled')) {
-               $cache = new Memcache();
-               if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
-                       $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
-               }
-       }
-
-       if ($other->autosubscribe && !$other->isSubscribed($user) && !$user->hasBlocked($other)) {
-               if (!$other->subscribeTo($user)) {
-                       return _('Could not subscribe other to you.');
-               }
-               if (common_config('memcached', 'enabled')) {
-                       $cache = new Memcache();
-                       if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
-                               $cache->delete(common_cache_key('user:notices_with_friends:' . $other->id));
-                       }
-               }
-
-               subs_notify($user, $other);
-       }
-
-       return true;
+    if (common_config('memcached', 'enabled')) {
+        $cache = new Memcache();
+        if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
+            $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+        }
+    }
+
+    if ($other->autosubscribe && !$other->isSubscribed($user) && !$user->hasBlocked($other)) {
+        if (!$other->subscribeTo($user)) {
+            return _('Could not subscribe other to you.');
+        }
+        if (common_config('memcached', 'enabled')) {
+            $cache = new Memcache();
+            if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
+                $cache->delete(common_cache_key('user:notices_with_friends:' . $other->id));
+            }
+        }
+
+        subs_notify($user, $other);
+    }
+
+    return true;
 }
 
 function subs_notify($listenee, $listener) {
-       # XXX: add other notifications (Jabber, SMS) here
-       # XXX: queue this and handle it offline
-       # XXX: Whatever happens, do it in Twitter-like API, too
-       subs_notify_email($listenee, $listener);
+    # XXX: add other notifications (Jabber, SMS) here
+    # XXX: queue this and handle it offline
+    # XXX: Whatever happens, do it in Twitter-like API, too
+    subs_notify_email($listenee, $listener);
 }
 
 function subs_notify_email($listenee, $listener) {
-       mail_subscribe_notify($listenee, $listener);
+    mail_subscribe_notify($listenee, $listener);
 }
 
 /* Unsubscribe $user from nickname $other_nickname
@@ -99,13 +99,13 @@ function subs_notify_email($listenee, $listener) {
 
 function subs_unsubscribe_user($user, $other_nickname) {
 
-       $other = User::staticGet('nickname', $other_nickname);
+    $other = User::staticGet('nickname', $other_nickname);
 
-       if (!$other) {
-               return _('No such user.');
-       }
+    if (!$other) {
+        return _('No such user.');
+    }
 
-       return subs_unsubscribe_to($user, $other->getProfile());
+    return subs_unsubscribe_to($user, $other->getProfile());
 }
 
 /* Unsubscribe user $user from profile $other
@@ -113,28 +113,28 @@ function subs_unsubscribe_user($user, $other_nickname) {
 
 function subs_unsubscribe_to($user, $other) {
 
-       if (!$user->isSubscribed($other))
-               return _('Not subscribed!.');
+    if (!$user->isSubscribed($other))
+        return _('Not subscribed!.');
 
-       $sub = DB_DataObject::factory('subscription');
+    $sub = DB_DataObject::factory('subscription');
 
-       $sub->subscriber = $user->id;
-       $sub->subscribed = $other->id;
+    $sub->subscriber = $user->id;
+    $sub->subscribed = $other->id;
 
-       $sub->find(true);
+    $sub->find(true);
 
-       // note we checked for existence above
+    // note we checked for existence above
 
-       if (!$sub->delete())
-               return _('Couldn\'t delete subscription.');
+    if (!$sub->delete())
+        return _('Couldn\'t delete subscription.');
 
-       if (common_config('memcached', 'enabled')) {
-               $cache = new Memcache();
-               if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
-                       $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
-               }
-       }
+    if (common_config('memcached', 'enabled')) {
+        $cache = new Memcache();
+        if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
+            $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+        }
+    }
 
-       return true;
+    return true;
 }
 
index 80982aa82b0d59f7742fd2d128dceccbbb60881b..346cff4343ae67b31f331c02c6e4dac2ca0e508a 100644 (file)
 if (!defined('LACONICA')) { exit(1); }
 
 function theme_file($relative) {
-       $theme = common_config('site', 'theme');
-       return INSTALLDIR.'/theme/'.$theme.'/'.$relative;
+    $theme = common_config('site', 'theme');
+    return INSTALLDIR.'/theme/'.$theme.'/'.$relative;
 }
 
 function theme_path($relative) {
-       $theme = common_config('site', 'theme');
-       $server = common_config('theme', 'server');
-       if ($server) {
-               return 'http://'.$server.'/'.$theme.'/'.$relative;
-       } else {
-               return common_path('theme/'.$theme.'/'.$relative);
-       }
+    $theme = common_config('site', 'theme');
+    $server = common_config('theme', 'server');
+    if ($server) {
+        return 'http://'.$server.'/'.$theme.'/'.$relative;
+    } else {
+        return common_path('theme/'.$theme.'/'.$relative);
+    }
 }
\ No newline at end of file
index 5c9ef5d6f540e40107d4715270b2f4bf368f5c43..c1d2de0eaed5a6af569a6922de6fc5f0f330ba10 100644 (file)
@@ -21,179 +21,179 @@ if (!defined('LACONICA')) { exit(1); }
 
 function get_twitter_data($uri, $screen_name, $password) {
 
-       $options = array(
-                       CURLOPT_USERPWD => sprintf("%s:%s", $screen_name, $password),
-                       CURLOPT_RETURNTRANSFER  => true,
-                       CURLOPT_FAILONERROR             => true,
-                       CURLOPT_HEADER                  => false,
-                       CURLOPT_FOLLOWLOCATION  => true,
-                       // CURLOPT_USERAGENT            => "identi.ca",
-                       CURLOPT_CONNECTTIMEOUT  => 120,
-                       CURLOPT_TIMEOUT                 => 120
-       );
-
-
-       $ch = curl_init($uri);
+    $options = array(
+            CURLOPT_USERPWD => sprintf("%s:%s", $screen_name, $password),
+            CURLOPT_RETURNTRANSFER    => true,
+            CURLOPT_FAILONERROR        => true,
+            CURLOPT_HEADER            => false,
+            CURLOPT_FOLLOWLOCATION    => true,
+            // CURLOPT_USERAGENT        => "identi.ca",
+            CURLOPT_CONNECTTIMEOUT    => 120,
+            CURLOPT_TIMEOUT            => 120
+    );
+
+
+    $ch = curl_init($uri);
     curl_setopt_array($ch, $options);
     $data = curl_exec($ch);
     $errmsg = curl_error($ch);
 
-       if ($errmsg) {
-               common_debug("Twitter bridge - cURL error: $errmsg - trying to load: $uri with user $twit_user.",
-                       __FILE__);
-       }
+    if ($errmsg) {
+        common_debug("Twitter bridge - cURL error: $errmsg - trying to load: $uri with user $twit_user.",
+            __FILE__);
+    }
 
-       curl_close($ch);
+    curl_close($ch);
 
-       return $data;
+    return $data;
 }
 
 function twitter_user_info($screen_name, $password) {
 
-       $uri = "http://twitter.com/users/show/$screen_name.json";
-       $data = get_twitter_data($uri, $screen_name, $password);
+    $uri = "http://twitter.com/users/show/$screen_name.json";
+    $data = get_twitter_data($uri, $screen_name, $password);
 
-       if (!$data) {
-               return false;
-       }
+    if (!$data) {
+        return false;
+    }
 
-       $twit_user = json_decode($data);
+    $twit_user = json_decode($data);
 
-       if (!$twit_user) {
-               return false;
-       }
+    if (!$twit_user) {
+        return false;
+    }
 
-       return $twit_user;
+    return $twit_user;
 }
 
 function update_twitter_user($fuser, $twitter_id, $screen_name) {
 
-       $original = clone($fuser);
-       $fuser->nickname = $screen_name;
-       $fuser->uri = 'http://twitter.com/' . $screen_name;
-       $result = $fuser->updateKeys($original);
+    $original = clone($fuser);
+    $fuser->nickname = $screen_name;
+    $fuser->uri = 'http://twitter.com/' . $screen_name;
+    $result = $fuser->updateKeys($original);
 
-       if (!$result) {
-               common_log_db_error($fuser, 'UPDATE', __FILE__);
-               return false;
-       }
+    if (!$result) {
+        common_log_db_error($fuser, 'UPDATE', __FILE__);
+        return false;
+    }
 
-       return true;
+    return true;
 }
 
 function add_twitter_user($twitter_id, $screen_name) {
 
-       // Otherwise, create a new Twitter user
-       $fuser = DB_DataObject::factory('foreign_user');
+    // Otherwise, create a new Twitter user
+    $fuser = DB_DataObject::factory('foreign_user');
 
-       $fuser->nickname = $screen_name;
-       $fuser->uri = 'http://twitter.com/' . $screen_name;
-       $fuser->id = $twitter_id;
-       $fuser->service = 1; // Twitter
-       $fuser->created = common_sql_now();
-       $result = $fuser->insert();
+    $fuser->nickname = $screen_name;
+    $fuser->uri = 'http://twitter.com/' . $screen_name;
+    $fuser->id = $twitter_id;
+    $fuser->service = 1; // Twitter
+    $fuser->created = common_sql_now();
+    $result = $fuser->insert();
 
-       if (!$result) {
-               common_debug("Twitter bridge - failed to add new Twitter user: $twitter_id - $screen_name.");
-               common_log_db_error($fuser, 'INSERT', __FILE__);
-               return false;
-       }
+    if (!$result) {
+        common_debug("Twitter bridge - failed to add new Twitter user: $twitter_id - $screen_name.");
+        common_log_db_error($fuser, 'INSERT', __FILE__);
+        return false;
+    }
 
-       common_debug("Twitter bridge - Added new Twitter user: $screen_name ($twitter_id).");
+    common_debug("Twitter bridge - Added new Twitter user: $screen_name ($twitter_id).");
 
-       return true;
+    return true;
 }
 
 // Creates or Updates a Twitter user
 function save_twitter_user($twitter_id, $screen_name) {
 
-       // Check to see whether the Twitter user is already in the system,
-       // and update its screen name and uri if so.
-       $fuser = Foreign_user::getForeignUser($twitter_id, 1);
+    // Check to see whether the Twitter user is already in the system,
+    // and update its screen name and uri if so.
+    $fuser = Foreign_user::getForeignUser($twitter_id, 1);
 
-       if ($fuser) {
+    if ($fuser) {
 
-               // Only update if Twitter screen name has changed
-               if ($fuser->nickname != $screen_name) {
+        // Only update if Twitter screen name has changed
+        if ($fuser->nickname != $screen_name) {
 
-                       common_debug('Twitter bridge - Updated nickname (and URI) for Twitter user ' .
-                               "$fuser->id to $screen_name, was $fuser->nickname");
+            common_debug('Twitter bridge - Updated nickname (and URI) for Twitter user ' .
+                "$fuser->id to $screen_name, was $fuser->nickname");
 
-                       return update_twitter_user($fuser, $twitter_id, $screen_name);
-               }
+            return update_twitter_user($fuser, $twitter_id, $screen_name);
+        }
 
-       } else {
-               return add_twitter_user($twitter_id, $screen_name);
-       }
+    } else {
+        return add_twitter_user($twitter_id, $screen_name);
+    }
 
-       return true;
+    return true;
 }
 
 function retreive_twitter_friends($twitter_id, $screen_name, $password) {
 
-       $uri = "http://twitter.com/statuses/friends/$twitter_id.json?page=";
-       $twitter_user = twitter_user_info($screen_name, $password);
+    $uri = "http://twitter.com/statuses/friends/$twitter_id.json?page=";
+    $twitter_user = twitter_user_info($screen_name, $password);
 
-       // Calculate how many pages to get...
-       $pages = ceil($twitter_user->friends_count / 100);
+    // Calculate how many pages to get...
+    $pages = ceil($twitter_user->friends_count / 100);
 
-       if ($pages == 0) {
-               common_debug("Twitter bridge - Twitter user $screen_name has no friends! Lame.");
-       }
+    if ($pages == 0) {
+        common_debug("Twitter bridge - Twitter user $screen_name has no friends! Lame.");
+    }
 
-       $friends = array();
+    $friends = array();
 
-       for ($i = 1; $i <= $pages; $i++) {
+    for ($i = 1; $i <= $pages; $i++) {
 
-               $data = get_twitter_data($uri . $i, $screen_name, $password);
+        $data = get_twitter_data($uri . $i, $screen_name, $password);
 
-               if (!$data) {
-                       return NULL;
-               }
+        if (!$data) {
+            return NULL;
+        }
 
-               $more_friends = json_decode($data);
+        $more_friends = json_decode($data);
 
-               if (!$more_friends) {
-                       return NULL;
-               }
+        if (!$more_friends) {
+            return NULL;
+        }
 
-               $friends = array_merge($friends, $more_friends);
-       }
+         $friends = array_merge($friends, $more_friends);
+    }
 
-       return $friends;
+    return $friends;
 }
 
 function save_twitter_friends($user, $twitter_id, $screen_name, $password) {
 
-       $friends = retreive_twitter_friends($twitter_id, $screen_name, $password);
+    $friends = retreive_twitter_friends($twitter_id, $screen_name, $password);
 
-       if (is_null($friends)) {
-               common_debug("Twitter bridge - Couldn't get friends data from Twitter.");
-               return false;
-       }
+    if (is_null($friends)) {
+        common_debug("Twitter bridge - Couldn't get friends data from Twitter.");
+        return false;
+    }
 
     foreach ($friends as $friend) {
 
-               $friend_name = $friend->screen_name;
-               $friend_id = $friend->id;
+        $friend_name = $friend->screen_name;
+        $friend_id = $friend->id;
 
-               // Update or create the Foreign_user record
-               if (!save_twitter_user($friend_id, $friend_name)) {
-                       return false;
-               }
+        // Update or create the Foreign_user record
+        if (!save_twitter_user($friend_id, $friend_name)) {
+            return false;
+        }
 
-               // Check to see if there's a related local user
-               $flink = Foreign_link::getByForeignID($friend_id, 1);
+        // Check to see if there's a related local user
+        $flink = Foreign_link::getByForeignID($friend_id, 1);
 
-               if ($flink) {
+        if ($flink) {
 
-                       // Get associated user and subscribe her
-                       $friend_user = User::staticGet('id', $flink->user_id);
-                       subs_subscribe_to($user, $friend_user);
-                       common_debug("Twitter bridge - subscribed $friend_user->nickname to $user->nickname.");
-               }
-       }
+            // Get associated user and subscribe her
+            $friend_user = User::staticGet('id', $flink->user_id);
+            subs_subscribe_to($user, $friend_user);
+            common_debug("Twitter bridge - subscribed $friend_user->nickname to $user->nickname.");
+        }
+    }
 
-       return true;
+    return true;
 }
 
index 2eb127525c5c0bb1b819e85345ecce506c72e7d1..3122caf12ec1282ea3eff0d2225649123e2c284f 100644 (file)
@@ -21,637 +21,637 @@ if (!defined('LACONICA')) { exit(1); }
 
 class TwitterapiAction extends Action {
 
-       var $auth_user;
+    var $auth_user;
 
-       function handle($args) {
-               parent::handle($args);
-       }
+    function handle($args) {
+        parent::handle($args);
+    }
 
-       function twitter_user_array($profile, $get_notice=false) {
+    function twitter_user_array($profile, $get_notice=false) {
 
-               $twitter_user = array();
+        $twitter_user = array();
 
-               $twitter_user['name'] = $profile->getBestName();
-               $twitter_user['followers_count'] = $this->count_subscriptions($profile);
-               $twitter_user['screen_name'] = $profile->nickname;
-               $twitter_user['description'] = ($profile->bio) ? $profile->bio : NULL;
-               $twitter_user['location'] = ($profile->location) ? $profile->location : NULL;
-               $twitter_user['id'] = intval($profile->id);
+        $twitter_user['name'] = $profile->getBestName();
+        $twitter_user['followers_count'] = $this->count_subscriptions($profile);
+        $twitter_user['screen_name'] = $profile->nickname;
+        $twitter_user['description'] = ($profile->bio) ? $profile->bio : NULL;
+        $twitter_user['location'] = ($profile->location) ? $profile->location : NULL;
+        $twitter_user['id'] = intval($profile->id);
 
-               $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
+        $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
 
-               $twitter_user['profile_image_url'] = ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE);
-               $twitter_user['protected'] = 'false'; # not supported by Laconica yet
-               $twitter_user['url'] = ($profile->homepage) ? $profile->homepage : NULL;
+        $twitter_user['profile_image_url'] = ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE);
+        $twitter_user['protected'] = 'false'; # not supported by Laconica yet
+        $twitter_user['url'] = ($profile->homepage) ? $profile->homepage : NULL;
 
-               if ($get_notice) {
-                       $notice = $profile->getCurrentNotice();
-                       if ($notice) {
-                               # don't get user!
-                               $twitter_user['status'] = $this->twitter_status_array($notice, false);
-                       }
-               }
+        if ($get_notice) {
+            $notice = $profile->getCurrentNotice();
+            if ($notice) {
+                # don't get user!
+                $twitter_user['status'] = $this->twitter_status_array($notice, false);
+            }
+        }
 
-               return $twitter_user;
-       }
+        return $twitter_user;
+    }
 
-       function twitter_status_array($notice, $include_user=true) {
+    function twitter_status_array($notice, $include_user=true) {
 
-               $profile = $notice->getProfile();
+        $profile = $notice->getProfile();
 
-               $twitter_status = array();
-               $twitter_status['text'] = $notice->content;
-               $twitter_status['truncated'] = 'false'; # Not possible on Laconica
-               $twitter_status['created_at'] = $this->date_twitter($notice->created);
-               $twitter_status['in_reply_to_status_id'] = ($notice->reply_to) ? intval($notice->reply_to) : NULL;
-               $twitter_status['source'] = $this->source_link($notice->source);
-               $twitter_status['id'] = intval($notice->id);
-               $twitter_status['in_reply_to_user_id'] = ($notice->reply_to) ? $this->replier_by_reply(intval($notice->reply_to)) : NULL;
+        $twitter_status = array();
+        $twitter_status['text'] = $notice->content;
+        $twitter_status['truncated'] = 'false'; # Not possible on Laconica
+        $twitter_status['created_at'] = $this->date_twitter($notice->created);
+        $twitter_status['in_reply_to_status_id'] = ($notice->reply_to) ? intval($notice->reply_to) : NULL;
+        $twitter_status['source'] = $this->source_link($notice->source);
+        $twitter_status['id'] = intval($notice->id);
+        $twitter_status['in_reply_to_user_id'] = ($notice->reply_to) ? $this->replier_by_reply(intval($notice->reply_to)) : NULL;
 
-               if (isset($this->auth_user)) {
-                       $twitter_status['favorited'] = ($this->auth_user->hasFave($notice)) ? 'true' : 'false';
-               } else {
-                       $twitter_status['favorited'] = 'false';
-               }
+        if (isset($this->auth_user)) {
+            $twitter_status['favorited'] = ($this->auth_user->hasFave($notice)) ? 'true' : 'false';
+        } else {
+            $twitter_status['favorited'] = 'false';
+        }
 
-               if ($include_user) {
-                       # Don't get notice (recursive!)
-                       $twitter_user = $this->twitter_user_array($profile, false);
-                       $twitter_status['user'] = $twitter_user;
-               }
+        if ($include_user) {
+            # Don't get notice (recursive!)
+            $twitter_user = $this->twitter_user_array($profile, false);
+            $twitter_status['user'] = $twitter_user;
+        }
 
-               return $twitter_status;
-       }
+        return $twitter_status;
+    }
 
-       function twitter_rss_entry_array($notice) {
+    function twitter_rss_entry_array($notice) {
 
-               $profile = $notice->getProfile();
+        $profile = $notice->getProfile();
 
-               $server = common_config('site', 'server');
-               $entry = array();
+        $server = common_config('site', 'server');
+        $entry = array();
 
         # We trim() to avoid extraneous whitespace in the output
 
-               $entry['content'] = common_xml_safe_str(trim($notice->rendered));
-               $entry['title'] = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
-               $entry['link'] = common_local_url('shownotice', array('notice' => $notice->id));
-               $entry['published'] = common_date_iso8601($notice->created);
-               $entry['id'] = "tag:$server,2008:$entry[link]";
-               $entry['updated'] = $entry['published'];
-
-               # RSS Item specific
-               $entry['description'] = $entry['content'];
-               $entry['pubDate'] = common_date_rfc2822($notice->created);
-               $entry['guid'] = $entry['link'];
-
-               return $entry;
-       }
-
-       function twitter_rss_dmsg_array($message) {
-
-               $server = common_config('site', 'server');
-               $entry = array();
-
-               $entry['title'] = sprintf('Message from %s to %s',
-                       $message->getFrom()->nickname, $message->getTo()->nickname);
-
-               $entry['content'] = common_xml_safe_str(trim($message->content));
-               $entry['link'] = common_local_url('showmessage', array('message' => $message->id));
-               $entry['published'] = common_date_iso8601($message->created);
-               $entry['id'] = "tag:$server,2008:$entry[link]";
-               $entry['updated'] = $entry['published'];
-
-               # RSS Item specific
-               $entry['description'] = $entry['content'];
-               $entry['pubDate'] = common_date_rfc2822($message->created);
-               $entry['guid'] = $entry['link'];
-
-               return $entry;
-       }
-
-       function twitter_dmsg_array($message) {
-
-               $twitter_dm = array();
-
-               $from_profile = $message->getFrom();
-               $to_profile = $message->getTo();
-
-               $twitter_dm['id'] = $message->id;
-               $twitter_dm['sender_id'] = $message->from_profile;
-               $twitter_dm['text'] = trim($message->content);
-               $twitter_dm['recipient_id'] = $message->to_profile;
-               $twitter_dm['created_at'] = $this->date_twitter($message->created);
-               $twitter_dm['sender_screen_name'] = $from_profile->nickname;
-               $twitter_dm['recipient_screen_name'] = $to_profile->nickname;
-               $twitter_dm['sender'] = $this->twitter_user_array($from_profile, false);
-               $twitter_dm['recipient'] = $this->twitter_user_array($to_profile, false);
-
-               return $twitter_dm;
-       }
-
-       function show_twitter_xml_status($twitter_status) {
-               common_element_start('status');
-               foreach($twitter_status as $element => $value) {
-                       switch ($element) {
-                       case 'user':
-                               $this->show_twitter_xml_user($twitter_status['user']);
-                               break;
-                       case 'text':
-                               common_element($element, NULL, common_xml_safe_str($value));
-                               break;
-                       default:
-                               common_element($element, NULL, $value);
-                       }
-               }
-               common_element_end('status');
-       }
-
-       function show_twitter_xml_user($twitter_user, $role='user') {
-               common_element_start($role);
-               foreach($twitter_user as $element => $value) {
-                       if ($element == 'status') {
-                               $this->show_twitter_xml_status($twitter_user['status']);
-                       } else {
-                               common_element($element, NULL, $value);
-                       }
-               }
-               common_element_end($role);
-       }
-
-       function show_twitter_rss_item($entry) {
-               common_element_start('item');
-               common_element('title', NULL, $entry['title']);
-               common_element('description', NULL, $entry['description']);
-               common_element('pubDate', NULL, $entry['pubDate']);
-               common_element('guid', NULL, $entry['guid']);
-               common_element('link', NULL, $entry['link']);
-               common_element_end('item');
-       }
-
-       function show_twitter_atom_entry($entry) {
-           common_element_start('entry');
-               common_element('title', NULL, $entry['title']);
-               common_element('content', array('type' => 'html'), $entry['content']);
-               common_element('id', NULL, $entry['id']);
-               common_element('published', NULL, $entry['published']);
-               common_element('updated', NULL, $entry['updated']);
-               common_element('link', array('href' => $entry['link'], 'rel' => 'alternate', 'type' => 'text/html'), NULL);
-               common_element_end('entry');
-       }
-
-       function show_json_objects($objects) {
-               print(json_encode($objects));
-       }
-
-       function show_single_xml_status($notice) {
-               $this->init_document('xml');
-               $twitter_status = $this->twitter_status_array($notice);
-               $this->show_twitter_xml_status($twitter_status);
-               $this->end_document('xml');
-       }
-
-       function show_single_json_status($notice) {
-               $this->init_document('json');
-               $status = $this->twitter_status_array($notice);
-               $this->show_json_objects($status);
-               $this->end_document('json');
-       }
-
-       function show_single_xml_dmsg($message) {
-               $this->init_document('xml');
-               $dmsg = $this->twitter_dmsg_array($message);
-               $this->show_twitter_xml_dmsg($dmsg);
-               $this->end_document('xml');
-       }
-
-       function show_single_json_dmsg($message) {
-               $this->init_document('json');
-               $dmsg = $this->twitter_dmsg_array($message);
-               $this->show_json_objects($dmsg);
-               $this->end_document('json');
-       }
-
-       function show_twitter_xml_dmsg($twitter_dm) {
-               common_element_start('direct_message');
-               foreach($twitter_dm as $element => $value) {
-                       switch ($element) {
-                       case 'sender':
-                       case 'recipient':
-                               $this->show_twitter_xml_user($value, $element);
-                               break;
-                       case 'text':
-                               common_element($element, NULL, common_xml_safe_str($value));
-                               break;
-                       default:
-                               common_element($element, NULL, $value);
-                       }
-               }
-               common_element_end('direct_message');
-       }
-
-       function show_xml_timeline($notice) {
-
-               $this->init_document('xml');
-               common_element_start('statuses', array('type' => 'array'));
-
-               if (is_array($notice)) {
-                       foreach ($notice as $n) {
-                               $twitter_status = $this->twitter_status_array($n);
-                               $this->show_twitter_xml_status($twitter_status);
-                       }
-               } else {
-                       while ($notice->fetch()) {
-                               $twitter_status = $this->twitter_status_array($notice);
-                               $this->show_twitter_xml_status($twitter_status);
-                       }
-               }
-
-               common_element_end('statuses');
-               $this->end_document('xml');
-       }
-
-       function show_rss_timeline($notice, $title, $link, $subtitle, $suplink=NULL) {
-
-               $this->init_document('rss');
-
-               common_element_start('channel');
-               common_element('title', NULL, $title);
-               common_element('link', NULL, $link);
-               if (!is_null($suplink)) {
-                       # For FriendFeed's SUP protocol
-                       common_element('link', array('xmlns' => 'http://www.w3.org/2005/Atom',
-                                                                                'rel' => 'http://api.friendfeed.com/2008/03#sup',
-                                                                                'href' => $suplink,
-                                                                                'type' => 'application/json'));
-               }
-               common_element('description', NULL, $subtitle);
-               common_element('language', NULL, 'en-us');
-               common_element('ttl', NULL, '40');
-
-               if (is_array($notice)) {
-                       foreach ($notice as $n) {
-                               $entry = $this->twitter_rss_entry_array($n);
-                               $this->show_twitter_rss_item($entry);
-                       }
-               } else {
-                       while ($notice->fetch()) {
-                               $entry = $this->twitter_rss_entry_array($notice);
-                               $this->show_twitter_rss_item($entry);
-                       }
-               }
-
-               common_element_end('channel');
-               $this->end_twitter_rss();
-       }
-
-       function show_atom_timeline($notice, $title, $id, $link, $subtitle=NULL, $suplink=NULL) {
-
-               $this->init_document('atom');
-
-               common_element('title', NULL, $title);
-               common_element('id', NULL, $id);
-               common_element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), NULL);
-               if (!is_null($suplink)) {
-                       # For FriendFeed's SUP protocol
-                       common_element('link', array('rel' => 'http://api.friendfeed.com/2008/03#sup',
-                                                                                'href' => $suplink,
-                                                                                'type' => 'application/json'));
-               }
-               common_element('subtitle', NULL, $subtitle);
-
-               if (is_array($notice)) {
-                       foreach ($notice as $n) {
-                               $entry = $this->twitter_rss_entry_array($n);
-                               $this->show_twitter_atom_entry($entry);
-                       }
-               } else {
-                       while ($notice->fetch()) {
-                               $entry = $this->twitter_rss_entry_array($notice);
-                               $this->show_twitter_atom_entry($entry);
-                       }
-               }
-
-               $this->end_document('atom');
-
-       }
-
-       function show_json_timeline($notice) {
-
-               $this->init_document('json');
-
-               $statuses = array();
-
-               if (is_array($notice)) {
-                       foreach ($notice as $n) {
-                               $twitter_status = $this->twitter_status_array($n);
-                               array_push($statuses, $twitter_status);
-                       }
-               } else {
-                       while ($notice->fetch()) {
-                               $twitter_status = $this->twitter_status_array($notice);
-                               array_push($statuses, $twitter_status);
-                       }
-               }
-
-               $this->show_json_objects($statuses);
-
-               $this->end_document('json');
-       }
-
-       // Anyone know what date format this is?
-       // Twitter's dates look like this: "Mon Jul 14 23:52:38 +0000 2008" -- Zach
-       function date_twitter($dt) {
-               $t = strtotime($dt);
-               return date("D M d G:i:s O Y", $t);
-       }
-
-       function replier_by_reply($reply_id) {
-               $notice = Notice::staticGet($reply_id);
-               if ($notice) {
-                       $profile = $notice->getProfile();
-                       if ($profile) {
-                               return intval($profile->id);
-                       } else {
-                               common_debug('Can\'t find a profile for notice: ' . $notice->id, __FILE__);
-                       }
-               } else {
-                       common_debug("Can't get notice: $reply_id", __FILE__);
-               }
-               return NULL;
-       }
-
-       // XXX: Candidate for a general utility method somewhere?
-       function count_subscriptions($profile) {
-
-               $count = 0;
-               $sub = new Subscription();
-               $sub->subscribed = $profile->id;
-
-               $count = $sub->find();
-
-               if ($count > 0) {
-                       return $count - 1;
-               } else {
-                       return 0;
-               }
-       }
-
-       function init_document($type='xml') {
-               switch ($type) {
-                case 'xml':
-                       header('Content-Type: application/xml; charset=utf-8');
-                       common_start_xml();
-                       break;
-                case 'json':
-                       header('Content-Type: application/json; charset=utf-8');
-
-                       // Check for JSONP callback
-                       $callback = $this->arg('callback');
-                       if ($callback) {
-                               print $callback . '(';
-                       }
-                       break;
-                case 'rss':
-                       header("Content-Type: application/rss+xml; charset=utf-8");
-                       $this->init_twitter_rss();
-                       break;
-                case 'atom':
-                       header('Content-Type: application/atom+xml; charset=utf-8');
-                       $this->init_twitter_atom();
-                       break;
-                default:
-                       $this->client_error(_('Not a supported data format.'));
-                       break;
-               }
-
-               return;
-       }
-
-       function end_document($type='xml') {
-               switch ($type) {
-                case 'xml':
-                       common_end_xml();
-                       break;
-                case 'json':
-
-                       // Check for JSONP callback
-                       $callback = $this->arg('callback');
-                       if ($callback) {
-                               print ')';
-                       }
-                       break;
-                case 'rss':
-                       $this->end_twitter_rss();
-                       break;
-                case 'atom':
-                       $this->end_twitter_rss();
-                       break;
-                default:
-                       $this->client_error(_('Not a supported data format.'));
-                       break;
-               }
-               return;
-       }
-
-       function client_error($msg, $code = 400, $content_type = 'json') {
-
-               static $status = array(400 => 'Bad Request',
-                                                          401 => 'Unauthorized',
-                                                          402 => 'Payment Required',
-                                                          403 => 'Forbidden',
-                                                          404 => 'Not Found',
-                                                          405 => 'Method Not Allowed',
-                                                          406 => 'Not Acceptable',
-                                                          407 => 'Proxy Authentication Required',
-                                                          408 => 'Request Timeout',
-                                                          409 => 'Conflict',
-                                                          410 => 'Gone',
-                                                          411 => 'Length Required',
-                                                          412 => 'Precondition Failed',
-                                                          413 => 'Request Entity Too Large',
-                                                          414 => 'Request-URI Too Long',
-                                                          415 => 'Unsupported Media Type',
-                                                          416 => 'Requested Range Not Satisfiable',
-                                                          417 => 'Expectation Failed');
-
-               $action = $this->trimmed('action');
-
-               common_debug("User error '$code' on '$action': $msg", __FILE__);
-
-               if (!array_key_exists($code, $status)) {
-                       $code = 400;
-               }
-
-               $status_string = $status[$code];
-               header('HTTP/1.1 '.$code.' '.$status_string);
-
-               if ($content_type == 'xml') {
-                       $this->init_document('xml');
-                       common_element_start('hash');
-                       common_element('error', NULL, $msg);
-                       common_element('request', NULL, $_SERVER['REQUEST_URI']);
-                       common_element_end('hash');
-                       $this->end_document('xml');
-               } else {
-                       $this->init_document('json');
-                       $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
-                       print(json_encode($error_array));
-                       $this->end_document('json');
-               }
-
-       }
-
-       function init_twitter_rss() {
-               common_start_xml();
-               common_element_start('rss', array('version' => '2.0'));
-       }
-
-       function end_twitter_rss() {
-               common_element_end('rss');
-               common_end_xml();
-       }
-
-       function init_twitter_atom() {
-               common_start_xml();
-               common_element_start('feed', array('xmlns' => 'http://www.w3.org/2005/Atom', 'xml:lang' => 'en-US'));
-       }
-
-       function end_twitter_atom() {
-               common_end_xml();
-               common_element_end('feed');
-       }
-
-       function show_profile($profile, $content_type='xml', $notice=NULL) {
-               $profile_array = $this->twitter_user_array($profile, true);
-               switch ($content_type) {
-                case 'xml':
-                       $this->show_twitter_xml_user($profile_array);
-                       break;
-                case 'json':
-                       $this->show_json_objects($profile_array);
-                       break;
-                default:
-                       $this->client_error(_('Not a supported data format.'));
-                       return;
-               }
-               return;
-       }
-
-       function get_user($id, $apidata=NULL) {
-               if (!$id) {
-                       return $apidata['user'];
-               } else if (is_numeric($id)) {
-                       return User::staticGet($id);
-               } else {
-                       $nickname = common_canonical_nickname($id);
-                       return User::staticGet('nickname', $nickname);
-               }
-       }
-
-       function get_profile($id) {
-               if (is_numeric($id)) {
-                       return Profile::staticGet($id);
-               } else {
-                       $user = User::staticGet('nickname', $id);
-                       if ($user) {
-                               return $user->getProfile();
-                       } else {
-                               return NULL;
-                       }
-               }
-       }
-
-       function source_link($source) {
-               $source_name = _($source);
-               switch ($source) {
-                case 'web':
-                case 'xmpp':
-                case 'mail':
-                case 'omb':
-                case 'api':
-                       break;
-                default:
-                       $ns = Notice_source::staticGet($source);
-                       if ($ns) {
-                               $source_name = '<a href="' . $ns->url . '">' . $ns->name . '</a>';
-                       }
-                       break;
-               }
-               return $source_name;
-       }
-
-       function show_extended_profile($user, $apidata) {
-
-               $this->auth_user = $apidata['user'];
-
-               $profile = $user->getProfile();
-
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
-
-               $twitter_user = $this->twitter_user_array($profile, true);
-
-               // Add in extended user fields offered up by this method
-               $twitter_user['created_at'] = $this->date_twitter($profile->created);
-
-               $subbed = DB_DataObject::factory('subscription');
-               $subbed->subscriber = $profile->id;
-               $subbed_count = (int) $subbed->count() - 1;
-
-               $notices = DB_DataObject::factory('notice');
-               $notices->profile_id = $profile->id;
-               $notice_count = (int) $notices->count();
-
-               $twitter_user['friends_count'] = (is_int($subbed_count)) ? $subbed_count : 0;
-               $twitter_user['statuses_count'] = (is_int($notice_count)) ? $notice_count : 0;
-
-               // Other fields Twitter sends...
-               $twitter_user['profile_background_color'] = '';
-               $twitter_user['profile_text_color'] = '';
-               $twitter_user['profile_link_color'] = '';
-               $twitter_user['profile_sidebar_fill_color'] = '';
-
-               $faves = DB_DataObject::factory('fave');
-               $faves->user_id = $user->id;
-               $faves_count = (int) $faves->count();
-               $twitter_user['favourites_count'] = $faves_count;
-
-               $timezone = 'UTC';
-
-               if ($user->timezone) {
-                       $timezone = $user->timezone;
-               }
-
-               $t = new DateTime;
-               $t->setTimezone(new DateTimeZone($timezone));
-               $twitter_user['utc_offset'] = $t->format('Z');
-               $twitter_user['time_zone'] = $timezone;
-
-               $following = 'false';
-
-               if (isset($this->auth_user)) {
-                       if ($this->auth_user->isSubscribed($profile)) {
-                               $following = 'true';
-                       }
-
-                       // Not implemented yet
-                       $twitter_user['notifications'] = 'false';
-               }
-
-               $twitter_user['following'] = $following;
-
-               if ($apidata['content-type'] == 'xml') {
-                       $this->init_document('xml');
-                       $this->show_twitter_xml_user($twitter_user);
-                       $this->end_document('xml');
-               } elseif ($apidata['content-type'] == 'json') {
-                       $this->init_document('json');
-                       $this->show_json_objects($twitter_user);
-                       $this->end_document('json');
-               }
-
-       }
+        $entry['content'] = common_xml_safe_str(trim($notice->rendered));
+        $entry['title'] = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
+        $entry['link'] = common_local_url('shownotice', array('notice' => $notice->id));
+        $entry['published'] = common_date_iso8601($notice->created);
+        $entry['id'] = "tag:$server,2008:$entry[link]";
+        $entry['updated'] = $entry['published'];
+
+        # RSS Item specific
+        $entry['description'] = $entry['content'];
+        $entry['pubDate'] = common_date_rfc2822($notice->created);
+        $entry['guid'] = $entry['link'];
+
+        return $entry;
+    }
+
+    function twitter_rss_dmsg_array($message) {
+
+        $server = common_config('site', 'server');
+        $entry = array();
+
+        $entry['title'] = sprintf('Message from %s to %s',
+            $message->getFrom()->nickname, $message->getTo()->nickname);
+
+        $entry['content'] = common_xml_safe_str(trim($message->content));
+        $entry['link'] = common_local_url('showmessage', array('message' => $message->id));
+        $entry['published'] = common_date_iso8601($message->created);
+        $entry['id'] = "tag:$server,2008:$entry[link]";
+        $entry['updated'] = $entry['published'];
+
+        # RSS Item specific
+        $entry['description'] = $entry['content'];
+        $entry['pubDate'] = common_date_rfc2822($message->created);
+        $entry['guid'] = $entry['link'];
+
+        return $entry;
+    }
+
+    function twitter_dmsg_array($message) {
+
+        $twitter_dm = array();
+
+        $from_profile = $message->getFrom();
+        $to_profile = $message->getTo();
+
+        $twitter_dm['id'] = $message->id;
+        $twitter_dm['sender_id'] = $message->from_profile;
+        $twitter_dm['text'] = trim($message->content);
+        $twitter_dm['recipient_id'] = $message->to_profile;
+        $twitter_dm['created_at'] = $this->date_twitter($message->created);
+        $twitter_dm['sender_screen_name'] = $from_profile->nickname;
+        $twitter_dm['recipient_screen_name'] = $to_profile->nickname;
+        $twitter_dm['sender'] = $this->twitter_user_array($from_profile, false);
+        $twitter_dm['recipient'] = $this->twitter_user_array($to_profile, false);
+
+        return $twitter_dm;
+    }
+
+    function show_twitter_xml_status($twitter_status) {
+        common_element_start('status');
+        foreach($twitter_status as $element => $value) {
+            switch ($element) {
+            case 'user':
+                $this->show_twitter_xml_user($twitter_status['user']);
+                break;
+            case 'text':
+                common_element($element, NULL, common_xml_safe_str($value));
+                break;
+            default:
+                common_element($element, NULL, $value);
+            }
+        }
+        common_element_end('status');
+    }
+
+    function show_twitter_xml_user($twitter_user, $role='user') {
+        common_element_start($role);
+        foreach($twitter_user as $element => $value) {
+            if ($element == 'status') {
+                $this->show_twitter_xml_status($twitter_user['status']);
+            } else {
+                common_element($element, NULL, $value);
+            }
+        }
+        common_element_end($role);
+    }
+
+    function show_twitter_rss_item($entry) {
+        common_element_start('item');
+        common_element('title', NULL, $entry['title']);
+        common_element('description', NULL, $entry['description']);
+        common_element('pubDate', NULL, $entry['pubDate']);
+        common_element('guid', NULL, $entry['guid']);
+        common_element('link', NULL, $entry['link']);
+        common_element_end('item');
+    }
+
+    function show_twitter_atom_entry($entry) {
+        common_element_start('entry');
+        common_element('title', NULL, $entry['title']);
+        common_element('content', array('type' => 'html'), $entry['content']);
+        common_element('id', NULL, $entry['id']);
+        common_element('published', NULL, $entry['published']);
+        common_element('updated', NULL, $entry['updated']);
+        common_element('link', array('href' => $entry['link'], 'rel' => 'alternate', 'type' => 'text/html'), NULL);
+        common_element_end('entry');
+    }
+
+    function show_json_objects($objects) {
+        print(json_encode($objects));
+    }
+
+    function show_single_xml_status($notice) {
+        $this->init_document('xml');
+        $twitter_status = $this->twitter_status_array($notice);
+        $this->show_twitter_xml_status($twitter_status);
+        $this->end_document('xml');
+    }
+
+    function show_single_json_status($notice) {
+        $this->init_document('json');
+        $status = $this->twitter_status_array($notice);
+        $this->show_json_objects($status);
+        $this->end_document('json');
+    }
+
+    function show_single_xml_dmsg($message) {
+        $this->init_document('xml');
+        $dmsg = $this->twitter_dmsg_array($message);
+        $this->show_twitter_xml_dmsg($dmsg);
+        $this->end_document('xml');
+    }
+
+    function show_single_json_dmsg($message) {
+        $this->init_document('json');
+        $dmsg = $this->twitter_dmsg_array($message);
+        $this->show_json_objects($dmsg);
+        $this->end_document('json');
+    }
+
+    function show_twitter_xml_dmsg($twitter_dm) {
+        common_element_start('direct_message');
+        foreach($twitter_dm as $element => $value) {
+            switch ($element) {
+            case 'sender':
+            case 'recipient':
+                $this->show_twitter_xml_user($value, $element);
+                break;
+            case 'text':
+                common_element($element, NULL, common_xml_safe_str($value));
+                break;
+            default:
+                common_element($element, NULL, $value);
+            }
+        }
+        common_element_end('direct_message');
+    }
+
+    function show_xml_timeline($notice) {
+
+        $this->init_document('xml');
+        common_element_start('statuses', array('type' => 'array'));
+
+        if (is_array($notice)) {
+            foreach ($notice as $n) {
+                $twitter_status = $this->twitter_status_array($n);
+                $this->show_twitter_xml_status($twitter_status);
+            }
+        } else {
+            while ($notice->fetch()) {
+                $twitter_status = $this->twitter_status_array($notice);
+                $this->show_twitter_xml_status($twitter_status);
+            }
+        }
+
+        common_element_end('statuses');
+        $this->end_document('xml');
+    }
+
+    function show_rss_timeline($notice, $title, $link, $subtitle, $suplink=NULL) {
+
+        $this->init_document('rss');
+
+        common_element_start('channel');
+        common_element('title', NULL, $title);
+        common_element('link', NULL, $link);
+        if (!is_null($suplink)) {
+            # For FriendFeed's SUP protocol
+            common_element('link', array('xmlns' => 'http://www.w3.org/2005/Atom',
+                                         'rel' => 'http://api.friendfeed.com/2008/03#sup',
+                                         'href' => $suplink,
+                                         'type' => 'application/json'));
+        }
+        common_element('description', NULL, $subtitle);
+        common_element('language', NULL, 'en-us');
+        common_element('ttl', NULL, '40');
+
+        if (is_array($notice)) {
+            foreach ($notice as $n) {
+                $entry = $this->twitter_rss_entry_array($n);
+                $this->show_twitter_rss_item($entry);
+            }
+        } else {
+            while ($notice->fetch()) {
+                $entry = $this->twitter_rss_entry_array($notice);
+                $this->show_twitter_rss_item($entry);
+            }
+        }
+
+        common_element_end('channel');
+        $this->end_twitter_rss();
+    }
+
+    function show_atom_timeline($notice, $title, $id, $link, $subtitle=NULL, $suplink=NULL) {
+
+        $this->init_document('atom');
+
+        common_element('title', NULL, $title);
+        common_element('id', NULL, $id);
+        common_element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), NULL);
+        if (!is_null($suplink)) {
+            # For FriendFeed's SUP protocol
+            common_element('link', array('rel' => 'http://api.friendfeed.com/2008/03#sup',
+                                         'href' => $suplink,
+                                         'type' => 'application/json'));
+        }
+        common_element('subtitle', NULL, $subtitle);
+
+        if (is_array($notice)) {
+            foreach ($notice as $n) {
+                $entry = $this->twitter_rss_entry_array($n);
+                $this->show_twitter_atom_entry($entry);
+            }
+        } else {
+            while ($notice->fetch()) {
+                $entry = $this->twitter_rss_entry_array($notice);
+                $this->show_twitter_atom_entry($entry);
+            }
+        }
+
+        $this->end_document('atom');
+
+    }
+
+    function show_json_timeline($notice) {
+
+        $this->init_document('json');
+
+        $statuses = array();
+
+        if (is_array($notice)) {
+            foreach ($notice as $n) {
+                $twitter_status = $this->twitter_status_array($n);
+                array_push($statuses, $twitter_status);
+            }
+        } else {
+            while ($notice->fetch()) {
+                $twitter_status = $this->twitter_status_array($notice);
+                array_push($statuses, $twitter_status);
+            }
+        }
+
+        $this->show_json_objects($statuses);
+
+        $this->end_document('json');
+    }
+
+    // Anyone know what date format this is?
+    // Twitter's dates look like this: "Mon Jul 14 23:52:38 +0000 2008" -- Zach
+    function date_twitter($dt) {
+        $t = strtotime($dt);
+        return date("D M d G:i:s O Y", $t);
+    }
+
+    function replier_by_reply($reply_id) {
+        $notice = Notice::staticGet($reply_id);
+        if ($notice) {
+            $profile = $notice->getProfile();
+            if ($profile) {
+                return intval($profile->id);
+            } else {
+                common_debug('Can\'t find a profile for notice: ' . $notice->id, __FILE__);
+            }
+        } else {
+            common_debug("Can't get notice: $reply_id", __FILE__);
+        }
+        return NULL;
+    }
+
+    // XXX: Candidate for a general utility method somewhere?
+    function count_subscriptions($profile) {
+
+        $count = 0;
+        $sub = new Subscription();
+        $sub->subscribed = $profile->id;
+
+        $count = $sub->find();
+
+        if ($count > 0) {
+            return $count - 1;
+        } else {
+            return 0;
+        }
+    }
+
+    function init_document($type='xml') {
+        switch ($type) {
+         case 'xml':
+            header('Content-Type: application/xml; charset=utf-8');
+            common_start_xml();
+            break;
+         case 'json':
+            header('Content-Type: application/json; charset=utf-8');
+
+            // Check for JSONP callback
+            $callback = $this->arg('callback');
+            if ($callback) {
+                print $callback . '(';
+            }
+            break;
+         case 'rss':
+            header("Content-Type: application/rss+xml; charset=utf-8");
+            $this->init_twitter_rss();
+            break;
+         case 'atom':
+            header('Content-Type: application/atom+xml; charset=utf-8');
+            $this->init_twitter_atom();
+            break;
+         default:
+            $this->client_error(_('Not a supported data format.'));
+            break;
+        }
+
+        return;
+    }
+
+    function end_document($type='xml') {
+        switch ($type) {
+         case 'xml':
+            common_end_xml();
+            break;
+         case 'json':
+
+            // Check for JSONP callback
+            $callback = $this->arg('callback');
+            if ($callback) {
+                print ')';
+            }
+            break;
+         case 'rss':
+            $this->end_twitter_rss();
+            break;
+         case 'atom':
+            $this->end_twitter_rss();
+            break;
+         default:
+            $this->client_error(_('Not a supported data format.'));
+            break;
+        }
+        return;
+    }
+
+    function client_error($msg, $code = 400, $content_type = 'json') {
+
+        static $status = array(400 => 'Bad Request',
+                               401 => 'Unauthorized',
+                               402 => 'Payment Required',
+                               403 => 'Forbidden',
+                               404 => 'Not Found',
+                               405 => 'Method Not Allowed',
+                               406 => 'Not Acceptable',
+                               407 => 'Proxy Authentication Required',
+                               408 => 'Request Timeout',
+                               409 => 'Conflict',
+                               410 => 'Gone',
+                               411 => 'Length Required',
+                               412 => 'Precondition Failed',
+                               413 => 'Request Entity Too Large',
+                               414 => 'Request-URI Too Long',
+                               415 => 'Unsupported Media Type',
+                               416 => 'Requested Range Not Satisfiable',
+                               417 => 'Expectation Failed');
+
+        $action = $this->trimmed('action');
+
+        common_debug("User error '$code' on '$action': $msg", __FILE__);
+
+        if (!array_key_exists($code, $status)) {
+            $code = 400;
+        }
+
+        $status_string = $status[$code];
+        header('HTTP/1.1 '.$code.' '.$status_string);
+
+        if ($content_type == 'xml') {
+            $this->init_document('xml');
+            common_element_start('hash');
+            common_element('error', NULL, $msg);
+            common_element('request', NULL, $_SERVER['REQUEST_URI']);
+            common_element_end('hash');
+            $this->end_document('xml');
+        } else {
+            $this->init_document('json');
+            $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
+            print(json_encode($error_array));
+            $this->end_document('json');
+        }
+
+    }
+
+    function init_twitter_rss() {
+        common_start_xml();
+        common_element_start('rss', array('version' => '2.0'));
+    }
+
+    function end_twitter_rss() {
+        common_element_end('rss');
+        common_end_xml();
+    }
+
+    function init_twitter_atom() {
+        common_start_xml();
+        common_element_start('feed', array('xmlns' => 'http://www.w3.org/2005/Atom', 'xml:lang' => 'en-US'));
+    }
+
+    function end_twitter_atom() {
+        common_end_xml();
+        common_element_end('feed');
+    }
+
+    function show_profile($profile, $content_type='xml', $notice=NULL) {
+        $profile_array = $this->twitter_user_array($profile, true);
+        switch ($content_type) {
+         case 'xml':
+            $this->show_twitter_xml_user($profile_array);
+            break;
+         case 'json':
+            $this->show_json_objects($profile_array);
+            break;
+         default:
+            $this->client_error(_('Not a supported data format.'));
+            return;
+        }
+        return;
+    }
+
+    function get_user($id, $apidata=NULL) {
+        if (!$id) {
+            return $apidata['user'];
+        } else if (is_numeric($id)) {
+            return User::staticGet($id);
+        } else {
+            $nickname = common_canonical_nickname($id);
+            return User::staticGet('nickname', $nickname);
+        }
+    }
+
+    function get_profile($id) {
+        if (is_numeric($id)) {
+            return Profile::staticGet($id);
+        } else {
+            $user = User::staticGet('nickname', $id);
+            if ($user) {
+                return $user->getProfile();
+            } else {
+                return NULL;
+            }
+        }
+    }
+
+    function source_link($source) {
+        $source_name = _($source);
+        switch ($source) {
+         case 'web':
+         case 'xmpp':
+         case 'mail':
+         case 'omb':
+         case 'api':
+            break;
+         default:
+            $ns = Notice_source::staticGet($source);
+            if ($ns) {
+                $source_name = '<a href="' . $ns->url . '">' . $ns->name . '</a>';
+            }
+            break;
+        }
+        return $source_name;
+    }
+
+    function show_extended_profile($user, $apidata) {
+
+        $this->auth_user = $apidata['user'];
+
+        $profile = $user->getProfile();
+
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
+
+        $twitter_user = $this->twitter_user_array($profile, true);
+
+        // Add in extended user fields offered up by this method
+        $twitter_user['created_at'] = $this->date_twitter($profile->created);
+
+        $subbed = DB_DataObject::factory('subscription');
+        $subbed->subscriber = $profile->id;
+        $subbed_count = (int) $subbed->count() - 1;
+
+        $notices = DB_DataObject::factory('notice');
+        $notices->profile_id = $profile->id;
+        $notice_count = (int) $notices->count();
+
+        $twitter_user['friends_count'] = (is_int($subbed_count)) ? $subbed_count : 0;
+        $twitter_user['statuses_count'] = (is_int($notice_count)) ? $notice_count : 0;
+
+        // Other fields Twitter sends...
+        $twitter_user['profile_background_color'] = '';
+        $twitter_user['profile_text_color'] = '';
+        $twitter_user['profile_link_color'] = '';
+        $twitter_user['profile_sidebar_fill_color'] = '';
+
+        $faves = DB_DataObject::factory('fave');
+        $faves->user_id = $user->id;
+        $faves_count = (int) $faves->count();
+        $twitter_user['favourites_count'] = $faves_count;
+
+        $timezone = 'UTC';
+
+        if ($user->timezone) {
+            $timezone = $user->timezone;
+        }
+
+        $t = new DateTime;
+        $t->setTimezone(new DateTimeZone($timezone));
+        $twitter_user['utc_offset'] = $t->format('Z');
+        $twitter_user['time_zone'] = $timezone;
+
+        $following = 'false';
+
+        if (isset($this->auth_user)) {
+            if ($this->auth_user->isSubscribed($profile)) {
+                $following = 'true';
+            }
+
+            // Not implemented yet
+            $twitter_user['notifications'] = 'false';
+        }
+
+        $twitter_user['following'] = $following;
+
+        if ($apidata['content-type'] == 'xml') {
+            $this->init_document('xml');
+            $this->show_twitter_xml_user($twitter_user);
+            $this->end_document('xml');
+        } elseif ($apidata['content-type'] == 'json') {
+            $this->init_document('json');
+            $this->show_json_objects($twitter_user);
+            $this->end_document('json');
+        }
+
+    }
 
 }
\ No newline at end of file
index cfc9642e4c159a602a00dda22edfdaab2fa7befd..33b987291654ef063ba8d62dc76f62add2fa8a75 100644 (file)
@@ -29,63 +29,63 @@ require_once(INSTALLDIR.'/lib/queuehandler.php');
  */
 
 class XmppQueueHandler extends QueueHandler {
-       
-       function start() {
-               # Low priority; we don't want to receive messages
-               $this->log(LOG_INFO, "INITIALIZE");
-               $this->conn = jabber_connect($this->_id);
-               if ($this->conn) {
-                       $this->conn->addEventHandler('message', 'forward_message', $this);
-                       $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
-                       $this->conn->setReconnectTimeout(600);
-                       jabber_send_presence("Send me a message to post a notice", 'available', NULL, 'available', -1);
-               }
-               return !is_null($this->conn);
-       }
-       
-       function handle_reconnect(&$pl) {
-               $this->conn->processUntil('session_start');
-               $this->conn->presence(NULL, 'available', NULL, 'available', -1);
-       }
+    
+    function start() {
+        # Low priority; we don't want to receive messages
+        $this->log(LOG_INFO, "INITIALIZE");
+        $this->conn = jabber_connect($this->_id);
+        if ($this->conn) {
+            $this->conn->addEventHandler('message', 'forward_message', $this);
+            $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
+            $this->conn->setReconnectTimeout(600);
+            jabber_send_presence("Send me a message to post a notice", 'available', NULL, 'available', -1);
+        }
+        return !is_null($this->conn);
+    }
+    
+    function handle_reconnect(&$pl) {
+        $this->conn->processUntil('session_start');
+        $this->conn->presence(NULL, 'available', NULL, 'available', -1);
+    }
 
-       function idle($timeout=0) {
-               # Process the queue for as long as needed
-               try {
-                       if ($this->conn) {
-                               $this->conn->processTime($timeout);
-                       }
-               } catch (XMPPHP_Exception $e) {
-                       $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
-                       die($e->getMessage());
-               }
-       }
-       
-       function forward_message(&$pl) {
-               if ($pl['type'] != 'chat') {
-                   $this->log(LOG_DEBUG, 'Ignoring message of type ' . $pl['type'] . ' from ' . $pl['from']);
-                       return;
-               }
-               $listener = $this->listener();
-               if (strtolower($listener) == strtolower($pl['from'])) {
-                       $this->log(LOG_WARNING, 'Ignoring loop message.');
-                       return;
-               }
-               $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 idle($timeout=0) {
+        # Process the queue for as long as needed
+        try {
+            if ($this->conn) {
+                $this->conn->processTime($timeout);
+            }
+        } catch (XMPPHP_Exception $e) {
+            $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
+            die($e->getMessage());
+        }
+    }
+    
+    function forward_message(&$pl) {
+        if ($pl['type'] != 'chat') {
+            $this->log(LOG_DEBUG, 'Ignoring message of type ' . $pl['type'] . ' from ' . $pl['from']);
+            return;
+        }
+        $listener = $this->listener();
+        if (strtolower($listener) == strtolower($pl['from'])) {
+            $this->log(LOG_WARNING, 'Ignoring loop message.');
+            return;
+        }
+        $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 = "<addresses xmlns='http://jabber.org/protocol/address'>\n";
-               $address .= "<address type='ofrom' jid='$from' />\n";
-               $address .= "</addresses>\n";
-               return $address;
-       }
+    function ofrom($from) {
+        $address = "<addresses xmlns='http://jabber.org/protocol/address'>\n";
+        $address .= "<address type='ofrom' jid='$from' />\n";
+        $address .= "</addresses>\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';
-               }
-       }
+    function listener() {
+        if (common_config('xmpp', 'listener')) {
+            return common_config('xmpp', 'listener');
+        } else {
+            return jabber_daemon_address() . '/' . common_config('xmpp','resource') . '-listener';
+        }
+    }
 }
index 8538ae09a2c561aaac2cfb80751c96dc1b5521b7..cfb2537533b91cd98780f74ef102c98759b38f07 100644 (file)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -34,20 +34,20 @@ require_once(INSTALLDIR . '/lib/queuehandler.php');
 set_error_handler('common_error_handler');
 
 class EnjitQueueHandler extends QueueHandler {
-       
-       function transport() {
-               return 'enjit';
-       }
+    
+    function transport() {
+        return 'enjit';
+    }
 
-       function start() {
+    function start() {
                 $this->log(LOG_INFO, "Starting EnjitQueueHandler");
                 $this->log(LOG_INFO, "Broadcasting to ".common_config('enjit', 'apiurl'));
-               return true;
-       }
+        return true;
+    }
 
-       function handle_notice($notice) {
+    function handle_notice($notice) {
 
-               $profile = Profile::staticGet($notice->profile_id);
+        $profile = Profile::staticGet($notice->profile_id);
 
                 $this->log(LOG_INFO, "Posting Notice ".$notice->id." from ".$profile->nickname);
 
@@ -60,25 +60,25 @@ class EnjitQueueHandler extends QueueHandler {
                 #
                 # Build an Atom message from the notice
                 #
-               $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
-               $msg = $profile->nickname . ': ' . $notice->content;
-
-               $atom  = "<entry xmlns='http://www.w3.org/2005/Atom'>\n";
-               $atom .= "<apisource>".common_config('enjit','source')."</apisource>\n";
-               $atom .= "<source>\n";
-               $atom .= "<title>" . $profile->nickname . " - " . common_config('site', 'name') . "</title>\n";
-               $atom .= "<link href='" . $profile->profileurl . "'/>\n";
-               $atom .= "<link rel='self' type='application/rss+xml' href='" . common_local_url('userrss', array('nickname' => $profile->nickname)) . "'/>\n";
-               $atom .= "<author><name>" . $profile->nickname . "</name></author>\n";
-               $atom .= "<icon>" . common_profile_avatar_url($profile, AVATAR_PROFILE_SIZE) . "</icon>\n";
-               $atom .= "</source>\n";
-               $atom .= "<title>" . htmlspecialchars($msg) . "</title>\n";
-               $atom .= "<summary>" . htmlspecialchars($msg) . "</summary>\n";
-               $atom .= "<link rel='alternate' href='" . $noticeurl . "' />\n";
-               $atom .= "<id>". $notice->uri . "</id>\n";
-               $atom .= "<published>".common_date_w3dtf($notice->created)."</published>\n";
-               $atom .= "<updated>".common_date_w3dtf($notice->modified)."</updated>\n";
-               $atom .= "</entry>\n";
+        $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
+        $msg = $profile->nickname . ': ' . $notice->content;
+
+        $atom  = "<entry xmlns='http://www.w3.org/2005/Atom'>\n";
+        $atom .= "<apisource>".common_config('enjit','source')."</apisource>\n";
+        $atom .= "<source>\n";
+        $atom .= "<title>" . $profile->nickname . " - " . common_config('site', 'name') . "</title>\n";
+        $atom .= "<link href='" . $profile->profileurl . "'/>\n";
+        $atom .= "<link rel='self' type='application/rss+xml' href='" . common_local_url('userrss', array('nickname' => $profile->nickname)) . "'/>\n";
+        $atom .= "<author><name>" . $profile->nickname . "</name></author>\n";
+        $atom .= "<icon>" . common_profile_avatar_url($profile, AVATAR_PROFILE_SIZE) . "</icon>\n";
+        $atom .= "</source>\n";
+        $atom .= "<title>" . htmlspecialchars($msg) . "</title>\n";
+        $atom .= "<summary>" . htmlspecialchars($msg) . "</summary>\n";
+        $atom .= "<link rel='alternate' href='" . $noticeurl . "' />\n";
+        $atom .= "<id>". $notice->uri . "</id>\n";
+        $atom .= "<published>".common_date_w3dtf($notice->created)."</published>\n";
+        $atom .= "<updated>".common_date_w3dtf($notice->modified)."</updated>\n";
+        $atom .= "</entry>\n";
 
                 $url  = common_config('enjit', 'apiurl') . "/submit/". common_config('enjit','apikey');
                 $data = "msg=$atom";
@@ -86,32 +86,32 @@ class EnjitQueueHandler extends QueueHandler {
                 #
                 # POST the message to $config['enjit']['apiurl']
                 #
-               $ch   = curl_init();
+        $ch   = curl_init();
 
-               curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_URL, $url);
  
                 curl_setopt($ch, CURLOPT_HEADER, 1); 
-               curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-               curl_setopt($ch, CURLOPT_POST, 1) ;
-               curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($ch, CURLOPT_POST, 1) ;
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 
                 # SSL and Debugging options
                 #
-               # curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
-               # curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
+        # curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
+        # curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                 # curl_setopt($ch, CURLOPT_VERBOSE, 1); 
 
-               $result = curl_exec($ch);
+        $result = curl_exec($ch);
 
-               $code = curl_getinfo($ch, CURLINFO_HTTP_CODE );
+        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE );
 
                 $this->log(LOG_INFO, "Response Code: $code");
 
-               curl_close($ch);
+        curl_close($ch);
 
                 return $code;
-       }
-       
+    }
+    
 
 }
 
@@ -122,7 +122,7 @@ $id = ($argc > 1) ? $argv[1] : NULL;
 $handler = new EnjitQueueHandler($id);
 
 if ($handler->start()) {
-       $handler->handle_queue();
+    $handler->handle_queue();
 }
 
 $handler->finish();
index 88f385798d0496c930e9f6e1a4346153ad532590..6f65c78a1fe8f8971c3ed5ad0d90b04cd5f2ed63 100644 (file)
@@ -37,10 +37,10 @@ $cnt = $notice->find();
 while ($notice->fetch()) {
     common_log(LOG_INFO, 'Getting tags for notice #' . $notice->id);
     $notice->saveTags();
-       $original = clone($notice);
-       $notice->rendered = common_render_content($notice->content, $notice);
-       $result = $notice->update($original);
-       if (!$result) {
-               common_log_db_error($notice, 'UPDATE', __FILE__);
-       }
+    $original = clone($notice);
+    $notice->rendered = common_render_content($notice->content, $notice);
+    $result = $notice->update($original);
+    if (!$result) {
+        common_log_db_error($notice, 'UPDATE', __FILE__);
+    }
 }
index 1715b0bc1ba22d13b3461121672f385772b02684..e631a80ed8906423081665646d987f9e5265869d 100644 (file)
@@ -41,7 +41,7 @@ common_log(LOG_INFO, 'Updating user inboxes.');
 $user = new User();
 
 if ($start_at) {
-       $user->whereAdd('id >= ' . $start_at);
+    $user->whereAdd('id >= ' . $start_at);
 }
 
 $cnt = $user->find();
@@ -49,32 +49,32 @@ $cache = common_memcache();
 
 while ($user->fetch()) {
     common_log(LOG_INFO, 'Updating inbox for user ' . $user->id);
-       $user->query('BEGIN');
-       $inbox = new Notice_inbox();
-       $result = $inbox->query('INSERT LOW_PRIORITY INTO notice_inbox (user_id, notice_id, created) ' .
-                                                       'SELECT ' . $user->id . ', notice.id, notice.created ' .
-                                                       'FROM subscription JOIN notice ON subscription.subscribed = notice.profile_id ' .
-                                                       'WHERE subscription.subscriber = ' . $user->id . ' ' .
-                                                       'AND notice.created >= subscription.created ' . 
-                                                       'AND NOT EXISTS (SELECT user_id, notice_id ' .
-                                                       'FROM notice_inbox ' .
-                                                       'WHERE user_id = ' . $user->id . ' ' . 
-                                                       'AND notice_id = notice.id)');
-       if (is_null($result) || $result === false) {
-               common_log_db_error($inbox, 'INSERT', __FILE__);
-               continue;
-       }
-       $orig = clone($user);
-       $user->inboxed = 1;
-       $result = $user->update($orig);
-       if (!$result) {
-               common_log_db_error($user, 'UPDATE', __FILE__);
-               continue;
-       }
-       $user->query('COMMIT');
-       $inbox->free();
-       unset($inbox);
-       if ($cache) {
-               $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
-       }
+    $user->query('BEGIN');
+    $inbox = new Notice_inbox();
+    $result = $inbox->query('INSERT LOW_PRIORITY INTO notice_inbox (user_id, notice_id, created) ' .
+                            'SELECT ' . $user->id . ', notice.id, notice.created ' .
+                            'FROM subscription JOIN notice ON subscription.subscribed = notice.profile_id ' .
+                            'WHERE subscription.subscriber = ' . $user->id . ' ' .
+                            'AND notice.created >= subscription.created ' . 
+                            'AND NOT EXISTS (SELECT user_id, notice_id ' .
+                            'FROM notice_inbox ' .
+                            'WHERE user_id = ' . $user->id . ' ' . 
+                            'AND notice_id = notice.id)');
+    if (is_null($result) || $result === false) {
+        common_log_db_error($inbox, 'INSERT', __FILE__);
+        continue;
+    }
+    $orig = clone($user);
+    $user->inboxed = 1;
+    $result = $user->update($orig);
+    if (!$result) {
+        common_log_db_error($user, 'UPDATE', __FILE__);
+        continue;
+    }
+    $user->query('COMMIT');
+    $inbox->free();
+    unset($inbox);
+    if ($cache) {
+        $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+    }
 }
index c6c925729eca884dc446a3450185561a73edd30d..1fa9f394e20b6aa248cdabd1e469071ce9c3e04c 100644 (file)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -35,16 +35,16 @@ $start_at = ($argc > 1) ? $argv[1] : NULL;
 
 $notice = new Notice();
 if ($start_at) {
-       $notice->whereAdd('id >= ' . $start_at);
+    $notice->whereAdd('id >= ' . $start_at);
 }
 $cnt = $notice->find();
 
 while ($notice->fetch()) {
-       common_log(LOG_INFO, 'Pre-rendering notice #' . $notice->id);
-       $original = clone($notice);
-       $notice->rendered = common_render_content($notice->content, $notice);
-       $result = $notice->update($original);
-       if (!$result) {
-               common_log_db_error($notice, 'UPDATE', __FILE__);
-       }
+    common_log(LOG_INFO, 'Pre-rendering notice #' . $notice->id);
+    $original = clone($notice);
+    $notice->rendered = common_render_content($notice->content, $notice);
+    $result = $notice->update($original);
+    if (!$result) {
+        common_log_db_error($notice, 'UPDATE', __FILE__);
+    }
 }
index b4dda2254cef080d3bccf150d6e2c836ccaf23aa..4f5704249319b018beee7be4dcdc613fe0997621 100644 (file)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
index 0543abb2a33bb46e045699ed78faa711192a2167..f907e158416099b87df2da8d0b66d9fcd26927ff 100644 (file)
@@ -42,68 +42,68 @@ common_log(LOG_INFO, 'Updating user inboxes.');
 $ids = file($id_file);
 
 foreach ($ids as $id) {
-       
-       $user = User::staticGet('id', $id);
+    
+    $user = User::staticGet('id', $id);
 
-       if (!$user) {
-               common_log(LOG_WARNING, 'No such user: ' . $id);
-               continue;
-       }
-       
-       if ($user->inboxed) {
-               common_log(LOG_WARNING, 'Already inboxed: ' . $id);
-               continue;
-       }
-       
+    if (!$user) {
+        common_log(LOG_WARNING, 'No such user: ' . $id);
+        continue;
+    }
+    
+    if ($user->inboxed) {
+        common_log(LOG_WARNING, 'Already inboxed: ' . $id);
+        continue;
+    }
+    
     common_log(LOG_INFO, 'Updating inbox for user ' . $user->id);
-       
-       $user->query('BEGIN');
-       
-       $old_inbox = new Notice_inbox();
-       $old_inbox->user_id = $user->id;
-       
-       $result = $old_inbox->delete();
-       
-       if (is_null($result) || $result === false) {
-               common_log_db_error($old_inbox, 'DELETE', __FILE__);
-               continue;
-       }
+    
+    $user->query('BEGIN');
+    
+    $old_inbox = new Notice_inbox();
+    $old_inbox->user_id = $user->id;
+    
+    $result = $old_inbox->delete();
+    
+    if (is_null($result) || $result === false) {
+        common_log_db_error($old_inbox, 'DELETE', __FILE__);
+        continue;
+    }
 
-       $old_inbox->free();
-       
-       $inbox = new Notice_inbox();
-       
-       $result = $inbox->query('INSERT INTO notice_inbox (user_id, notice_id, created) ' .
-                                                       'SELECT ' . $user->id . ', notice.id, notice.created ' .
-                                                       'FROM subscription JOIN notice ON subscription.subscribed = notice.profile_id ' .
-                                                       'WHERE subscription.subscriber = ' . $user->id . ' ' .
-                                                       'AND notice.created >= subscription.created ' .
-                                                       'AND now() - notice.created < ' . (7 * 24 * 3600) . ' ' .
-                                                       'AND NOT EXISTS (SELECT user_id, notice_id ' .
-                                                       'FROM notice_inbox ' .
-                                                       'WHERE user_id = ' . $user->id . ' ' . 
-                                                       'AND notice_id = notice.id)');
-       
-       if (is_null($result) || $result === false) {
-               common_log_db_error($inbox, 'INSERT', __FILE__);
-               continue;
-       }
-       
-       $orig = clone($user);
-       $user->inboxed = 1;
-       $result = $user->update($orig);
-       
-       if (!$result) {
-               common_log_db_error($user, 'UPDATE', __FILE__);
-               continue;
-       }
-       
-       $user->query('COMMIT');
-       
-       $inbox->free();
-       unset($inbox);
-       
-       if ($cache) {
-               $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
-       }
+    $old_inbox->free();
+    
+    $inbox = new Notice_inbox();
+    
+    $result = $inbox->query('INSERT INTO notice_inbox (user_id, notice_id, created) ' .
+                            'SELECT ' . $user->id . ', notice.id, notice.created ' .
+                            'FROM subscription JOIN notice ON subscription.subscribed = notice.profile_id ' .
+                            'WHERE subscription.subscriber = ' . $user->id . ' ' .
+                            'AND notice.created >= subscription.created ' .
+                            'AND now() - notice.created < ' . (7 * 24 * 3600) . ' ' .
+                            'AND NOT EXISTS (SELECT user_id, notice_id ' .
+                            'FROM notice_inbox ' .
+                            'WHERE user_id = ' . $user->id . ' ' . 
+                            'AND notice_id = notice.id)');
+    
+    if (is_null($result) || $result === false) {
+        common_log_db_error($inbox, 'INSERT', __FILE__);
+        continue;
+    }
+    
+    $orig = clone($user);
+    $user->inboxed = 1;
+    $result = $user->update($orig);
+    
+    if (!$result) {
+        common_log_db_error($user, 'UPDATE', __FILE__);
+        continue;
+    }
+    
+    $user->query('COMMIT');
+    
+    $inbox->free();
+    unset($inbox);
+    
+    if ($cache) {
+        $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+    }
 }
index 59cdb94ad72e28dd0e0b6dd861f72ddf51fcbb01..8e33cfaf0d7529448570524eb7dd9bc9799cd1c4 100644 (file)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -35,20 +35,20 @@ set_error_handler('common_error_handler');
 
 class JabberQueueHandler extends XmppQueueHandler {
 
-       var $conn = NULL;
+    var $conn = NULL;
 
-       function transport() {
-               return 'jabber';
-       }
+    function transport() {
+        return 'jabber';
+    }
 
-       function handle_notice($notice) {
-               try {
-                       return jabber_broadcast_notice($notice);
-               } catch (XMPPHP_Exception $e) {
-                       $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
-                       exit(1);
-               }
-       }
+    function handle_notice($notice) {
+        try {
+            return jabber_broadcast_notice($notice);
+        } catch (XMPPHP_Exception $e) {
+            $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
+            exit(1);
+        }
+    }
 }
 
 ini_set("max_execution_time", "0");
index 8b809f646eb88c97d2020857bf40e6988aa0e804..6d850751482d032845409c86fc9576b3a0b71afd 100644 (file)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -36,179 +36,179 @@ require_once('Mail/mimeDecode.php');
 
 class MailerDaemon {
 
-       function __construct() {
-       }
-
-       function handle_message($fname='php://stdin') {
-               list($from, $to, $msg) = $this->parse_message($fname);
-               if (!$from || !$to || !$msg) {
-                       $this->error(NULL, _('Could not parse message.'));
-               }
-               common_log(LOG_INFO, "Mail from $from to $to: " .substr($msg, 0, 20));
-               $user = $this->user_from($from);
-               if (!$user) {
-                       $this->error($from, _('Not a registered user.'));
-                       return false;
-               }
-               if (!$this->user_match_to($user, $to)) {
-                       $this->error($from, _('Sorry, that is not your incoming email address.'));
-                       return false;
-               }
-               if (!$user->emailpost) {
-                       $this->error($from, _('Sorry, no incoming email allowed.'));
-                       return false;
-               }
-               $response = $this->handle_command($user, $from, $msg);
-               if ($response) {
-                       return true;
-               }
-               $msg = $this->cleanup_msg($msg);
-               $this->add_notice($user, $msg);
-       }
-
-       function error($from, $msg) {
-               file_put_contents("php://stderr", $msg . "\n");
-               exit(1);
-       }
-
-       function user_from($from_hdr) {
-               $froms = mailparse_rfc822_parse_addresses($from_hdr);
-               if (!$froms) {
-                       return NULL;
-               }
-               $from = $froms[0];
-               $addr = common_canonical_email($from['address']);
-               $user = User::staticGet('email', $addr);
-               if (!$user) {
-                       $user = User::staticGet('smsemail', $addr);
-               }
-               return $user;
-       }
-
-       function user_match_to($user, $to_hdr) {
-               $incoming = $user->incomingemail;
-               $tos = mailparse_rfc822_parse_addresses($to_hdr);
-               foreach ($tos as $to) {
-                       if (strcasecmp($incoming, $to['address']) == 0) {
-                               return true;
-                       }
-               }
-               return false;
-       }
-
-       function handle_command($user, $from, $msg) {
-               $inter = new CommandInterpreter();
-               $cmd = $inter->handle_command($user, $msg);
-               if ($cmd) {
-                       $cmd->execute(new MailChannel($from));
-                       return true;
-               }
-               return false;
-       }
-
-       function respond($from, $to, $response) {
-
-               $headers['From'] = $to;
-               $headers['To'] = $from;
-               $headers['Subject'] = "Command complete";
-
-               return mail_send(array($from), $headers, $response);
-       }
-
-       function log($level, $msg) {
-               common_log($level, 'MailDaemon: '.$msg);
-       }
-
-       function add_notice($user, $msg) {
+    function __construct() {
+    }
+
+    function handle_message($fname='php://stdin') {
+        list($from, $to, $msg) = $this->parse_message($fname);
+        if (!$from || !$to || !$msg) {
+            $this->error(NULL, _('Could not parse message.'));
+        }
+        common_log(LOG_INFO, "Mail from $from to $to: " .substr($msg, 0, 20));
+        $user = $this->user_from($from);
+        if (!$user) {
+            $this->error($from, _('Not a registered user.'));
+            return false;
+        }
+        if (!$this->user_match_to($user, $to)) {
+            $this->error($from, _('Sorry, that is not your incoming email address.'));
+            return false;
+        }
+        if (!$user->emailpost) {
+            $this->error($from, _('Sorry, no incoming email allowed.'));
+            return false;
+        }
+        $response = $this->handle_command($user, $from, $msg);
+        if ($response) {
+            return true;
+        }
+        $msg = $this->cleanup_msg($msg);
+        $this->add_notice($user, $msg);
+    }
+
+    function error($from, $msg) {
+        file_put_contents("php://stderr", $msg . "\n");
+        exit(1);
+    }
+
+    function user_from($from_hdr) {
+        $froms = mailparse_rfc822_parse_addresses($from_hdr);
+        if (!$froms) {
+            return NULL;
+        }
+        $from = $froms[0];
+        $addr = common_canonical_email($from['address']);
+        $user = User::staticGet('email', $addr);
+        if (!$user) {
+            $user = User::staticGet('smsemail', $addr);
+        }
+        return $user;
+    }
+
+    function user_match_to($user, $to_hdr) {
+        $incoming = $user->incomingemail;
+        $tos = mailparse_rfc822_parse_addresses($to_hdr);
+        foreach ($tos as $to) {
+            if (strcasecmp($incoming, $to['address']) == 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    function handle_command($user, $from, $msg) {
+        $inter = new CommandInterpreter();
+        $cmd = $inter->handle_command($user, $msg);
+        if ($cmd) {
+            $cmd->execute(new MailChannel($from));
+            return true;
+        }
+        return false;
+    }
+
+    function respond($from, $to, $response) {
+
+        $headers['From'] = $to;
+        $headers['To'] = $from;
+        $headers['Subject'] = "Command complete";
+
+        return mail_send(array($from), $headers, $response);
+    }
+
+    function log($level, $msg) {
+        common_log($level, 'MailDaemon: '.$msg);
+    }
+
+    function add_notice($user, $msg) {
         // should test
         // $msg_shortened = common_shorten_links($msg);
         // if (mb_strlen($msg_shortened) > 140) ERROR and STOP
-               $notice = Notice::saveNew($user->id, $msg, 'mail');
-               if (is_string($notice)) {
-                       $this->log(LOG_ERR, $notice);
-                       return;
-               }
-               common_broadcast_notice($notice);
-               $this->log(LOG_INFO,
-                                  'Added notice ' . $notice->id . ' from user ' . $user->nickname);
-       }
-
-       function parse_message($fname) {
-               $contents = file_get_contents($fname);
-               $parsed = Mail_mimeDecode::decode(array('input' => $contents,
-                                                                                               'include_bodies' => true,
-                                                                                               'decode_headers' => true,
-                                                                                               'decode_bodies' => true));
-               if (!$parsed) {
-                       return NULL;
-               }
-
-               $from = $parsed->headers['from'];
-
-               $to = $parsed->headers['to'];
-
-               $type = $parsed->ctype_primary . '/' . $parsed->ctype_secondary;
-
-               if ($parsed->ctype_primary == 'multipart') {
-                       foreach ($parsed->parts as $part) {
-                               if ($part->ctype_primary == 'text' &&
-                                       $part->ctype_secondary == 'plain') {
-                                       $msg = $part->body;
-                                       break;
-                               }
-                       }
-               } else if ($type == 'text/plain') {
-                       $msg = $parsed->body;
-               } else {
-                       $this->unsupported_type($type);
-               }
-
-               return array($from, $to, $msg);
-       }
-
-       function unsupported_type($type) {
-               $this->error(NULL, "Unsupported message type: " . $type);
-       }
-
-       function cleanup_msg($msg) {
-               $lines = explode("\n", $msg);
-
-               $output = '';
-
-               foreach ($lines as $line) {
-                       // skip quotes
-                       if (preg_match('/^\s*>.*$/', $line)) {
-                               continue;
-                       }
-                       // skip start of quote
-                       if (preg_match('/^\s*On.*wrote:\s*$/', $line)) {
-                               continue;
-                       }
-                       // probably interesting to someone, not us
-                       if (preg_match('/^\s*Sent via/', $line)) {
-                               continue;
-                       }
-                       // skip everything after a sig
-                       if (preg_match('/^\s*--+\s*$/', $line) ||
-                               preg_match('/^\s*__+\s*$/', $line))
-                       {
-                               break;
-                       }
-                       // skip everything after Outlook quote
-                       if (preg_match('/^\s*-+\s*Original Message\s*-+\s*$/', $line)) {
-                               break;
-                       }
-                       // skip everything after weird forward
-                       if (preg_match('/^\s*Begin\s+forward/', $line)) {
-                               break;
-                       }
-
-                       $output .= ' ' . $line;
-               }
-
-               preg_replace('/\s+/', ' ', $output);
-               return trim($output);
-       }
+        $notice = Notice::saveNew($user->id, $msg, 'mail');
+        if (is_string($notice)) {
+            $this->log(LOG_ERR, $notice);
+            return;
+        }
+        common_broadcast_notice($notice);
+        $this->log(LOG_INFO,
+                   'Added notice ' . $notice->id . ' from user ' . $user->nickname);
+    }
+
+    function parse_message($fname) {
+        $contents = file_get_contents($fname);
+        $parsed = Mail_mimeDecode::decode(array('input' => $contents,
+                                                'include_bodies' => true,
+                                                'decode_headers' => true,
+                                                'decode_bodies' => true));
+        if (!$parsed) {
+            return NULL;
+        }
+
+        $from = $parsed->headers['from'];
+
+        $to = $parsed->headers['to'];
+
+        $type = $parsed->ctype_primary . '/' . $parsed->ctype_secondary;
+
+        if ($parsed->ctype_primary == 'multipart') {
+            foreach ($parsed->parts as $part) {
+                if ($part->ctype_primary == 'text' &&
+                    $part->ctype_secondary == 'plain') {
+                    $msg = $part->body;
+                    break;
+                }
+            }
+        } else if ($type == 'text/plain') {
+            $msg = $parsed->body;
+        } else {
+            $this->unsupported_type($type);
+        }
+
+        return array($from, $to, $msg);
+    }
+
+    function unsupported_type($type) {
+        $this->error(NULL, "Unsupported message type: " . $type);
+    }
+
+    function cleanup_msg($msg) {
+        $lines = explode("\n", $msg);
+
+        $output = '';
+
+        foreach ($lines as $line) {
+            // skip quotes
+            if (preg_match('/^\s*>.*$/', $line)) {
+                continue;
+            }
+            // skip start of quote
+            if (preg_match('/^\s*On.*wrote:\s*$/', $line)) {
+                continue;
+            }
+            // probably interesting to someone, not us
+            if (preg_match('/^\s*Sent via/', $line)) {
+                continue;
+            }
+            // skip everything after a sig
+            if (preg_match('/^\s*--+\s*$/', $line) ||
+                preg_match('/^\s*__+\s*$/', $line))
+            {
+                break;
+            }
+            // skip everything after Outlook quote
+            if (preg_match('/^\s*-+\s*Original Message\s*-+\s*$/', $line)) {
+                break;
+            }
+            // skip everything after weird forward
+            if (preg_match('/^\s*Begin\s+forward/', $line)) {
+                break;
+            }
+
+            $output .= ' ' . $line;
+        }
+
+        preg_replace('/\s+/', ' ', $output);
+        return trim($output);
+    }
 }
 
 $md = new MailerDaemon();
index 1df816d1403e2b49566313a8b57a048623a9ce1f..31ae20f00caae405025ac1d69f67386899cd8760 100644 (file)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -34,32 +34,32 @@ require_once(INSTALLDIR . '/lib/queuehandler.php');
 set_error_handler('common_error_handler');
 
 class OmbQueueHandler extends QueueHandler {
-       
-       function transport() {
-               return 'omb';
-       }
-       
-       function start() {
-               $this->log(LOG_INFO, "INITIALIZE");
-               return true;
-       }
+    
+    function transport() {
+        return 'omb';
+    }
+    
+    function start() {
+        $this->log(LOG_INFO, "INITIALIZE");
+        return true;
+    }
 
-       function handle_notice($notice) {
-               if ($this->is_remote($notice)) {
-                       $this->log(LOG_DEBUG, 'Ignoring remote notice ' . $notice->id);
-                       return true;
-               } else {
-                       return omb_broadcast_remote_subscribers($notice);
-               }
-       }
-       
-       function finish() {
-       }
+    function handle_notice($notice) {
+        if ($this->is_remote($notice)) {
+            $this->log(LOG_DEBUG, 'Ignoring remote notice ' . $notice->id);
+            return true;
+        } else {
+            return omb_broadcast_remote_subscribers($notice);
+        }
+    }
+    
+    function finish() {
+    }
 
-       function is_remote($notice) {
-               $user = User::staticGet($notice->profile_id);
-               return is_null($user);
-       }
+    function is_remote($notice) {
+        $user = User::staticGet($notice->profile_id);
+        return is_null($user);
+    }
 }
 
 ini_set("max_execution_time", "0");
index b1ae1d581dbcdda2ec57039183a264d4bbd3d5ac..2168aade29ba21523deaf9d9d0e2cdab5e8bd76d 100644 (file)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -34,19 +34,19 @@ require_once(INSTALLDIR . '/lib/xmppqueuehandler.php');
 set_error_handler('common_error_handler');
 
 class PublicQueueHandler extends XmppQueueHandler {
-       
-       function transport() {
-               return 'public';
-       }
-       
-       function handle_notice($notice) {
-               try {
-                       return jabber_public_notice($notice);
-               } catch (XMPPHP_Exception $e) {
-                       $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
-                       die($e->getMessage());
-               }
-       }
+    
+    function transport() {
+        return 'public';
+    }
+    
+    function handle_notice($notice) {
+        try {
+            return jabber_public_notice($notice);
+        } catch (XMPPHP_Exception $e) {
+            $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
+            die($e->getMessage());
+        }
+    }
 }
 
 ini_set("max_execution_time", "0");
index 6b845beae1d50b91db49c06c42d1cd782bb0cc05..b49bfe2a5f60bfaa47d8b894bf707092520e1338 100644 (file)
@@ -19,188 +19,188 @@ index_map();
 
 # Generate index sitemap of all other sitemaps.
 function index_map() {
-       global $output_paths;
-       $output_dir = $output_paths['output_dir'];
-       $output_url = $output_paths['output_url'];
+    global $output_paths;
+    $output_dir = $output_paths['output_dir'];
+    $output_url = $output_paths['output_url'];
 
-       foreach (glob("$output_dir*.xml") as $file_name) {
+    foreach (glob("$output_dir*.xml") as $file_name) {
 
-               # Just the file name please.
-               $file_name = preg_replace("|$output_dir|", '', $file_name);
+        # Just the file name please.
+        $file_name = preg_replace("|$output_dir|", '', $file_name);
 
-               $index_urls .= sitemap(
-                                                  array(
-                                                                'url' => $output_url . $file_name,
-                                                                'changefreq' => 'daily'
-                                                                )
-                                                  );
-       }
+        $index_urls .= sitemap(
+                           array(
+                                 'url' => $output_url . $file_name,
+                                 'changefreq' => 'daily'
+                                 )
+                           );
+    }
 
-       write_file($output_paths['index_file'], sitemapindex($index_urls));
+    write_file($output_paths['index_file'], sitemapindex($index_urls));
 }
 
 # Generate sitemap of standard site elements.
 function standard_map() {
-       global $output_paths;
-
-       $standard_map_urls .= url(
-                                                         array(
-                                                                       'url' => common_local_url('public'),
-                                                                       'changefreq' => 'daily',
-                                                                       'priority' => '1',
-                                                                       )
-                                                         );
-
-       $standard_map_urls .= url(
-                                                         array(
-                                                                       'url' => common_local_url('publicrss'),
-                                                                       'changefreq' => 'daily',
-                                                                       'priority' => '0.3',
-                                                                       )
-                                                         );
-
-       $docs = array('about', 'faq', 'contact', 'im', 'openid', 'openmublog', 'privacy', 'source');
-
-       foreach($docs as $title) {
-               $standard_map_urls .= url(
-                                                                 array(
-                                                                               'url' => common_local_url('doc', array('title' => $title)),
-                                                                               'changefreq' => 'monthly',
-                                                                               'priority'   => '0.2',
-                                                                               )
-                                                                 );
-       }
-
-       $urlset_path = $output_paths['output_dir'] . 'standard.xml';
-
-       write_file($urlset_path, urlset($standard_map_urls));
+    global $output_paths;
+
+    $standard_map_urls .= url(
+                              array(
+                                    'url' => common_local_url('public'),
+                                    'changefreq' => 'daily',
+                                    'priority' => '1',
+                                    )
+                              );
+
+    $standard_map_urls .= url(
+                              array(
+                                    'url' => common_local_url('publicrss'),
+                                    'changefreq' => 'daily',
+                                    'priority' => '0.3',
+                                    )
+                              );
+
+    $docs = array('about', 'faq', 'contact', 'im', 'openid', 'openmublog', 'privacy', 'source');
+
+    foreach($docs as $title) {
+        $standard_map_urls .= url(
+                                  array(
+                                        'url' => common_local_url('doc', array('title' => $title)),
+                                        'changefreq' => 'monthly',
+                                        'priority'   => '0.2',
+                                        )
+                                  );
+    }
+
+    $urlset_path = $output_paths['output_dir'] . 'standard.xml';
+
+    write_file($urlset_path, urlset($standard_map_urls));
 }
 
 # Generate sitemaps of all notices.
 function notices_map() {
-       global $output_paths;
+    global $output_paths;
 
-       $notices = DB_DataObject::factory('notice');
+    $notices = DB_DataObject::factory('notice');
 
-       $notices->query('SELECT id, uri, url, modified FROM notice where is_local = 1');
+    $notices->query('SELECT id, uri, url, modified FROM notice where is_local = 1');
 
-       $notice_count = 0;
-       $map_count = 1;
+    $notice_count = 0;
+    $map_count = 1;
 
-       while ($notices->fetch()) {
+    while ($notices->fetch()) {
 
-               # Maximum 50,000 URLs per sitemap file.
-               if ($notice_count == 50000) {
-                       $notice_count = 0;
-                       $map_count++;
-               }
+        # Maximum 50,000 URLs per sitemap file.
+        if ($notice_count == 50000) {
+            $notice_count = 0;
+            $map_count++;
+        }
 
-               # remote notices have an URL
-               
-               if (!$notices->url && $notices->uri) {
-                       $notice = array(
-                                               'url'        => ($notices->uri) ? $notices->uri : common_local_url('shownotice', array('notice' => $notices->id)),
-                                               'lastmod'    => common_date_w3dtf($notices->modified),
-                                               'changefreq' => 'never',
-                                               'priority'   => '1',
-                                               );
+        # remote notices have an URL
+        
+        if (!$notices->url && $notices->uri) {
+            $notice = array(
+                        'url'        => ($notices->uri) ? $notices->uri : common_local_url('shownotice', array('notice' => $notices->id)),
+                        'lastmod'    => common_date_w3dtf($notices->modified),
+                        'changefreq' => 'never',
+                        'priority'   => '1',
+                        );
 
-                       $notice_list[$map_count] .= url($notice);
-                       $notice_count++;
-               }
-       }
+            $notice_list[$map_count] .= url($notice);
+            $notice_count++;
+        }
+    }
 
-       # Make full sitemaps from the lists and save them.
-       array_to_map($notice_list, 'notice');
+    # Make full sitemaps from the lists and save them.
+    array_to_map($notice_list, 'notice');
 }
 
 # Generate sitemaps of all users.
 function user_map() {
-       global $output_paths;
-
-       $users = DB_DataObject::factory('user');
-
-       $users->query('SELECT id, nickname FROM user');
-
-       $user_count = 0;
-       $map_count = 1;
-
-       while ($users->fetch()) {
-
-               # Maximum 50,000 URLs per sitemap file.
-               if ($user_count == 50000) {
-                       $user_count = 0;
-                       $map_count++;
-               }
-
-               $user_args = array('nickname' => $users->nickname);
-
-               # Define parameters for generating <url></url> elements.
-               $user = array(
-                                         'url'        => common_local_url('showstream', $user_args),
-                                         'changefreq' => 'daily',
-                                         'priority'   => '1',
-                                         );
-
-               $user_rss = array(
-                                                 'url'        => common_local_url('userrss', $user_args),
-                                                 'changefreq' => 'daily',
-                                                 'priority'   => '0.3',
-                                                 );
-
-               $all = array(
-                                        'url'        => common_local_url('all', $user_args),
-                                        'changefreq' => 'daily',
-                                        'priority'   => '1',
-                                        );
-
-               $all_rss = array(
-                                                'url'        => common_local_url('allrss', $user_args),
-                                                'changefreq' => 'daily',
-                                                'priority'   => '0.3',
-                                                );
-
-               $replies = array(
-                                                'url'        => common_local_url('replies', $user_args),
-                                                'changefreq' => 'daily',
-                                                'priority'   => '1',
-                                                );
-
-               $replies_rss = array(
-                                                        'url'        => common_local_url('repliesrss', $user_args),
-                                                        'changefreq' => 'daily',
-                                                        'priority'   => '0.3',
-                                                        );
-
-               $foaf = array(
-                                         'url'        => common_local_url('foaf', $user_args),
-                                         'changefreq' => 'weekly',
-                                         'priority'   => '0.5',
-                                         );
-
-               # Construct a <url></url> element for each user facet and add it
-               # to our existing list of those.
-               $user_list[$map_count]        .= url($user);
-               $user_rss_list[$map_count]    .= url($user_rss);
-               $all_list[$map_count]         .= url($all);
-               $all_rss_list[$map_count]     .= url($all_rss);
-               $replies_list[$map_count]     .= url($replies);
-               $replies_rss_list[$map_count] .= url($replies_rss);
-               $foaf_list[$map_count]        .= url($foaf);
-
-               $user_count++;
-       }
-
-       # Make full sitemaps from the lists and save them.
-       # Possible factoring: put all the lists into a master array, thus allowing
-       # calling with single argument (i.e., array_to_map('user')).
-       array_to_map($user_list, 'user');
-       array_to_map($user_rss_list, 'user_rss');
-       array_to_map($all_list, 'all');
-       array_to_map($all_rss_list, 'all_rss');
-       array_to_map($replies_list, 'replies');
-       array_to_map($replies_rss_list, 'replies_rss');
-       array_to_map($foaf_list, 'foaf');
+    global $output_paths;
+
+    $users = DB_DataObject::factory('user');
+
+    $users->query('SELECT id, nickname FROM user');
+
+    $user_count = 0;
+    $map_count = 1;
+
+    while ($users->fetch()) {
+
+        # Maximum 50,000 URLs per sitemap file.
+        if ($user_count == 50000) {
+            $user_count = 0;
+            $map_count++;
+        }
+
+        $user_args = array('nickname' => $users->nickname);
+
+        # Define parameters for generating <url></url> elements.
+        $user = array(
+                      'url'        => common_local_url('showstream', $user_args),
+                      'changefreq' => 'daily',
+                      'priority'   => '1',
+                      );
+
+        $user_rss = array(
+                          'url'        => common_local_url('userrss', $user_args),
+                          'changefreq' => 'daily',
+                          'priority'   => '0.3',
+                          );
+
+        $all = array(
+                     'url'        => common_local_url('all', $user_args),
+                     'changefreq' => 'daily',
+                     'priority'   => '1',
+                     );
+
+        $all_rss = array(
+                         'url'        => common_local_url('allrss', $user_args),
+                         'changefreq' => 'daily',
+                         'priority'   => '0.3',
+                         );
+
+        $replies = array(
+                         'url'        => common_local_url('replies', $user_args),
+                         'changefreq' => 'daily',
+                         'priority'   => '1',
+                         );
+
+        $replies_rss = array(
+                             'url'        => common_local_url('repliesrss', $user_args),
+                             'changefreq' => 'daily',
+                             'priority'   => '0.3',
+                             );
+
+        $foaf = array(
+                      'url'        => common_local_url('foaf', $user_args),
+                      'changefreq' => 'weekly',
+                      'priority'   => '0.5',
+                      );
+
+        # Construct a <url></url> element for each user facet and add it
+        # to our existing list of those.
+        $user_list[$map_count]        .= url($user);
+        $user_rss_list[$map_count]    .= url($user_rss);
+        $all_list[$map_count]         .= url($all);
+        $all_rss_list[$map_count]     .= url($all_rss);
+        $replies_list[$map_count]     .= url($replies);
+        $replies_rss_list[$map_count] .= url($replies_rss);
+        $foaf_list[$map_count]        .= url($foaf);
+
+        $user_count++;
+    }
+
+    # Make full sitemaps from the lists and save them.
+    # Possible factoring: put all the lists into a master array, thus allowing
+    # calling with single argument (i.e., array_to_map('user')).
+    array_to_map($user_list, 'user');
+    array_to_map($user_rss_list, 'user_rss');
+    array_to_map($all_list, 'all');
+    array_to_map($all_rss_list, 'all_rss');
+    array_to_map($replies_list, 'replies');
+    array_to_map($replies_rss_list, 'replies_rss');
+    array_to_map($foaf_list, 'foaf');
 }
 
 # ------------------------------------------------------------------------------
@@ -209,87 +209,87 @@ function user_map() {
 
 # Generate a <url></url> element.
 function url($url_args) {
-       $url        = preg_replace('/&/', '&amp;', $url_args['url']); # escape ampersands for XML
-       $lastmod    = $url_args['lastmod'];
-       $changefreq = $url_args['changefreq'];
-       $priority   = $url_args['priority'];
+    $url        = preg_replace('/&/', '&amp;', $url_args['url']); # escape ampersands for XML
+    $lastmod    = $url_args['lastmod'];
+    $changefreq = $url_args['changefreq'];
+    $priority   = $url_args['priority'];
 
-       if (is_null($url)) {
-               error("url() arguments require 'url' value.");
-       }
+    if (is_null($url)) {
+        error("url() arguments require 'url' value.");
+    }
 
-       $url_out = "\t<url>\n";
-       $url_out .= "\t\t<loc>$url</loc>\n";
+    $url_out = "\t<url>\n";
+    $url_out .= "\t\t<loc>$url</loc>\n";
 
-       if ($changefreq) {
-               $url_out .= "\t\t<changefreq>$changefreq</changefreq>\n";
-       }
+    if ($changefreq) {
+        $url_out .= "\t\t<changefreq>$changefreq</changefreq>\n";
+    }
 
-       if ($lastmod) {
-               $url_out .= "\t\t<lastmod>$lastmod</lastmod>\n";
-       }
+    if ($lastmod) {
+        $url_out .= "\t\t<lastmod>$lastmod</lastmod>\n";
+    }
 
-       if ($priority) {
-               $url_out .= "\t\t<priority>$priority</priority>\n";
-       }
+    if ($priority) {
+        $url_out .= "\t\t<priority>$priority</priority>\n";
+    }
 
-       $url_out .= "\t</url>\n";
+    $url_out .= "\t</url>\n";
 
-       return $url_out;
+    return $url_out;
 }
 
 function sitemap($sitemap_args) {
-       $url        = preg_replace('/&/', '&amp;', $sitemap_args['url']); # escape ampersands for XML
-       $lastmod    = $sitemap_args['lastmod'];
+    $url        = preg_replace('/&/', '&amp;', $sitemap_args['url']); # escape ampersands for XML
+    $lastmod    = $sitemap_args['lastmod'];
 
-       if (is_null($url)) {
-               error("url() arguments require 'url' value.");
-       }
+    if (is_null($url)) {
+        error("url() arguments require 'url' value.");
+    }
 
-       $sitemap_out = "\t<sitemap>\n";
-       $sitemap_out .= "\t\t<loc>$url</loc>\n";
+    $sitemap_out = "\t<sitemap>\n";
+    $sitemap_out .= "\t\t<loc>$url</loc>\n";
 
-       if ($lastmod) {
-               $sitemap_out .= "\t\t<lastmod>$lastmod</lastmod>\n";
-       }
+    if ($lastmod) {
+        $sitemap_out .= "\t\t<lastmod>$lastmod</lastmod>\n";
+    }
 
-       $sitemap_out .= "\t</sitemap>\n";
+    $sitemap_out .= "\t</sitemap>\n";
 
-       return $sitemap_out;
+    return $sitemap_out;
 }
 
 # Generate a <urlset></urlset> element.
 function urlset($urlset_text) {
-       $urlset = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
-         '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n" .
-         $urlset_text .
-         '</urlset>';
+    $urlset = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
+      '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n" .
+      $urlset_text .
+      '</urlset>';
 
-       return $urlset;
+    return $urlset;
 }
 
 # Generate a <urlset></urlset> element.
 function sitemapindex($sitemapindex_text) {
-       $sitemapindex = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
-         '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n" .
-         $sitemapindex_text .
-         '</sitemapindex>';
+    $sitemapindex = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
+      '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n" .
+      $sitemapindex_text .
+      '</sitemapindex>';
 
-       return $sitemapindex;
+    return $sitemapindex;
 }
 
 # Generate a sitemap from an array containing <url></url> elements and write it to a file.
 function array_to_map($url_list, $filename_prefix) {
-       global $output_paths;
-
-       if ($url_list) {
-               # $map_urls is a long string containing concatenated <url></url> elements.
-               while (list($map_idx, $map_urls) = each($url_list)) {
-                       $urlset_path = $output_paths['output_dir'] . "$filename_prefix-$map_idx.xml";
-                       
-                       write_file($urlset_path, urlset($map_urls));
-               }
-       }
+    global $output_paths;
+
+    if ($url_list) {
+        # $map_urls is a long string containing concatenated <url></url> elements.
+        while (list($map_idx, $map_urls) = each($url_list)) {
+            $urlset_path = $output_paths['output_dir'] . "$filename_prefix-$map_idx.xml";
+            
+            write_file($urlset_path, urlset($map_urls));
+        }
+    }
 }
 
 # ------------------------------------------------------------------------------
@@ -298,79 +298,79 @@ function array_to_map($url_list, $filename_prefix) {
 
 # Parse command line arguments.
 function parse_args() {
-       $args = getopt('f:d:u:');
-
-       if (is_null($args[f]) && is_null($args[d]) && is_null($args[u])) {
-               error('Mandatory arguments: -f <index file path> -d <output directory path> -u <URL of sitemaps directory>');
-       }
-
-       if (is_null($args[f])) {
-               error('You must specify an index file name with the -f option.');
-       }
-
-       if (is_null($args[d])) {
-               error('You must specify a directory for the output file with the -d option.');
-       }
-
-       if (is_null($args[u])) {
-               error('You must specify a URL for the directory where the sitemaps will be kept with the -u option.');
-       }
-
-       $index_file = $args[f];
-       $output_dir = $args[d];
-       $output_url = $args[u];
-
-       if (file_exists($output_dir)) {
-               if (is_writable($output_dir) === FALSE) {
-                       error("$output_dir is not writable.");
-               }
-       }        else {
-               error("output directory $output_dir does not exist.");
-       }
-
-       $paths = array(
-                                  'index_file' => $index_file,
-                                  'output_dir' => trailing_slash($output_dir),
-                                  'output_url' => trailing_slash($output_url),
-                                  );
-
-       return $paths;
+    $args = getopt('f:d:u:');
+
+    if (is_null($args[f]) && is_null($args[d]) && is_null($args[u])) {
+        error('Mandatory arguments: -f <index file path> -d <output directory path> -u <URL of sitemaps directory>');
+    }
+
+    if (is_null($args[f])) {
+        error('You must specify an index file name with the -f option.');
+    }
+
+    if (is_null($args[d])) {
+        error('You must specify a directory for the output file with the -d option.');
+    }
+
+    if (is_null($args[u])) {
+        error('You must specify a URL for the directory where the sitemaps will be kept with the -u option.');
+    }
+
+    $index_file = $args[f];
+    $output_dir = $args[d];
+    $output_url = $args[u];
+
+    if (file_exists($output_dir)) {
+        if (is_writable($output_dir) === FALSE) {
+            error("$output_dir is not writable.");
+        }
+    }     else {
+        error("output directory $output_dir does not exist.");
+    }
+
+    $paths = array(
+                   'index_file' => $index_file,
+                   'output_dir' => trailing_slash($output_dir),
+                   'output_url' => trailing_slash($output_url),
+                   );
+
+    return $paths;
 }
 
 # Ensure paths end with a "/".
 function trailing_slash($path) {
-       if (preg_match('/\/$/', $path) == 0) {
-               $path .= '/';
-       }
+    if (preg_match('/\/$/', $path) == 0) {
+        $path .= '/';
+    }
 
-       return $path;
+    return $path;
 }
 
 # Write data to disk.
 function write_file($path, $data) {
-       if (is_null($path)) {
-               error('No path specified for writing to.');
-       }        elseif (is_null($data)) {
-               error('No data specified for writing.');
-       }
-
-       if (($fh_out = fopen($path,'w')) === FALSE) {
-               error("couldn't open $path for writing.");
-       }
-
-       if (fwrite($fh_out, $data) === FALSE) {
-               error("couldn't write to $path.");
-       }
+    if (is_null($path)) {
+        error('No path specified for writing to.');
+    }     elseif (is_null($data)) {
+        error('No data specified for writing.');
+    }
+
+    if (($fh_out = fopen($path,'w')) === FALSE) {
+        error("couldn't open $path for writing.");
+    }
+
+    if (fwrite($fh_out, $data) === FALSE) {
+        error("couldn't write to $path.");
+    }
 }
 
 # Display an error message and exit.
 function error ($error_msg) {
-       if (is_null($error_msg)) {
-               $error_msg = 'error() was called without any explanation!';
-       }
+    if (is_null($error_msg)) {
+        $error_msg = 'error() was called without any explanation!';
+    }
 
-       echo "Error: $error_msg\n";
-       exit(1);
+    echo "Error: $error_msg\n";
+    exit(1);
 }
 
 ?>
\ No newline at end of file
index 8f0d02d9b67f76e35b17add1357de82e8e867f23..f17429d96318a093317b0cbc905da6835915b10b 100644 (file)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -34,22 +34,22 @@ require_once(INSTALLDIR . '/lib/queuehandler.php');
 set_error_handler('common_error_handler');
 
 class SmsQueueHandler extends QueueHandler {
-       
-       function transport() {
-               return 'sms';
-       }
+    
+    function transport() {
+        return 'sms';
+    }
 
-       function start() {
-               $this->log(LOG_INFO, "INITIALIZE");
-               return true;
-       }
+    function start() {
+        $this->log(LOG_INFO, "INITIALIZE");
+        return true;
+    }
 
-       function handle_notice($notice) {
-               return mail_broadcast_notice_sms($notice);
-       }
-       
-       function finish() {
-       }
+    function handle_notice($notice) {
+        return mail_broadcast_notice_sms($notice);
+    }
+    
+    function finish() {
+    }
 }
 
 ini_set("max_execution_time", "0");
index 070eb9bbb2f6bcc22b4ed4e3257277d90f87e948..0ce34c2ae44f943303dcdcfbeaa76244fa1787e5 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -35,21 +35,21 @@ $flink->find();
 
 while ($flink->fetch()) {
 
-       if (($flink->friendsync & FOREIGN_FRIEND_RECV) == FOREIGN_FRIEND_RECV) {
+    if (($flink->friendsync & FOREIGN_FRIEND_RECV) == FOREIGN_FRIEND_RECV) {
 
-               $user = User::staticGet($flink->user_id);
+        $user = User::staticGet($flink->user_id);
 
-               print "Updating Twitter friends for user $user->nickname ($user->id)\n";
+        print "Updating Twitter friends for user $user->nickname ($user->id)\n";
 
-               $fuser = $flink->getForeignUser();
+        $fuser = $flink->getForeignUser();
 
-               $result = save_twitter_friends($user, $fuser->id, $fuser->nickname, $flink->credentials);
+        $result = save_twitter_friends($user, $fuser->id, $fuser->nickname, $flink->credentials);
 
-               if ($result == false) {
-                       print "Problems updating Twitter friends! Check the log.\n";
-                       exit(1);
-               }
-       }
+        if ($result == false) {
+            print "Problems updating Twitter friends! Check the log.\n";
+            exit(1);
+        }
+    }
 
 }
 
index 3eb7b34016ef7d5d6b5594e87e3082d47131f6a0..8ad07ccca9eb0a7b4f0c1da1bb0d646315e91a85 100644 (file)
@@ -5,62 +5,62 @@ chdir(dirname(__FILE__) . '/..');
 
 /* Languages to pull */
 $languages = array(
-       'da_DK' => 'http://laconi.ca/translate/download.php?file_id=23',
-       'nl_NL' => 'http://laconi.ca/translate/download.php?file_id=39',
-       'en_NZ' => 'http://laconi.ca/translate/download.php?file_id=15',
-       'eo'    => 'http://laconi.ca/translate/download.php?file_id=10',
-       'fr_FR' => 'http://laconi.ca/translate/download.php?file_id=19',
-       'de_DE' => 'http://laconi.ca/translate/download.php?file_id=18',
-       'it_IT' => 'http://laconi.ca/translate/download.php?file_id=21',
-       'ko'    => 'http://laconi.ca/translate/download.php?file_id=33',
-       'no_NB' => 'http://laconi.ca/translate/download.php?file_id=31',
-       'pt'    => 'http://laconi.ca/translate/download.php?file_id=8',
-       'pt_BR' => 'http://laconi.ca/translate/download.php?file_id=72',
-       'ru_RU' => 'http://laconi.ca/translate/download.php?file_id=26',
-       'es'    => 'http://laconi.ca/translate/download.php?file_id=9',
-       'tr_TR' => 'http://laconi.ca/translate/download.php?file_id=37',
-       'uk_UA' => 'http://laconi.ca/translate/download.php?file_id=44',
-       'he_IL' => 'http://laconi.ca/translate/download.php?file_id=71',
-       'mk_MK' => 'http://laconi.ca/translate/download.php?file_id=67',
-       'ja_JP' => 'http://laconi.ca/translate/download.php?file_id=43',
-       'cs_CZ' => 'http://laconi.ca/translate/download.php?file_id=63',
-       'ca_ES' => 'http://laconi.ca/translate/download.php?file_id=49',
-       'pl_PL' => 'http://laconi.ca/translate/download.php?file_id=51',
-       'sv_SE' => 'http://laconi.ca/translate/download.php?file_id=55'
+    'da_DK' => 'http://laconi.ca/translate/download.php?file_id=23',
+    'nl_NL' => 'http://laconi.ca/translate/download.php?file_id=39',
+    'en_NZ' => 'http://laconi.ca/translate/download.php?file_id=15',
+    'eo'    => 'http://laconi.ca/translate/download.php?file_id=10',
+    'fr_FR' => 'http://laconi.ca/translate/download.php?file_id=19',
+    'de_DE' => 'http://laconi.ca/translate/download.php?file_id=18',
+    'it_IT' => 'http://laconi.ca/translate/download.php?file_id=21',
+    'ko'    => 'http://laconi.ca/translate/download.php?file_id=33',
+    'no_NB' => 'http://laconi.ca/translate/download.php?file_id=31',
+    'pt'    => 'http://laconi.ca/translate/download.php?file_id=8',
+    'pt_BR' => 'http://laconi.ca/translate/download.php?file_id=72',
+    'ru_RU' => 'http://laconi.ca/translate/download.php?file_id=26',
+    'es'    => 'http://laconi.ca/translate/download.php?file_id=9',
+    'tr_TR' => 'http://laconi.ca/translate/download.php?file_id=37',
+    'uk_UA' => 'http://laconi.ca/translate/download.php?file_id=44',
+    'he_IL' => 'http://laconi.ca/translate/download.php?file_id=71',
+    'mk_MK' => 'http://laconi.ca/translate/download.php?file_id=67',
+    'ja_JP' => 'http://laconi.ca/translate/download.php?file_id=43',
+    'cs_CZ' => 'http://laconi.ca/translate/download.php?file_id=63',
+    'ca_ES' => 'http://laconi.ca/translate/download.php?file_id=49',
+    'pl_PL' => 'http://laconi.ca/translate/download.php?file_id=51',
+    'sv_SE' => 'http://laconi.ca/translate/download.php?file_id=55'
 );
 
 /* Update the languages */
 foreach ($languages as $code => $file) {
 
-       $lcdir='locale/'.$code;
-       $msgdir=$lcdir.'/LC_MESSAGES';
-       $pofile=$msgdir.'/laconica.po';
-       $mofile=$msgdir.'/laconica.mo';
+    $lcdir='locale/'.$code;
+    $msgdir=$lcdir.'/LC_MESSAGES';
+    $pofile=$msgdir.'/laconica.po';
+    $mofile=$msgdir.'/laconica.mo';
 
-       /* Check for an existing */
-       if (!is_dir($msgdir)) {
-               mkdir($lcdir);
-               mkdir($msgdir);
-               $existingSHA1 = '';
-       } else {
-               $existingSHA1 = file_exists($pofile) ? sha1_file($pofile) : '';
-       }
+    /* Check for an existing */
+    if (!is_dir($msgdir)) {
+        mkdir($lcdir);
+        mkdir($msgdir);
+        $existingSHA1 = '';
+    } else {
+        $existingSHA1 = file_exists($pofile) ? sha1_file($pofile) : '';
+    }
 
-       /* Get the remote one */
-       $newFile = file_get_contents($file);
+    /* Get the remote one */
+    $newFile = file_get_contents($file);
 
-       // Update if the local .po file is different to the one downloaded, or
-       // if the .mo file is not present.
-       if(sha1($newFile)!=$existingSHA1 || !file_exists($mofile)) {
-               echo "Updating ".$code."\n";
-               file_put_contents($pofile, $newFile);
-               $prevdir = getcwd();
-               chdir($msgdir);
-               system('msgmerge -U laconica.po ../../laconica.pot');
-               system('msgfmt -f -o laconica.mo laconica.po');
-               chdir($prevdir);
-       } else {
-               echo "Unchanged - ".$code."\n";
-       }
+    // Update if the local .po file is different to the one downloaded, or
+    // if the .mo file is not present.
+    if(sha1($newFile)!=$existingSHA1 || !file_exists($mofile)) {
+        echo "Updating ".$code."\n";
+        file_put_contents($pofile, $newFile);
+        $prevdir = getcwd();
+        chdir($msgdir);
+        system('msgmerge -U laconica.po ../../laconica.pot');
+        system('msgfmt -f -o laconica.mo laconica.po');
+        chdir($prevdir);
+    } else {
+        echo "Unchanged - ".$code."\n";
+    }
 }
 echo "Finished\n";
index 8961b0b6e38f6a54a62cdc3782b79ae9a93dadae..454616ca09bc42cec2ac862a49c43e8b77cdc371 100644 (file)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -37,102 +37,102 @@ define('CLAIM_TIMEOUT', 1200);
 
 class XmppConfirmHandler extends XmppQueueHandler {
 
-       var $_id = 'confirm';
-       
-       function class_name() {
-               return 'XmppConfirmHandler';
-       }
-       
-       function run() {
-               if (!$this->start()) {
-                       return false;
-               }
-               $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,
-                                                                                                 $confirm->address);
-                               if (!$success) {
-                                       $this->log(LOG_ERR, '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; need a dupe so we don't have the WHERE clause
-                                       $dupe = Confirm_address::staticGet('code', $confirm->code);
-                                       if (!$dupe) {
-                                               common_log(LOG_WARNING, 'Could not refetch confirm', __FILE__);
-                                               continue;
-                                       }
-                                       $orig = clone($dupe);
-                                       $dupe->sent = $dupe->claimed;
-                                       $result = $dupe->update($orig);
-                                       if (!$result) {
-                                               common_log_db_error($dupe, 'UPDATE', __FILE__);
-                                               # Just let the claim age out; hopefully things work then
-                                               continue;
-                                       }
-                                       $dupe->free();
-                                       unset($dupe);
-                               }
-                               $user->free();
-                               unset($user);
-                               $confirm->free();
-                               unset($confirm);
-                               $this->idle(0);
-                       } else {
-#                              $this->clear_old_confirm_claims();
-                               $this->idle(10);
-                       }
-               } while (true);
-               if (!$this->finish()) {
-                       return false;
-               }
-               return true;
-       }
+    var $_id = 'confirm';
+    
+    function class_name() {
+        return 'XmppConfirmHandler';
+    }
+    
+    function run() {
+        if (!$this->start()) {
+            return false;
+        }
+        $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,
+                                                  $confirm->address);
+                if (!$success) {
+                    $this->log(LOG_ERR, '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; need a dupe so we don't have the WHERE clause
+                    $dupe = Confirm_address::staticGet('code', $confirm->code);
+                    if (!$dupe) {
+                        common_log(LOG_WARNING, 'Could not refetch confirm', __FILE__);
+                        continue;
+                    }
+                    $orig = clone($dupe);
+                    $dupe->sent = $dupe->claimed;
+                    $result = $dupe->update($orig);
+                    if (!$result) {
+                        common_log_db_error($dupe, 'UPDATE', __FILE__);
+                        # Just let the claim age out; hopefully things work then
+                        continue;
+                    }
+                    $dupe->free();
+                    unset($dupe);
+                }
+                $user->free();
+                unset($user);
+                $confirm->free();
+                unset($confirm);
+                $this->idle(0);
+            } else {
+#                $this->clear_old_confirm_claims();
+                $this->idle(10);
+            }
+        } while (true);
+        if (!$this->finish()) {
+            return false;
+        }
+        return true;
+    }
 
-       function next_confirm() {
-               $confirm = new Confirm_address();
-               $confirm->whereAdd('claimed IS NULL');
-               $confirm->whereAdd('sent IS NULL');
-               # XXX: eventually we could do other confirmations in the queue, too
-               $confirm->address_type = 'jabber';
-               $confirm->orderBy('modified DESC');
-               $confirm->limit(1);
-               if ($confirm->find(TRUE)) {
-                       $this->log(LOG_INFO, 'Claiming confirmation for ' . $confirm->address);
-                       # working around some weird DB_DataObject behaviour
-                       $confirm->whereAdd(''); # clears where stuff
-                       $original = clone($confirm);
-                       $confirm->claimed = common_sql_now();
-                       $result = $confirm->update($original);
-                       if ($result) {
-                               $this->log(LOG_INFO, 'Succeeded in claim! '. $result);
-                               return $confirm;
-                       } else {
-                               $this->log(LOG_INFO, 'Failed in claim!');
-                               return false;
-                       }
-               }
-               return NULL;
-       }
+    function next_confirm() {
+        $confirm = new Confirm_address();
+        $confirm->whereAdd('claimed IS NULL');
+        $confirm->whereAdd('sent IS NULL');
+        # XXX: eventually we could do other confirmations in the queue, too
+        $confirm->address_type = 'jabber';
+        $confirm->orderBy('modified DESC');
+        $confirm->limit(1);
+        if ($confirm->find(TRUE)) {
+            $this->log(LOG_INFO, 'Claiming confirmation for ' . $confirm->address);
+                # working around some weird DB_DataObject behaviour
+            $confirm->whereAdd(''); # clears where stuff
+            $original = clone($confirm);
+            $confirm->claimed = common_sql_now();
+            $result = $confirm->update($original);
+            if ($result) {
+                $this->log(LOG_INFO, 'Succeeded in claim! '. $result);
+                return $confirm;
+            } else {
+                $this->log(LOG_INFO, 'Failed in claim!');
+                return false;
+            }
+        }
+        return NULL;
+    }
 
-       function clear_old_confirm_claims() {
-               $confirm = new Confirm();
-               $confirm->claimed = NULL;
-               $confirm->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
-               $confirm->update(DB_DATAOBJECT_WHEREADD_ONLY);
-               $confirm->free();
-               unset($confirm);
-       }
+    function clear_old_confirm_claims() {
+        $confirm = new Confirm();
+        $confirm->claimed = NULL;
+        $confirm->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
+        $confirm->update(DB_DATAOBJECT_WHEREADD_ONLY);
+        $confirm->free();
+        unset($confirm);
+    }
 }
 
 ini_set("max_execution_time", "0");
index 9a60970a6e99414ec86b0f9cc594d2a67c35962a..cd27a2c1492b00782c85095cf02b13efbfbadba1 100644 (file)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -39,203 +39,203 @@ set_error_handler('common_error_handler');
 
 class XMPPDaemon extends Daemon {
 
-       function XMPPDaemon($resource=NULL) {
-               static $attrs = array('server', 'port', 'user', 'password', 'host');
-
-               foreach ($attrs as $attr)
-               {
-                       $this->$attr = common_config('xmpp', $attr);
-               }
-
-               if ($resource) {
-                       $this->resource = $resource;
-               } else {
-                       $this->resource = common_config('xmpp', 'resource') . 'daemon';
-               }
-
-               $this->log(LOG_INFO, "INITIALIZE XMPPDaemon {$this->user}@{$this->server}/{$this->resource}");
-       }
-
-       function connect() {
-
-               $connect_to = ($this->host) ? $this->host : $this->server;
-
-               $this->log(LOG_INFO, "Connecting to $connect_to on port $this->port");
-
-               $this->conn = jabber_connect($this->resource);
-
-               if (!$this->conn) {
-                       return false;
-               }
-
-               $this->conn->setReconnectTimeout(600);
-
-               jabber_send_presence("Send me a message to post a notice", 'available',
-                                                        NULL, 'available', 100);
-               return !$this->conn->isDisconnected();
-       }
-
-       function name() {
-               return strtolower('xmppdaemon.'.$this->resource);
-       }
-
-       function run() {
-               if ($this->connect()) {
-
-                       $this->conn->addEventHandler('message', 'handle_message', $this);
-                       $this->conn->addEventHandler('presence', 'handle_presence', $this);
-                       $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
-
-                       $this->conn->process();
-               }
-       }
-
-       function handle_reconnect(&$pl) {
-               $this->conn->processUntil('session_start');
-               $this->conn->presence('Send me a message to post a notice', 'available', NULL, 'available', 100);
-       }
-
-       function get_user($from) {
-               $user = User::staticGet('jabber', jabber_normalize_jid($from));
-               return $user;
-       }
-
-       function handle_message(&$pl) {
-               if ($pl['type'] != 'chat') {
-                       return;
-               }
-               if (mb_strlen($pl['body']) == 0) {
-                       return;
-               }
-
-               $from = jabber_normalize_jid($pl['from']);
-
-               # Forwarded from another daemon (probably a broadcaster) for
-               # us to handle
-
-               if ($this->is_self($from)) {
-                       $from = $this->get_ofrom($pl);
-                       if (is_null($from) || $this->is_self($from)) {
-                               return;
-                       }
-               }
-
-               $user = $this->get_user($from);
-
-               if (!$user) {
-                       $this->from_site($from, 'Unknown user; go to ' .
-                                                        common_local_url('imsettings') .
-                                                        ' to add your address to your account');
-                       $this->log(LOG_WARNING, 'Message from unknown user ' . $from);
-                       return;
-               }
-               if ($this->handle_command($user, $pl['body'])) {
-                       return;
-               } else if ($this->is_autoreply($pl['body'])) {
-                       $this->log(LOG_INFO, 'Ignoring auto reply from ' . $from);
-                       return;
-               } else if ($this->is_otr($pl['body'])) {
-                       $this->log(LOG_INFO, 'Ignoring OTR from ' . $from);
-                       return;
-               } else if ($this->is_direct($pl['body'])) {
-                       preg_match_all('/d[\ ]*([a-z0-9]{1,64})/', $pl['body'], $to);
-
-                       $to = preg_replace('/^d([\ ])*/', '', $to[0][0]);
-                       $body = preg_replace('/d[\ ]*('. $to .')[\ ]*/', '', $pl['body']);
-                       $this->add_direct($user, $body, $to, $from);
-               } else {
-                       $len = mb_strlen($pl['body']);
-                       if($len > 140) {
-                               $this->from_site($from, 'Message too long - maximum is 140 characters, you sent ' . $len);
-                               return;
-                       }
-                       $this->add_notice($user, $pl);
-               }
-
-               $user->free();
-               unset($user);
-       }
-
-       function is_self($from) {
-               return preg_match('/^'.strtolower(jabber_daemon_address()).'/', strtolower($from));
-       }
-
-       function get_ofrom($pl) {
-               $xml = $pl['xml'];
-               $addresses = $xml->sub('addresses');
-               if (!$addresses) {
-                       $this->log(LOG_WARNING, 'Forwarded message without addresses');
-                       return NULL;
-               }
-               $address = $addresses->sub('address');
-               if (!$address) {
-                       $this->log(LOG_WARNING, 'Forwarded message without address');
-                       return NULL;
-               }
-               if (!array_key_exists('type', $address->attrs)) {
-                       $this->log(LOG_WARNING, 'No type for forwarded message');
-                       return NULL;
-               }
-               $type = $address->attrs['type'];
-               if ($type != 'ofrom') {
-                       $this->log(LOG_WARNING, 'Type of forwarded message is not ofrom');
-                       return NULL;
-               }
-               if (!array_key_exists('jid', $address->attrs)) {
-                       $this->log(LOG_WARNING, 'No jid for forwarded message');
-                       return NULL;
-               }
-               $jid = $address->attrs['jid'];
-               if (!$jid) {
-                       $this->log(LOG_WARNING, 'Could not get jid from address');
-                       return NULL;
-               }
-               $this->log(LOG_DEBUG, 'Got message forwarded from jid ' . $jid);
-               return $jid;
-       }
-
-       function is_autoreply($txt) {
-               if (preg_match('/[\[\(]?[Aa]uto[-\s]?[Rr]e(ply|sponse)[\]\)]/', $txt)) {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
-       function is_otr($txt) {
-               if (preg_match('/^\?OTR/', $txt)) {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
-       function is_direct($txt) {
-               if (strtolower(substr($txt, 0, 2))=='d ') {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
-       function from_site($address, $msg) {
-               $text = '['.common_config('site', 'name') . '] ' . $msg;
-               jabber_send_message($address, $text);
-       }
-
-       function handle_command($user, $body) {
-               $inter = new CommandInterpreter();
-               $cmd = $inter->handle_command($user, $body);
-               if ($cmd) {
-                       $chan = new XMPPChannel($this->conn);
-                       $cmd->execute($chan);
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
-       function add_notice(&$user, &$pl) {
+    function XMPPDaemon($resource=NULL) {
+        static $attrs = array('server', 'port', 'user', 'password', 'host');
+
+        foreach ($attrs as $attr)
+        {
+            $this->$attr = common_config('xmpp', $attr);
+        }
+
+        if ($resource) {
+            $this->resource = $resource;
+        } else {
+            $this->resource = common_config('xmpp', 'resource') . 'daemon';
+        }
+
+        $this->log(LOG_INFO, "INITIALIZE XMPPDaemon {$this->user}@{$this->server}/{$this->resource}");
+    }
+
+    function connect() {
+
+        $connect_to = ($this->host) ? $this->host : $this->server;
+
+        $this->log(LOG_INFO, "Connecting to $connect_to on port $this->port");
+
+        $this->conn = jabber_connect($this->resource);
+
+        if (!$this->conn) {
+            return false;
+        }
+
+        $this->conn->setReconnectTimeout(600);
+
+        jabber_send_presence("Send me a message to post a notice", 'available',
+                             NULL, 'available', 100);
+        return !$this->conn->isDisconnected();
+    }
+
+    function name() {
+        return strtolower('xmppdaemon.'.$this->resource);
+    }
+
+    function run() {
+        if ($this->connect()) {
+
+            $this->conn->addEventHandler('message', 'handle_message', $this);
+            $this->conn->addEventHandler('presence', 'handle_presence', $this);
+            $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
+
+            $this->conn->process();
+        }
+    }
+
+    function handle_reconnect(&$pl) {
+        $this->conn->processUntil('session_start');
+        $this->conn->presence('Send me a message to post a notice', 'available', NULL, 'available', 100);
+    }
+
+    function get_user($from) {
+        $user = User::staticGet('jabber', jabber_normalize_jid($from));
+        return $user;
+    }
+
+    function handle_message(&$pl) {
+        if ($pl['type'] != 'chat') {
+            return;
+        }
+        if (mb_strlen($pl['body']) == 0) {
+            return;
+        }
+
+        $from = jabber_normalize_jid($pl['from']);
+
+        # Forwarded from another daemon (probably a broadcaster) for
+        # us to handle
+
+        if ($this->is_self($from)) {
+            $from = $this->get_ofrom($pl);
+            if (is_null($from) || $this->is_self($from)) {
+                return;
+            }
+        }
+
+        $user = $this->get_user($from);
+
+        if (!$user) {
+            $this->from_site($from, 'Unknown user; go to ' .
+                             common_local_url('imsettings') .
+                             ' to add your address to your account');
+            $this->log(LOG_WARNING, 'Message from unknown user ' . $from);
+            return;
+        }
+        if ($this->handle_command($user, $pl['body'])) {
+            return;
+        } else if ($this->is_autoreply($pl['body'])) {
+            $this->log(LOG_INFO, 'Ignoring auto reply from ' . $from);
+            return;
+        } else if ($this->is_otr($pl['body'])) {
+            $this->log(LOG_INFO, 'Ignoring OTR from ' . $from);
+            return;
+        } else if ($this->is_direct($pl['body'])) {
+            preg_match_all('/d[\ ]*([a-z0-9]{1,64})/', $pl['body'], $to);
+
+            $to = preg_replace('/^d([\ ])*/', '', $to[0][0]);
+            $body = preg_replace('/d[\ ]*('. $to .')[\ ]*/', '', $pl['body']);
+            $this->add_direct($user, $body, $to, $from);
+        } else {
+            $len = mb_strlen($pl['body']);
+            if($len > 140) {
+                $this->from_site($from, 'Message too long - maximum is 140 characters, you sent ' . $len);
+                return;
+            }
+            $this->add_notice($user, $pl);
+        }
+
+        $user->free();
+        unset($user);
+    }
+
+    function is_self($from) {
+        return preg_match('/^'.strtolower(jabber_daemon_address()).'/', strtolower($from));
+    }
+
+    function get_ofrom($pl) {
+        $xml = $pl['xml'];
+        $addresses = $xml->sub('addresses');
+        if (!$addresses) {
+            $this->log(LOG_WARNING, 'Forwarded message without addresses');
+            return NULL;
+        }
+        $address = $addresses->sub('address');
+        if (!$address) {
+            $this->log(LOG_WARNING, 'Forwarded message without address');
+            return NULL;
+        }
+        if (!array_key_exists('type', $address->attrs)) {
+            $this->log(LOG_WARNING, 'No type for forwarded message');
+            return NULL;
+        }
+        $type = $address->attrs['type'];
+        if ($type != 'ofrom') {
+            $this->log(LOG_WARNING, 'Type of forwarded message is not ofrom');
+            return NULL;
+        }
+        if (!array_key_exists('jid', $address->attrs)) {
+            $this->log(LOG_WARNING, 'No jid for forwarded message');
+            return NULL;
+        }
+        $jid = $address->attrs['jid'];
+        if (!$jid) {
+            $this->log(LOG_WARNING, 'Could not get jid from address');
+            return NULL;
+        }
+        $this->log(LOG_DEBUG, 'Got message forwarded from jid ' . $jid);
+        return $jid;
+    }
+
+    function is_autoreply($txt) {
+        if (preg_match('/[\[\(]?[Aa]uto[-\s]?[Rr]e(ply|sponse)[\]\)]/', $txt)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    function is_otr($txt) {
+        if (preg_match('/^\?OTR/', $txt)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    function is_direct($txt) {
+        if (strtolower(substr($txt, 0, 2))=='d ') {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    function from_site($address, $msg) {
+        $text = '['.common_config('site', 'name') . '] ' . $msg;
+        jabber_send_message($address, $text);
+    }
+
+    function handle_command($user, $body) {
+        $inter = new CommandInterpreter();
+        $cmd = $inter->handle_command($user, $body);
+        if ($cmd) {
+            $chan = new XMPPChannel($this->conn);
+            $cmd->execute($chan);
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    function add_notice(&$user, &$pl) {
         $body = trim($pl['body']);
         $content_shortened = common_shorten_link($body);
         if (mb_strlen($content_shortened) > 140) {
@@ -245,59 +245,59 @@ class XMPPDaemon extends Daemon {
         else {
             $content = $body;
         }
-               $notice = Notice::saveNew($user->id, $content, 'xmpp');
-               if (is_string($notice)) {
-                       $this->log(LOG_ERR, $notice);
-                       return;
-               }
-               common_broadcast_notice($notice);
-               $this->log(LOG_INFO,
-                                  'Added notice ' . $notice->id . ' from user ' . $user->nickname);
-               $notice->free();
-               unset($notice);
-       }
-
-       function handle_presence(&$pl) {
-               $from = jabber_normalize_jid($pl['from']);
-               switch ($pl['type']) {
-                case 'subscribe':
-                       # We let anyone subscribe
-                       $this->subscribed($from);
-                       $this->log(LOG_INFO,
-                                          'Accepted subscription from ' . $from);
-                       break;
-                case 'subscribed':
-                case 'unsubscribed':
-                case 'unsubscribe':
-                       $this->log(LOG_INFO,
-                                          'Ignoring  "' . $pl['type'] . '" from ' . $from);
-                       break;
-                default:
-                       if (!$pl['type']) {
-                               $user = User::staticGet('jabber', $from);
-                               if (!$user) {
-                                       $this->log(LOG_WARNING, 'Presence from unknown user ' . $from);
-                                       return;
-                               }
-                               if ($user->updatefrompresence) {
-                                       $this->log(LOG_INFO, 'Updating ' . $user->nickname .
-                                                          ' status from presence.');
-                                       $this->add_notice($user, $pl);
-                               }
-                               $user->free();
-                               unset($user);
-                       }
-                       break;
-               }
-       }
-
-       function log($level, $msg) {
-               common_log($level, 'XMPPDaemon('.$this->resource.'): '.$msg);
-       }
-
-       function subscribed($to) {
-               jabber_special_presence('subscribed', $to);
-       }
+        $notice = Notice::saveNew($user->id, $content, 'xmpp');
+        if (is_string($notice)) {
+            $this->log(LOG_ERR, $notice);
+            return;
+        }
+        common_broadcast_notice($notice);
+        $this->log(LOG_INFO,
+                   'Added notice ' . $notice->id . ' from user ' . $user->nickname);
+        $notice->free();
+        unset($notice);
+    }
+
+    function handle_presence(&$pl) {
+        $from = jabber_normalize_jid($pl['from']);
+        switch ($pl['type']) {
+         case 'subscribe':
+            # We let anyone subscribe
+            $this->subscribed($from);
+            $this->log(LOG_INFO,
+                       'Accepted subscription from ' . $from);
+            break;
+         case 'subscribed':
+         case 'unsubscribed':
+         case 'unsubscribe':
+            $this->log(LOG_INFO,
+                       'Ignoring  "' . $pl['type'] . '" from ' . $from);
+            break;
+         default:
+            if (!$pl['type']) {
+                $user = User::staticGet('jabber', $from);
+                if (!$user) {
+                    $this->log(LOG_WARNING, 'Presence from unknown user ' . $from);
+                    return;
+                }
+                if ($user->updatefrompresence) {
+                    $this->log(LOG_INFO, 'Updating ' . $user->nickname .
+                               ' status from presence.');
+                    $this->add_notice($user, $pl);
+                }
+                $user->free();
+                unset($user);
+            }
+            break;
+        }
+    }
+
+    function log($level, $msg) {
+        common_log($level, 'XMPPDaemon('.$this->resource.'): '.$msg);
+    }
+
+    function subscribed($to) {
+        jabber_special_presence('subscribed', $to);
+    }
 }
 
 ini_set("max_execution_time", "0");
index e09c8fa729b78b86ffc3017daf2b551a316a5202..ffadf4b715a5a535453bd807d81f9f2e81f06054 100644 (file)
-hunk ./lib/noticelist.php 5
-- * utilities for sending email
-+ * widget for displaying a list of notices
+hunk ./actions/accesstoken.php 25
+-      function handle($args) {
+-              parent::handle($args);
+-              try {
+-                      common_debug('getting request from env variables', __FILE__);
+-                      common_remove_magic_from_request();
+-                      $req = OAuthRequest::from_request();
+-                      common_debug('getting a server', __FILE__);
+-                      $server = omb_oauth_server();
+-                      common_debug('fetching the access token', __FILE__);
+-                      $token = $server->fetch_access_token($req);
+-                      common_debug('got this token: "'.print_r($token,TRUE).'"', __FILE__);
+-                      common_debug('printing the access token', __FILE__);
+-                      print $token;
+-              } catch (OAuthException $e) {
+-                      common_server_error($e->getMessage());
+-              }
+-      }
++    function handle($args) {
++        parent::handle($args);
++        try {
++            common_debug('getting request from env variables', __FILE__);
++            common_remove_magic_from_request();
++            $req = OAuthRequest::from_request();
++            common_debug('getting a server', __FILE__);
++            $server = omb_oauth_server();
++            common_debug('fetching the access token', __FILE__);
++            $token = $server->fetch_access_token($req);
++            common_debug('got this token: "'.print_r($token,TRUE).'"', __FILE__);
++            common_debug('printing the access token', __FILE__);
++            print $token;
++        } catch (OAuthException $e) {
++            common_server_error($e->getMessage());
++        }
++    }
+hunk ./actions/all.php 26
+-      function handle($args) {
++    function handle($args) {
+hunk ./actions/all.php 28
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/all.php 30
+-              $nickname = common_canonical_nickname($this->arg('nickname'));
+-              $user = User::staticGet('nickname', $nickname);
++        $nickname = common_canonical_nickname($this->arg('nickname'));
++        $user = User::staticGet('nickname', $nickname);
+hunk ./actions/all.php 33
+-              if (!$user) {
+-                      $this->client_error(_('No such user.'));
+-                      return;
+-              }
++        if (!$user) {
++            $this->client_error(_('No such user.'));
++            return;
++        }
+hunk ./actions/all.php 38
+-              $profile = $user->getProfile();
++        $profile = $user->getProfile();
+hunk ./actions/all.php 40
+-              if (!$profile) {
+-                      common_server_error(_('User has no profile.'));
+-                      return;
+-              }
++        if (!$profile) {
++            common_server_error(_('User has no profile.'));
++            return;
++        }
+hunk ./actions/all.php 45
+-              # Looks like we're good; show the header
++        # Looks like we're good; show the header
+hunk ./actions/all.php 47
+-              common_show_header(sprintf(_("%s and friends"), $profile->nickname),
+-                                                 array($this, 'show_header'), $user,
+-                                                 array($this, 'show_top'));
++        common_show_header(sprintf(_("%s and friends"), $profile->nickname),
++                           array($this, 'show_header'), $user,
++                           array($this, 'show_top'));
+hunk ./actions/all.php 51
+-              $this->show_notices($user);
++        $this->show_notices($user);
+hunk ./actions/all.php 53
+-              common_show_footer();
+-      }
++        common_show_footer();
++    }
+hunk ./actions/all.php 56
+-      function show_header($user) {
+-              common_element('link', array('rel' => 'alternate',
+-                                                                       'href' => common_local_url('allrss', array('nickname' =>
+-                                                                                                                                                         $user->nickname)),
+-                                                                       'type' => 'application/rss+xml',
+-                                                                       'title' => sprintf(_('Feed for friends of %s'), $user->nickname)));
+-      }
++    function show_header($user) {
++        common_element('link', array('rel' => 'alternate',
++                                     'href' => common_local_url('allrss', array('nickname' =>
++                                                                               $user->nickname)),
++                                     'type' => 'application/rss+xml',
++                                     'title' => sprintf(_('Feed for friends of %s'), $user->nickname)));
++    }
+hunk ./actions/all.php 64
+-      function show_top($user) {
+-              $cur = common_current_user();
++    function show_top($user) {
++        $cur = common_current_user();
+hunk ./actions/all.php 67
+-              if ($cur && $cur->id == $user->id) {
+-                      common_notice_form('all');
+-              }
++        if ($cur && $cur->id == $user->id) {
++            common_notice_form('all');
++        }
+hunk ./actions/all.php 71
+-              $this->views_menu();
++        $this->views_menu();
+hunk ./actions/all.php 73
+-              $this->show_feeds_list(array(0=>array('href'=>common_local_url('allrss', array('nickname' => $user->nickname)),
+-                                                                                        'type' => 'rss',
+-                                                                                        'version' => 'RSS 1.0',
+-                                                                                        'item' => 'allrss')));
+-      }
++        $this->show_feeds_list(array(0=>array('href'=>common_local_url('allrss', array('nickname' => $user->nickname)),
++                                              'type' => 'rss',
++                                              'version' => 'RSS 1.0',
++                                              'item' => 'allrss')));
++    }
+hunk ./actions/all.php 79
+-      function show_notices($user) {
++    function show_notices($user) {
+hunk ./actions/all.php 81
+-              $page = $this->trimmed('page');
+-              if (!$page) {
+-                      $page = 1;
+-              }
++        $page = $this->trimmed('page');
++        if (!$page) {
++            $page = 1;
++        }
+hunk ./actions/all.php 86
+-              $notice = $user->noticesWithFriends(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
++        $notice = $user->noticesWithFriends(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+hunk ./actions/all.php 90
+-              common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+-                                                $page, 'all', array('nickname' => $user->nickname));
+-      }
++        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
++                          $page, 'all', array('nickname' => $user->nickname));
++    }
+hunk ./actions/allrss.php 28
+-      var $user = NULL;
++    var $user = NULL;
+hunk ./actions/allrss.php 30
+-      function init() {
+-              $nickname = $this->trimmed('nickname');
+-              $this->user = User::staticGet('nickname', $nickname);
++    function init() {
++        $nickname = $this->trimmed('nickname');
++        $this->user = User::staticGet('nickname', $nickname);
+hunk ./actions/allrss.php 34
+-              if (!$this->user) {
+-                      common_user_error(_('No such user.'));
+-                      return false;
+-              } else {
+-                      return true;
+-              }
+-      }
++        if (!$this->user) {
++            common_user_error(_('No such user.'));
++            return false;
++        } else {
++            return true;
++        }
++    }
+hunk ./actions/allrss.php 42
+-      function get_notices($limit=0) {
++    function get_notices($limit=0) {
+hunk ./actions/allrss.php 44
+-              $user = $this->user;
+-              
+-              $notice = $user->noticesWithFriends(0, $limit);
+-                                                                                      
+-              while ($notice->fetch()) {
+-                      $notices[] = clone($notice);
+-              }
++        $user = $this->user;
++        
++        $notice = $user->noticesWithFriends(0, $limit);
++                                            
++        while ($notice->fetch()) {
++            $notices[] = clone($notice);
++        }
+hunk ./actions/allrss.php 52
+-              return $notices;
+-      }
++        return $notices;
++    }
+hunk ./actions/allrss.php 55
+-      function get_channel() {
+-              $user = $this->user;
+-              $c = array('url' => common_local_url('allrss',
+-                                                                                       array('nickname' =>
+-                                                                                                 $user->nickname)),
+-                                 'title' => sprintf(_('%s and friends'), $user->nickname),
+-                                 'link' => common_local_url('all',
+-                                                                                       array('nickname' =>
+-                                                                                                 $user->nickname)),
+-                                 'description' => sprintf(_('Feed for friends of %s'), $user->nickname));
+-              return $c;
+-      }
++    function get_channel() {
++        $user = $this->user;
++        $c = array('url' => common_local_url('allrss',
++                                             array('nickname' =>
++                                                   $user->nickname)),
++                   'title' => sprintf(_('%s and friends'), $user->nickname),
++                   'link' => common_local_url('all',
++                                             array('nickname' =>
++                                                   $user->nickname)),
++                   'description' => sprintf(_('Feed for friends of %s'), $user->nickname));
++        return $c;
++    }
+hunk ./actions/allrss.php 68
+-      function get_image() {
+-              $user = $this->user;
+-              $profile = $user->getProfile();
+-              if (!$profile) {
+-                      return NULL;
+-              }
+-              $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+-              return ($avatar) ? $avatar->url : NULL;
+-      }
++    function get_image() {
++        $user = $this->user;
++        $profile = $user->getProfile();
++        if (!$profile) {
++            return NULL;
++        }
++        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
++        return ($avatar) ? $avatar->url : NULL;
++    }
+hunk ./actions/api.php 13
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+hunk ./actions/api.php 17
+- * along with this program.    If not, see <http://www.gnu.org/licenses/>.
++ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+hunk ./actions/api.php 24
+-      var $user;
+-      var $content_type;
+-      var $api_arg;
+-      var $api_method;
+-      var $api_action;
++    var $user;
++    var $content_type;
++    var $api_arg;
++    var $api_method;
++    var $api_action;
+hunk ./actions/api.php 30
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/api.php 33
+-              $this->api_action = $this->arg('apiaction');
+-              $method = $this->arg('method');
+-              $argument = $this->arg('argument');
++        $this->api_action = $this->arg('apiaction');
++        $method = $this->arg('method');
++        $argument = $this->arg('argument');
+hunk ./actions/api.php 37
+-              if (isset($argument)) {
+-                      $cmdext = explode('.', $argument);
+-                      $this->api_arg =  $cmdext[0];
+-                      $this->api_method = $method;
+-                      $this->content_type = strtolower($cmdext[1]);
+-              } else {
++        if (isset($argument)) {
++            $cmdext = explode('.', $argument);
++            $this->api_arg =  $cmdext[0];
++            $this->api_method = $method;
++            $this->content_type = strtolower($cmdext[1]);
++        } else {
+hunk ./actions/api.php 44
+-                      # Requested format / content-type will be an extension on the method
+-                      $cmdext = explode('.', $method);
+-                      $this->api_method = $cmdext[0];
+-                      $this->content_type = strtolower($cmdext[1]);
+-              }
++            # Requested format / content-type will be an extension on the method
++            $cmdext = explode('.', $method);
++            $this->api_method = $cmdext[0];
++            $this->content_type = strtolower($cmdext[1]);
++        }
+hunk ./actions/api.php 50
+-              if ($this->requires_auth()) {
+-                      if (!isset($_SERVER['PHP_AUTH_USER'])) {
++        if ($this->requires_auth()) {
++            if (!isset($_SERVER['PHP_AUTH_USER'])) {
+hunk ./actions/api.php 53
+-                              # This header makes basic auth go
+-                              header('WWW-Authenticate: Basic realm="Laconica API"');
++                # This header makes basic auth go
++                header('WWW-Authenticate: Basic realm="Laconica API"');
+hunk ./actions/api.php 56
+-                              # If the user hits cancel -- bam!
+-                              $this->show_basic_auth_error();
+-                      } else {
+-                              $nickname = $_SERVER['PHP_AUTH_USER'];
+-                              $password = $_SERVER['PHP_AUTH_PW'];
+-                              $user = common_check_user($nickname, $password);
++                # If the user hits cancel -- bam!
++                $this->show_basic_auth_error();
++            } else {
++                $nickname = $_SERVER['PHP_AUTH_USER'];
++                $password = $_SERVER['PHP_AUTH_PW'];
++                $user = common_check_user($nickname, $password);
+hunk ./actions/api.php 63
+-                              if ($user) {
+-                                      $this->user = $user;
+-                                      $this->process_command();
+-                              } else {
+-                                      # basic authentication failed
+-                                      $this->show_basic_auth_error();
+-                              }
+-                      }
+-              } else {
++                if ($user) {
++                    $this->user = $user;
++                    $this->process_command();
++                } else {
++                    # basic authentication failed
++                    $this->show_basic_auth_error();
++                }
++            }
++        } else {
+hunk ./actions/api.php 73
+-                      # Look for the user in the session
+-                      if (common_logged_in()) {
+-                              $this->user = common_current_user();
+-                      }
++            # Look for the user in the session
++            if (common_logged_in()) {
++                 $this->user = common_current_user();
++            }
+hunk ./actions/api.php 78
+-                      $this->process_command();
+-              }
+-      }
++            $this->process_command();
++        }
++    }
+hunk ./actions/api.php 82
+-      function process_command() {
+-              $action = "twitapi$this->api_action";
+-              $actionfile = INSTALLDIR."/actions/$action.php";
++    function process_command() {
++        $action = "twitapi$this->api_action";
++        $actionfile = INSTALLDIR."/actions/$action.php";
+hunk ./actions/api.php 86
+-              if (file_exists($actionfile)) {
+-                      require_once($actionfile);
+-                      $action_class = ucfirst($action)."Action";
+-                      $action_obj = new $action_class();
++        if (file_exists($actionfile)) {
++            require_once($actionfile);
++            $action_class = ucfirst($action)."Action";
++            $action_obj = new $action_class();
+hunk ./actions/api.php 95
+-                      if (method_exists($action_obj, $this->api_method)) {
+-                              $apidata = array(       'content-type' => $this->content_type,
+-                                                                      'api_method' => $this->api_method,
+-                                                                      'api_arg' => $this->api_arg,
+-                                                                      'user' => $this->user);
++            if (method_exists($action_obj, $this->api_method)) {
++                $apidata = array(    'content-type' => $this->content_type,
++                                    'api_method' => $this->api_method,
++                                    'api_arg' => $this->api_arg,
++                                    'user' => $this->user);
+hunk ./actions/api.php 101
+-                              call_user_func(array($action_obj, $this->api_method), $_REQUEST, $apidata);
+-                      } else {
+-                              common_user_error("API method not found!", $code=404);
+-                      }
+-              } else {
+-                      common_user_error("API method not found!", $code=404);
+-              }
+-      }
++                call_user_func(array($action_obj, $this->api_method), $_REQUEST, $apidata);
++            } else {
++                common_user_error("API method not found!", $code=404);
++            }
++        } else {
++            common_user_error("API method not found!", $code=404);
++        }
++    }
+hunk ./actions/api.php 110
+-      # Whitelist of API methods that don't need authentication
+-      function requires_auth() {
+-              static $noauth = array( 'statuses/public_timeline',
+-                                                              'statuses/show',
+-                                                              'users/show',
+-                                                              'help/test',
+-                                                              'help/downtime_schedule');
++    # Whitelist of API methods that don't need authentication
++    function requires_auth() {
++        static $noauth = array( 'statuses/public_timeline',
++                                'statuses/show',
++                                'users/show',
++                                'help/test',
++                                'help/downtime_schedule');
+hunk ./actions/api.php 118
+-              static $bareauth = array('statuses/user_timeline',
+-                                                               'statuses/friends',
+-                                                               'statuses/followers',
+-                                                               'favorites/favorites');
++        static $bareauth = array('statuses/user_timeline',
++                                 'statuses/friends',
++                                 'statuses/followers',
++                                 'favorites/favorites');
+hunk ./actions/api.php 129
+-              $fullname = "$this->api_action/$this->api_method";
++        $fullname = "$this->api_action/$this->api_method";
+hunk ./actions/api.php 131
+-              if (in_array($fullname, $bareauth)) {
+-                      # bareauth: only needs auth if without an argument
+-                      if ($this->api_arg) {
+-                              return false;
+-                      } else {
+-                              return true;
+-                      }
+-              } else if (in_array($fullname, $noauth)) {
+-                      # noauth: never needs auth
+-                      return false;
+-              } else {
+-                      # everybody else needs auth
+-                      return true;
+-              }
+-      }
++        if (in_array($fullname, $bareauth)) {
++            # bareauth: only needs auth if without an argument
++            if ($this->api_arg) {
++                return false;
++            } else {
++                return true;
++            }
++        } else if (in_array($fullname, $noauth)) {
++            # noauth: never needs auth
++            return false;
++        } else {
++            # everybody else needs auth
++            return true;
++        }
++    }
+hunk ./actions/api.php 147
+-      function show_basic_auth_error() {
+-              header('HTTP/1.1 401 Unauthorized');
+-              $msg = 'Could not authenticate you.';
++    function show_basic_auth_error() {
++        header('HTTP/1.1 401 Unauthorized');
++        $msg = 'Could not authenticate you.';
+hunk ./actions/api.php 151
+-              if ($this->content_type == 'xml') {
+-                      header('Content-Type: application/xml; charset=utf-8');
+-                      common_start_xml();
+-                      common_element_start('hash');
+-                      common_element('error', NULL, $msg);
+-                      common_element('request', NULL, $_SERVER['REQUEST_URI']);
+-                      common_element_end('hash');
+-                      common_end_xml();
+-              } else if ($this->content_type == 'json')  {
+-                      header('Content-Type: application/json; charset=utf-8');
+-                      $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
+-                      print(json_encode($error_array));
+-              } else {
+-                      header('Content-type: text/plain');
+-                      print "$msg\n";
+-              }
+-      }
++        if ($this->content_type == 'xml') {
++            header('Content-Type: application/xml; charset=utf-8');
++            common_start_xml();
++            common_element_start('hash');
++            common_element('error', NULL, $msg);
++            common_element('request', NULL, $_SERVER['REQUEST_URI']);
++            common_element_end('hash');
++            common_end_xml();
++        } else if ($this->content_type == 'json')  {
++            header('Content-Type: application/json; charset=utf-8');
++            $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
++            print(json_encode($error_array));
++        } else {
++            header('Content-type: text/plain');
++            print "$msg\n";
++        }
++    }
+hunk ./actions/api.php 169
+-      function is_readonly() {
+-              # NOTE: before handle(), can't use $this->arg
+-              $apiaction = $_REQUEST['apiaction'];
+-              $method = $_REQUEST['method'];
+-              list($cmdtext, $fmt) = explode('.', $method);
++    function is_readonly() {
++        # NOTE: before handle(), can't use $this->arg
++        $apiaction = $_REQUEST['apiaction'];
++        $method = $_REQUEST['method'];
++        list($cmdtext, $fmt) = explode('.', $method);
+hunk ./actions/api.php 175
+-              static $write_methods = array(
+-                      'account' => array('update_location', 'update_delivery_device', 'end_session'),
+-                      'blocks' => array('create', 'destroy'),
+-                      'direct_messages' => array('create', 'destroy'),
+-                      'favorites' => array('create', 'destroy'),
+-                      'friendships' => array('create', 'destroy'),
+-                      'help' => array(),
+-                      'notifications' => array('follow', 'leave'),
+-                      'statuses' => array('update', 'destroy'),
+-                      'users' => array()
+-              );
++        static $write_methods = array(
++            'account' => array('update_location', 'update_delivery_device', 'end_session'),
++            'blocks' => array('create', 'destroy'),
++            'direct_messages' => array('create', 'destroy'),
++            'favorites' => array('create', 'destroy'),
++            'friendships' => array('create', 'destroy'),
++            'help' => array(),
++            'notifications' => array('follow', 'leave'),
++            'statuses' => array('update', 'destroy'),
++            'users' => array()
++        );
+hunk ./actions/api.php 187
+-              if (array_key_exists($apiaction, $write_methods)) {
+-                      if (!in_array($cmdtext, $write_methods[$apiaction])) {
+-                              return true;
+-                      }
+-              }
++        if (array_key_exists($apiaction, $write_methods)) {
++            if (!in_array($cmdtext, $write_methods[$apiaction])) {
++                return true;
++            }
++        }
+hunk ./actions/api.php 193
+-              return false;
+-      }
++        return false;
++    }
+hunk ./actions/avatarbynickname.php 27
+-              $this->client_error(_('No nickname.'));
+-                      return;
+-              }
+-              $size = $this->trimmed('size');
++            $this->client_error(_('No nickname.'));
++            return;
++        }
++        $size = $this->trimmed('size');
+hunk ./actions/avatarbynickname.php 32
+-              $this->client_error(_('No size.'));
+-                      return;
+-              }
+-              $size = strtolower($size);
+-              if (!in_array($size, array('original', '96', '48', '24'))) {
+-              $this->client_error(_('Invalid size.'));
+-                      return;
+-              }
++            $this->client_error(_('No size.'));
++            return;
++        }
++        $size = strtolower($size);
++        if (!in_array($size, array('original', '96', '48', '24'))) {
++            $this->client_error(_('Invalid size.'));
++            return;
++        }
+hunk ./actions/avatarbynickname.php 41
+-              $user = User::staticGet('nickname', $nickname);
+-              if (!$user) {
+-              $this->client_error(_('No such user.'));
+-                      return;
+-              }
+-              $profile = $user->getProfile();
+-              if (!$profile) {
+-              $this->client_error(_('User has no profile.'));
+-                      return;
+-              }
+-              if ($size == 'original') {
+-                      $avatar = $profile->getOriginal();
+-              } else {
+-                      $avatar = $profile->getAvatar($size+0);
+-              }
++        $user = User::staticGet('nickname', $nickname);
++        if (!$user) {
++            $this->client_error(_('No such user.'));
++            return;
++        }
++        $profile = $user->getProfile();
++        if (!$profile) {
++            $this->client_error(_('User has no profile.'));
++            return;
++        }
++        if ($size == 'original') {
++            $avatar = $profile->getOriginal();
++        } else {
++            $avatar = $profile->getAvatar($size+0);
++        }
+hunk ./actions/avatarbynickname.php 57
+-              if ($avatar) {
+-                      $url = $avatar->url;
+-              } else {
+-                      if ($size == 'original') {
+-                              $url = common_default_avatar(AVATAR_PROFILE_SIZE);
+-                      } else {
+-                              $url = common_default_avatar($size+0);
+-                      }
+-              }
+-              common_redirect($url, 302);
+-      }
++        if ($avatar) {
++            $url = $avatar->url;
++        } else {
++            if ($size == 'original') {
++                $url = common_default_avatar(AVATAR_PROFILE_SIZE);
++            } else {
++                $url = common_default_avatar($size+0);
++            }
++        }
++        common_redirect($url, 302);
++    }
+hunk ./actions/block.php 35
+-              $token = $this->trimmed('token');
++        $token = $this->trimmed('token');
+hunk ./actions/block.php 37
+-              if (!$token || $token != common_session_token()) {
+-                      $this->client_error(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        if (!$token || $token != common_session_token()) {
++            $this->client_error(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/block.php 78
+-              common_show_header(_('Block user'));
++        common_show_header(_('Block user'));
+hunk ./actions/confirmaddress.php 46
+-              $type = $confirm->address_type;
+-              if (!in_array($type, array('email', 'jabber', 'sms'))) {
+-                      $this->server_error(sprintf(_('Unrecognized address type %s'), $type));
+-                      return;
+-              }
++        $type = $confirm->address_type;
++        if (!in_array($type, array('email', 'jabber', 'sms'))) {
++            $this->server_error(sprintf(_('Unrecognized address type %s'), $type));
++            return;
++        }
+hunk ./actions/confirmaddress.php 53
+-                      return;
+-              }
++            return;
++        }
+hunk ./actions/confirmaddress.php 60
+-              $cur->$type = $confirm->address;
++        $cur->$type = $confirm->address;
+hunk ./actions/confirmaddress.php 62
+-              if ($type == 'sms') {
+-                      $cur->carrier = ($confirm->address_extra)+0;
+-                      $carrier = Sms_carrier::staticGet($cur->carrier);
+-                      $cur->smsemail = $carrier->toEmailAddress($cur->sms);
+-              }
++        if ($type == 'sms') {
++            $cur->carrier = ($confirm->address_extra)+0;
++            $carrier = Sms_carrier::staticGet($cur->carrier);
++            $cur->smsemail = $carrier->toEmailAddress($cur->sms);
++        }
+hunk ./actions/confirmaddress.php 68
+-              $result = $cur->updateKeys($orig_user);
++        $result = $cur->updateKeys($orig_user);
+hunk ./actions/confirmaddress.php 71
+-                      common_log_db_error($cur, 'UPDATE', __FILE__);
++            common_log_db_error($cur, 'UPDATE', __FILE__);
+hunk ./actions/confirmaddress.php 76
+-              if ($type == 'email') {
+-                  $cur->emailChanged();
+-              }
++        if ($type == 'email') {
++            $cur->emailChanged();
++        }
+hunk ./actions/confirmaddress.php 83
+-                      common_log_db_error($confirm, 'DELETE', __FILE__);
++            common_log_db_error($confirm, 'DELETE', __FILE__);
+hunk ./actions/deletenotice.php 25
+-      function handle($args) {
+-              parent::handle($args);
+-              # XXX: Ajax!
++    function handle($args) {
++        parent::handle($args);
++        # XXX: Ajax!
+hunk ./actions/deletenotice.php 29
+-              if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+-                      $this->delete_notice();
+-              } else if ($_SERVER['REQUEST_METHOD'] == 'GET') {
+-                      $this->show_form();
+-              }
+-      }
++        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
++            $this->delete_notice();
++        } else if ($_SERVER['REQUEST_METHOD'] == 'GET') {
++            $this->show_form();
++        }
++    }
+hunk ./actions/deletenotice.php 36
+-      function get_instructions() {
+-              return _('You are about to permanently delete a notice.  Once this is done, it cannot be undone.');
+-      }
++    function get_instructions() {
++        return _('You are about to permanently delete a notice.  Once this is done, it cannot be undone.');
++    }
+hunk ./actions/deletenotice.php 40
+-      function get_title() {
+-              return _('Delete notice');
+-      }
++    function get_title() {
++        return _('Delete notice');
++    }
+hunk ./actions/deletenotice.php 44
+-      function show_form($error=NULL) {
+-              $user = common_current_user();
++    function show_form($error=NULL) {
++        $user = common_current_user();
+hunk ./actions/deletenotice.php 47
+-              common_show_header($this->get_title(), array($this, 'show_header'), $error,
+-                                                 array($this, 'show_top'));
+-              common_element_start('form', array('id' => 'notice_delete_form',
+-                                                                 'method' => 'post',
+-                                                                 'action' => common_local_url('deletenotice')));
+-              common_hidden('token', common_session_token());
+-              common_hidden('notice', $this->trimmed('notice'));
+-              common_element_start('p');
+-              common_element('span', array('id' => 'confirmation_text'), _('Are you sure you want to delete this notice?'));
++        common_show_header($this->get_title(), array($this, 'show_header'), $error,
++                           array($this, 'show_top'));
++        common_element_start('form', array('id' => 'notice_delete_form',
++                                   'method' => 'post',
++                                   'action' => common_local_url('deletenotice')));
++        common_hidden('token', common_session_token());
++        common_hidden('notice', $this->trimmed('notice'));
++        common_element_start('p');
++        common_element('span', array('id' => 'confirmation_text'), _('Are you sure you want to delete this notice?'));
+hunk ./actions/deletenotice.php 57
+-              common_element('input', array('id' => 'submit_no',
+-                                                'name' => 'submit',
+-                                                'type' => 'submit',
+-                                                'value' => _('No')));
+-              common_element('input', array('id' => 'submit_yes',
+-                                                'name' => 'submit',
+-                                                'type' => 'submit',
+-                                                'value' => _('Yes')));
+-              common_element_end('p');
+-              common_element_end('form');
+-              common_show_footer();
+-      }
++        common_element('input', array('id' => 'submit_no',
++                          'name' => 'submit',
++                          'type' => 'submit',
++                          'value' => _('No')));
++        common_element('input', array('id' => 'submit_yes',
++                          'name' => 'submit',
++                          'type' => 'submit',
++                          'value' => _('Yes')));
++        common_element_end('p');
++        common_element_end('form');
++        common_show_footer();
++    }
+hunk ./actions/deletenotice.php 70
+-      function delete_notice() {
+-              # CSRF protection
+-              $token = $this->trimmed('token');
+-              if (!$token || $token != common_session_token()) {
+-                      $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
+-              $url = common_get_returnto();
+-              $confirmed = $this->trimmed('submit');
+-              if ($confirmed == _('Yes')) {
+-                      $user = common_current_user();
+-                      $notice_id = $this->trimmed('notice');
+-                      $notice = Notice::staticGet($notice_id);
+-                      $replies = new Reply;
+-                      $replies->get('notice_id', $notice_id);
++    function delete_notice() {
++        # CSRF protection
++        $token = $this->trimmed('token');
++        if (!$token || $token != common_session_token()) {
++            $this->show_form(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
++        $url = common_get_returnto();
++        $confirmed = $this->trimmed('submit');
++        if ($confirmed == _('Yes')) {
++            $user = common_current_user();
++            $notice_id = $this->trimmed('notice');
++            $notice = Notice::staticGet($notice_id);
++            $replies = new Reply;
++            $replies->get('notice_id', $notice_id);
+hunk ./actions/deletenotice.php 86
+-                      common_dequeue_notice($notice);
+-                      if (common_config('memcached', 'enabled')) {
+-                              $notice->blowSubsCache();
+-                      }
+-                      $replies->delete();
+-                      $notice->delete();
+-              } else {
+-                      if ($url) {
+-                              common_set_returnto(NULL);
+-                      } else {
+-                              $url = common_local_url('public');
+-                      }
+-              }
+-              common_redirect($url);
+-      }
++            common_dequeue_notice($notice);
++            if (common_config('memcached', 'enabled')) {
++                $notice->blowSubsCache();
++            }
++            $replies->delete();
++            $notice->delete();
++        } else {
++            if ($url) {
++                common_set_returnto(NULL);
++            } else {
++                $url = common_local_url('public');
++            }
++        }
++        common_redirect($url);
++    }
+hunk ./actions/deleteprofile.php 35
+-      function get_instructions() {
+-              return _('Export and delete your user information.');
+-      }
++    function get_instructions() {
++        return _('Export and delete your user information.');
++    }
+hunk ./actions/deleteprofile.php 39
+-      function form_header($title, $msg=NULL, $success=false) {
+-              common_show_header($title,
+-                                 NULL,
+-                                 array($msg, $success),
+-                                                 array($this, 'show_top'));
+-      }
++    function form_header($title, $msg=NULL, $success=false) {
++        common_show_header($title,
++                           NULL,
++                           array($msg, $success),
++                           array($this, 'show_top'));
++    }
+hunk ./actions/deleteprofile.php 46
+-      function show_feeds_list($feeds) {
+-              common_element_start('div', array('class' => 'feedsdel'));
+-              common_element('p', null, 'Feeds:');
+-              common_element_start('ul', array('class' => 'xoxo'));
++    function show_feeds_list($feeds) {
++        common_element_start('div', array('class' => 'feedsdel'));
++        common_element('p', null, 'Feeds:');
++        common_element_start('ul', array('class' => 'xoxo'));
+hunk ./actions/deleteprofile.php 51
+-              foreach ($feeds as $key => $value) {
+-                      $this->common_feed_item($feeds[$key]);
+-              }
+-              common_element_end('ul');
+-              common_element_end('div');
+-      }
++        foreach ($feeds as $key => $value) {
++            $this->common_feed_item($feeds[$key]);
++        }
++        common_element_end('ul');
++        common_element_end('div');
++    }
+hunk ./actions/deleteprofile.php 59
+-      function common_feed_item($feed) {
++    function common_feed_item($feed) {
+hunk ./actions/deleteprofile.php 61
+-              $nickname = $user->nickname;
++        $nickname = $user->nickname;
+hunk ./actions/deleteprofile.php 63
+-              switch($feed['item']) {
+-                      case 'notices': default:
+-                              $feed_classname = $feed['type'];
+-                              $feed_mimetype = "application/".$feed['type']."+xml";
+-                              $feed_title = "$nickname's ".$feed['version']." notice feed";
+-                              $feed['textContent'] = "RSS";
+-                              break;
++        switch($feed['item']) {
++            case 'notices': default:
++                $feed_classname = $feed['type'];
++                $feed_mimetype = "application/".$feed['type']."+xml";
++                $feed_title = "$nickname's ".$feed['version']." notice feed";
++                $feed['textContent'] = "RSS";
++                break;
+hunk ./actions/deleteprofile.php 71
+-                      case 'foaf':
+-                              $feed_classname = "foaf";
+-                              $feed_mimetype = "application/".$feed['type']."+xml";
+-                              $feed_title = "$nickname's FOAF file";
+-                              $feed['textContent'] = "FOAF";
+-                              break;
+-              }
+-              common_element_start('li');
+-              common_element('a', array('href' => $feed['href'],
+-                                                                'class' => $feed_classname,
+-                                                                'type' => $feed_mimetype,
+-                                                                'title' => $feed_title),
+-                                                      $feed['textContent']);
+-              common_element_end('li');
+-      }
++            case 'foaf':
++                $feed_classname = "foaf";
++                $feed_mimetype = "application/".$feed['type']."+xml";
++                $feed_title = "$nickname's FOAF file";
++                $feed['textContent'] = "FOAF";
++                break;
++        }
++        common_element_start('li');
++        common_element('a', array('href' => $feed['href'],
++                                  'class' => $feed_classname,
++                                  'type' => $feed_mimetype,
++                                  'title' => $feed_title),
++                            $feed['textContent']);
++        common_element_end('li');
++    }
+hunk ./actions/deleteprofile.php 87
+-      function show_form($msg=NULL, $success=false) {
+-              $this->form_header(_('Delete my account'), $msg, $success);
+-              common_element('h2', NULL, _('Delete my account confirmation'));
+-              $this->show_confirm_delete_form();
+-              common_show_footer();
+-      }
++    function show_form($msg=NULL, $success=false) {
++        $this->form_header(_('Delete my account'), $msg, $success);
++        common_element('h2', NULL, _('Delete my account confirmation'));
++        $this->show_confirm_delete_form();
++        common_show_footer();
++    }
+hunk ./actions/deleteprofile.php 94
+-      function show_confirm_delete_form() {
+-              $user = common_current_user();
++    function show_confirm_delete_form() {
++        $user = common_current_user();
+hunk ./actions/deleteprofile.php 100
+-              common_element_start('form', array('method' => 'POST',
+-                                                                                 'id' => 'delete',
+-                                                                                 'action' =>
+-                                                                                 common_local_url('deleteprofile')));
++        common_element_start('form', array('method' => 'POST',
++                                           'id' => 'delete',
++                                           'action' =>
++                                           common_local_url('deleteprofile')));
+hunk ./actions/deleteprofile.php 105
+-              common_hidden('token', common_session_token());
++        common_hidden('token', common_session_token());
+hunk ./actions/deleteprofile.php 108
+-              $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('limit' => $notice_count, 'nickname' => $user->nickname)),
+-                                                                                        'type' => 'rss',
+-                                                                                        'version' => 'RSS 1.0',
+-                                                                                        'item' => 'notices'),
+-                                                                       1=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
+-                                                                                        'type' => 'rdf',
+-                                                                                        'version' => 'FOAF',
+-                                                                                        'item' => 'foaf')));
++        $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('limit' => $notice_count, 'nickname' => $user->nickname)),
++                                              'type' => 'rss',
++                                              'version' => 'RSS 1.0',
++                                              'item' => 'notices'),
++                                     1=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
++                                              'type' => 'rdf',
++                                              'version' => 'FOAF',
++                                              'item' => 'foaf')));
+hunk ./actions/deleteprofile.php 119
+-              common_submit('deleteaccount', _('Delete my account'));
+-              common_element_end('form');
++        common_submit('deleteaccount', _('Delete my account'));
++        common_element_end('form');
+hunk ./actions/deleteprofile.php 123
+-      function handle_post() {
+-              # CSRF protection
+-              $token = $this->trimmed('token');
+-              if (!$token || $token != common_session_token()) {
+-                      $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++    function handle_post() {
++        # CSRF protection
++        $token = $this->trimmed('token');
++        if (!$token || $token != common_session_token()) {
++            $this->show_form(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/deleteprofile.php 137
+-      function delete_account() {
+-              $user = common_current_user();
+-              assert(!is_null($user)); # should already be checked
++    function delete_account() {
++        $user = common_current_user();
++        assert(!is_null($user)); # should already be checked
+hunk ./actions/deleteprofile.php 222
+-      function show_top($arr) {
+-              $msg = $arr[0];
+-              $success = $arr[1];
+-              if ($msg) {
+-                      $this->message($msg, $success);
+-              } else {
+-                      $inst = $this->get_instructions();
+-                      $output = common_markup_to_html($inst);
+-                      common_element_start('div', 'instructions');
+-                      common_raw($output);
+-                      common_element_end('div');
+-              }
+-              $this->settings_menu();
+-      }
++    function show_top($arr) {
++        $msg = $arr[0];
++        $success = $arr[1];
++        if ($msg) {
++            $this->message($msg, $success);
++        } else {
++            $inst = $this->get_instructions();
++            $output = common_markup_to_html($inst);
++            common_element_start('div', 'instructions');
++            common_raw($output);
++            common_element_end('div');
++        }
++        $this->settings_menu();
++    }
+hunk ./actions/deleteprofile.php 239
+-              $menu =
+-                array('profilesettings' =>
+-                              array(_('Profile'),
+-                                        _('Change your profile settings')),
+-                              'emailsettings' =>
+-                              array(_('Email'),
+-                                        _('Change email handling')),
+-                              'openidsettings' =>
+-                              array(_('OpenID'),
+-                                        _('Add or remove OpenIDs')),
+-                              'smssettings' =>
+-                              array(_('SMS'),
+-                                        _('Updates by SMS')),
+-                              'imsettings' =>
+-                              array(_('IM'),
+-                                        _('Updates by instant messenger (IM)')),
+-                              'twittersettings' =>
+-                              array(_('Twitter'),
+-                                        _('Twitter integration options')),
+-                              'othersettings' =>
+-                              array(_('Other'),
+-                                        _('Other options')));
++        $menu =
++          array('profilesettings' =>
++                array(_('Profile'),
++                      _('Change your profile settings')),
++                'emailsettings' =>
++                array(_('Email'),
++                      _('Change email handling')),
++                'openidsettings' =>
++                array(_('OpenID'),
++                      _('Add or remove OpenIDs')),
++                'smssettings' =>
++                array(_('SMS'),
++                      _('Updates by SMS')),
++                'imsettings' =>
++                array(_('IM'),
++                      _('Updates by instant messenger (IM)')),
++                'twittersettings' =>
++                array(_('Twitter'),
++                      _('Twitter integration options')),
++                'othersettings' =>
++                array(_('Other'),
++                      _('Other options')));
+hunk ./actions/deleteprofile.php 265
+-                      if ($menuaction == 'imsettings' &&
+-                              !common_config('xmpp', 'enabled')) {
+-                              continue;
+-                      }
++            if ($menuaction == 'imsettings' &&
++                !common_config('xmpp', 'enabled')) {
++                continue;
++            }
+hunk ./actions/disfavor.php 24
+-      function handle($args) {
++    function handle($args) {
+hunk ./actions/disfavor.php 26
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/disfavor.php 28
+-              if (!common_logged_in()) {
+-                      common_user_error(_('Not logged in.'));
+-                      return;
+-              }
++        if (!common_logged_in()) {
++            common_user_error(_('Not logged in.'));
++            return;
++        }
+hunk ./actions/disfavor.php 33
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/disfavor.php 35
+-              if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+-                      common_redirect(common_local_url('showfavorites', array('nickname' => $user->nickname)));
+-                      return;
+-              }
++        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
++            common_redirect(common_local_url('showfavorites', array('nickname' => $user->nickname)));
++            return;
++        }
+hunk ./actions/disfavor.php 40
+-              $id = $this->trimmed('notice');
++        $id = $this->trimmed('notice');
+hunk ./actions/disfavor.php 42
+-              $notice = Notice::staticGet($id);
++        $notice = Notice::staticGet($id);
+hunk ./actions/disfavor.php 44
+-              $token = $this->trimmed('token-'.$notice->id);
++        $token = $this->trimmed('token-'.$notice->id);
+hunk ./actions/disfavor.php 46
+-              if (!$token || $token != common_session_token()) {
+-                      $this->client_error(_("There was a problem with your session token. Try again, please."));
+-                      return;
+-              }
++        if (!$token || $token != common_session_token()) {
++            $this->client_error(_("There was a problem with your session token. Try again, please."));
++            return;
++        }
+hunk ./actions/disfavor.php 51
+-              $fave = new Fave();
+-              $fave->user_id = $this->id;
+-              $fave->notice_id = $notice->id;
+-              if (!$fave->find(true)) {
+-                      $this->client_error(_('This notice is not a favorite!'));
+-                      return;
+-              }
++        $fave = new Fave();
++        $fave->user_id = $this->id;
++        $fave->notice_id = $notice->id;
++        if (!$fave->find(true)) {
++            $this->client_error(_('This notice is not a favorite!'));
++            return;
++        }
+hunk ./actions/disfavor.php 59
+-              $result = $fave->delete();
++        $result = $fave->delete();
+hunk ./actions/disfavor.php 61
+-              if (!$result) {
+-                      common_log_db_error($fave, 'DELETE', __FILE__);
+-                      $this->server_error(_('Could not delete favorite.'));
+-                      return;
+-              }
+-              
+-              $user->blowFavesCache();
++        if (!$result) {
++            common_log_db_error($fave, 'DELETE', __FILE__);
++            $this->server_error(_('Could not delete favorite.'));
++            return;
++        }
++        
++        $user->blowFavesCache();
+hunk ./actions/disfavor.php 69
+-              if ($this->boolean('ajax')) {
+-                      common_start_html('text/xml;charset=utf-8', true);
+-                      common_element_start('head');
+-                      common_element('title', null, _('Add to favorites'));
+-                      common_element_end('head');
+-                      common_element_start('body');
+-                      common_favor_form($notice);
+-                      common_element_end('body');
+-                      common_element_end('html');
+-              } else {
+-                      common_redirect(common_local_url('showfavorites',
+-                                                                                       array('nickname' => $user->nickname)));
+-              }
+-      }
++        if ($this->boolean('ajax')) {
++            common_start_html('text/xml;charset=utf-8', true);
++            common_element_start('head');
++            common_element('title', null, _('Add to favorites'));
++            common_element_end('head');
++            common_element_start('body');
++            common_favor_form($notice);
++            common_element_end('body');
++            common_element_end('html');
++        } else {
++            common_redirect(common_local_url('showfavorites',
++                                             array('nickname' => $user->nickname)));
++        }
++    }
+hunk ./actions/doc.php 24
+-      function handle($args) {
+-              parent::handle($args);
+-              $title = $this->trimmed('title');
+-              $filename = INSTALLDIR.'/doc/'.$title;
+-              if (!file_exists($filename)) {
+-                      common_user_error(_('No such document.'));
+-                      return;
+-              }
+-              $c = file_get_contents($filename);
+-              $output = common_markup_to_html($c);
+-              common_show_header(_(ucfirst($title)));
+-              common_raw($output);
+-              common_show_footer();
+-      }
++    function handle($args) {
++        parent::handle($args);
++        $title = $this->trimmed('title');
++        $filename = INSTALLDIR.'/doc/'.$title;
++        if (!file_exists($filename)) {
++            common_user_error(_('No such document.'));
++            return;
++        }
++        $c = file_get_contents($filename);
++        $output = common_markup_to_html($c);
++        common_show_header(_(ucfirst($title)));
++        common_raw($output);
++        common_show_footer();
++    }
+hunk ./actions/emailsettings.php 26
+-      function get_instructions() {
+-              return _('Manage how you get email from %%site.name%%.');
+-      }
++    function get_instructions() {
++        return _('Manage how you get email from %%site.name%%.');
++    }
+hunk ./actions/emailsettings.php 30
+-      function show_form($msg=NULL, $success=false) {
+-              $user = common_current_user();
+-              $this->form_header(_('Email Settings'), $msg, $success);
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'emailsettings',
+-                                                                                 'action' =>
+-                                                                                 common_local_url('emailsettings')));
+-              common_hidden('token', common_session_token());
++    function show_form($msg=NULL, $success=false) {
++        $user = common_current_user();
++        $this->form_header(_('Email Settings'), $msg, $success);
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'emailsettings',
++                                           'action' =>
++                                           common_local_url('emailsettings')));
++        common_hidden('token', common_session_token());
+hunk ./actions/emailsettings.php 39
+-              common_element('h2', NULL, _('Address'));
++        common_element('h2', NULL, _('Address'));
+hunk ./actions/emailsettings.php 41
+-              if ($user->email) {
+-                      common_element_start('p');
+-                      common_element('span', 'address confirmed', $user->email);
+-                      common_element('span', 'input_instructions',
+-                                     _('Current confirmed email address.'));
+-                      common_hidden('email', $user->email);
+-                      common_element_end('p');
+-                      common_submit('remove', _('Remove'));
+-              } else {
+-                      $confirm = $this->get_confirmation();
+-                      if ($confirm) {
+-                              common_element_start('p');
+-                              common_element('span', 'address unconfirmed', $confirm->address);
+-                              common_element('span', 'input_instructions',
+-                                                         _('Awaiting confirmation on this address. Check your inbox (and spam box!) for a message with further instructions.'));
+-                              common_hidden('email', $confirm->address);
+-                              common_element_end('p');
+-                              common_submit('cancel', _('Cancel'));
+-                      } else {
+-                              common_input('email', _('Email Address'),
+-                                                       ($this->arg('email')) ? $this->arg('email') : NULL,
+-                                                       _('Email address, like "UserName@example.org"'));
+-                              common_submit('add', _('Add'));
+-                      }
+-              }
++        if ($user->email) {
++            common_element_start('p');
++            common_element('span', 'address confirmed', $user->email);
++            common_element('span', 'input_instructions',
++                           _('Current confirmed email address.'));
++            common_hidden('email', $user->email);
++            common_element_end('p');
++            common_submit('remove', _('Remove'));
++        } else {
++            $confirm = $this->get_confirmation();
++            if ($confirm) {
++                common_element_start('p');
++                common_element('span', 'address unconfirmed', $confirm->address);
++                common_element('span', 'input_instructions',
++                               _('Awaiting confirmation on this address. Check your inbox (and spam box!) for a message with further instructions.'));
++                common_hidden('email', $confirm->address);
++                common_element_end('p');
++                common_submit('cancel', _('Cancel'));
++            } else {
++                common_input('email', _('Email Address'),
++                             ($this->arg('email')) ? $this->arg('email') : NULL,
++                             _('Email address, like "UserName@example.org"'));
++                common_submit('add', _('Add'));
++            }
++        }
+hunk ./actions/emailsettings.php 67
+-              if ($user->email) {
+-                      common_element('h2', NULL, _('Incoming email'));
+-                      
+-                      if ($user->incomingemail) {
+-                              common_element_start('p');
+-                              common_element('span', 'address', $user->incomingemail);
+-                              common_element('span', 'input_instructions',
+-                                                         _('Send email to this address to post new notices.'));
+-                              common_element_end('p');
+-                              common_submit('removeincoming', _('Remove'));
+-                      }
+-                      
+-                      common_element_start('p');
+-                      common_element('span', 'input_instructions',
+-                                                 _('Make a new email address for posting to; cancels the old one.'));
+-                      common_element_end('p');
+-                      common_submit('newincoming', _('New'));
+-              }
+-              
+-              common_element('h2', NULL, _('Preferences'));
++        if ($user->email) {
++            common_element('h2', NULL, _('Incoming email'));
++            
++            if ($user->incomingemail) {
++                common_element_start('p');
++                common_element('span', 'address', $user->incomingemail);
++                common_element('span', 'input_instructions',
++                               _('Send email to this address to post new notices.'));
++                common_element_end('p');
++                common_submit('removeincoming', _('Remove'));
++            }
++            
++            common_element_start('p');
++            common_element('span', 'input_instructions',
++                           _('Make a new email address for posting to; cancels the old one.'));
++            common_element_end('p');
++            common_submit('newincoming', _('New'));
++        }
++        
++        common_element('h2', NULL, _('Preferences'));
+hunk ./actions/emailsettings.php 88
+-              common_checkbox('emailnotifysub',
+-                              _('Send me notices of new subscriptions through email.'),
+-                              $user->emailnotifysub);
+-              common_checkbox('emailnotifyfav',
+-                              _('Send me email when someone adds my notice as a favorite.'),
+-                              $user->emailnotifyfav);
+-              common_checkbox('emailnotifymsg',
+-                              _('Send me email when someone sends me a private message.'),
+-                              $user->emailnotifymsg);
+-              common_checkbox('emailnotifynudge',
+-                              _('Allow friends to nudge me and send me an email.'),
+-                              $user->emailnotifynudge);
+-              common_checkbox('emailpost',
+-                                              _('I want to post notices by email.'),
+-                                              $user->emailpost);
+-              common_checkbox('emailmicroid',
+-                              _('Publish a MicroID for my email address.'),
+-                              $user->emailmicroid);
++        common_checkbox('emailnotifysub',
++                        _('Send me notices of new subscriptions through email.'),
++                        $user->emailnotifysub);
++        common_checkbox('emailnotifyfav',
++                        _('Send me email when someone adds my notice as a favorite.'),
++                        $user->emailnotifyfav);
++        common_checkbox('emailnotifymsg',
++                        _('Send me email when someone sends me a private message.'),
++                        $user->emailnotifymsg);
++        common_checkbox('emailnotifynudge',
++                        _('Allow friends to nudge me and send me an email.'),
++                        $user->emailnotifynudge);
++        common_checkbox('emailpost',
++                        _('I want to post notices by email.'),
++                        $user->emailpost);
++        common_checkbox('emailmicroid',
++                        _('Publish a MicroID for my email address.'),
++                        $user->emailmicroid);
+hunk ./actions/emailsettings.php 107
+-              common_submit('save', _('Save'));
+-              
+-              common_element_end('form');
+-              common_show_footer();
+-      }
++        common_submit('save', _('Save'));
++        
++        common_element_end('form');
++        common_show_footer();
++    }
+hunk ./actions/emailsettings.php 113
+-      function get_confirmation() {
+-              $user = common_current_user();
+-              $confirm = new Confirm_address();
+-              $confirm->user_id = $user->id;
+-              $confirm->address_type = 'email';
+-              if ($confirm->find(TRUE)) {
+-                      return $confirm;
+-              } else {
+-                      return NULL;
+-              }
+-      }
++    function get_confirmation() {
++        $user = common_current_user();
++        $confirm = new Confirm_address();
++        $confirm->user_id = $user->id;
++        $confirm->address_type = 'email';
++        if ($confirm->find(TRUE)) {
++            return $confirm;
++        } else {
++            return NULL;
++        }
++    }
+hunk ./actions/emailsettings.php 125
+-      function handle_post() {
++    function handle_post() {
+hunk ./actions/emailsettings.php 127
+-              # CSRF protection
+-              $token = $this->trimmed('token');
+-              if (!$token || $token != common_session_token()) {
+-                      $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        # CSRF protection
++        $token = $this->trimmed('token');
++        if (!$token || $token != common_session_token()) {
++            $this->show_form(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/emailsettings.php 134
+-              if ($this->arg('save')) {
+-                      $this->save_preferences();
+-              } else if ($this->arg('add')) {
+-                      $this->add_address();
+-              } else if ($this->arg('cancel')) {
+-                      $this->cancel_confirmation();
+-              } else if ($this->arg('remove')) {
+-                      $this->remove_address();
+-              } else if ($this->arg('removeincoming')) {
+-                      $this->remove_incoming();
+-              } else if ($this->arg('newincoming')) {
+-                      $this->new_incoming();
+-              } else {
+-                      $this->show_form(_('Unexpected form submission.'));
+-              }
+-      }
++        if ($this->arg('save')) {
++            $this->save_preferences();
++        } else if ($this->arg('add')) {
++            $this->add_address();
++        } else if ($this->arg('cancel')) {
++            $this->cancel_confirmation();
++        } else if ($this->arg('remove')) {
++            $this->remove_address();
++        } else if ($this->arg('removeincoming')) {
++            $this->remove_incoming();
++        } else if ($this->arg('newincoming')) {
++            $this->new_incoming();
++        } else {
++            $this->show_form(_('Unexpected form submission.'));
++        }
++    }
+hunk ./actions/emailsettings.php 151
+-      function save_preferences() {
++    function save_preferences() {
+hunk ./actions/emailsettings.php 153
+-              $emailnotifysub = $this->boolean('emailnotifysub');
+-              $emailnotifyfav = $this->boolean('emailnotifyfav');
+-              $emailnotifymsg = $this->boolean('emailnotifymsg');
+-              $emailnotifynudge = $this->boolean('emailnotifynudge');
+-              $emailmicroid = $this->boolean('emailmicroid');
+-              $emailpost = $this->boolean('emailpost');
++        $emailnotifysub = $this->boolean('emailnotifysub');
++        $emailnotifyfav = $this->boolean('emailnotifyfav');
++        $emailnotifymsg = $this->boolean('emailnotifymsg');
++        $emailnotifynudge = $this->boolean('emailnotifynudge');
++        $emailmicroid = $this->boolean('emailmicroid');
++        $emailpost = $this->boolean('emailpost');
+hunk ./actions/emailsettings.php 160
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/emailsettings.php 162
+-              assert(!is_null($user)); # should already be checked
++        assert(!is_null($user)); # should already be checked
+hunk ./actions/emailsettings.php 164
+-              $user->query('BEGIN');
++        $user->query('BEGIN');
+hunk ./actions/emailsettings.php 166
+-              $original = clone($user);
++        $original = clone($user);
+hunk ./actions/emailsettings.php 168
+-              $user->emailnotifysub = $emailnotifysub;
+-              $user->emailnotifyfav = $emailnotifyfav;
+-              $user->emailnotifymsg = $emailnotifymsg;
+-              $user->emailnotifynudge = $emailnotifynudge;
+-              $user->emailmicroid = $emailmicroid;
+-              $user->emailpost = $emailpost;
++        $user->emailnotifysub = $emailnotifysub;
++        $user->emailnotifyfav = $emailnotifyfav;
++        $user->emailnotifymsg = $emailnotifymsg;
++        $user->emailnotifynudge = $emailnotifynudge;
++        $user->emailmicroid = $emailmicroid;
++        $user->emailpost = $emailpost;
+hunk ./actions/emailsettings.php 175
+-              $result = $user->update($original);
++        $result = $user->update($original);
+hunk ./actions/emailsettings.php 177
+-              if ($result === FALSE) {
+-                      common_log_db_error($user, 'UPDATE', __FILE__);
+-                      common_server_error(_('Couldn\'t update user.'));
+-                      return;
+-              }
++        if ($result === FALSE) {
++            common_log_db_error($user, 'UPDATE', __FILE__);
++            common_server_error(_('Couldn\'t update user.'));
++            return;
++        }
+hunk ./actions/emailsettings.php 183
+-              $user->query('COMMIT');
++        $user->query('COMMIT');
+hunk ./actions/emailsettings.php 185
+-              $this->show_form(_('Preferences saved.'), true);
+-      }
++        $this->show_form(_('Preferences saved.'), true);
++    }
+hunk ./actions/emailsettings.php 188
+-      function add_address() {
++    function add_address() {
+hunk ./actions/emailsettings.php 190
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/emailsettings.php 192
+-              $email = $this->trimmed('email');
++        $email = $this->trimmed('email');
+hunk ./actions/emailsettings.php 194
+-              # Some validation
++        # Some validation
+hunk ./actions/emailsettings.php 196
+-              if (!$email) {
+-                      $this->show_form(_('No email address.'));
+-                      return;
+-              }
++        if (!$email) {
++            $this->show_form(_('No email address.'));
++            return;
++        }
+hunk ./actions/emailsettings.php 201
+-              $email = common_canonical_email($email);
++        $email = common_canonical_email($email);
+hunk ./actions/emailsettings.php 203
+-              if (!$email) {
+-                  $this->show_form(_('Cannot normalize that email address'));
+-                  return;
+-              }
+-              if (!Validate::email($email, true)) {
+-                  $this->show_form(_('Not a valid email address'));
+-                  return;
+-              } else if ($user->email == $email) {
+-                  $this->show_form(_('That is already your email address.'));
+-                  return;
+-              } else if ($this->email_exists($email)) {
+-                  $this->show_form(_('That email address already belongs to another user.'));
+-                  return;
+-              }
++        if (!$email) {
++            $this->show_form(_('Cannot normalize that email address'));
++            return;
++        }
++        if (!Validate::email($email, true)) {
++            $this->show_form(_('Not a valid email address'));
++            return;
++        } else if ($user->email == $email) {
++            $this->show_form(_('That is already your email address.'));
++            return;
++        } else if ($this->email_exists($email)) {
++            $this->show_form(_('That email address already belongs to another user.'));
++            return;
++        }
+hunk ./actions/emailsettings.php 218
+-              $confirm = new Confirm_address();
+-              $confirm->address = $email;
+-              $confirm->address_type = 'email';
+-              $confirm->user_id = $user->id;
+-              $confirm->code = common_confirmation_code(64);
++          $confirm = new Confirm_address();
++           $confirm->address = $email;
++           $confirm->address_type = 'email';
++           $confirm->user_id = $user->id;
++           $confirm->code = common_confirmation_code(64);
+hunk ./actions/emailsettings.php 224
+-              $result = $confirm->insert();
++        $result = $confirm->insert();
+hunk ./actions/emailsettings.php 226
+-              if ($result === FALSE) {
+-                      common_log_db_error($confirm, 'INSERT', __FILE__);
+-                      common_server_error(_('Couldn\'t insert confirmation code.'));
+-                      return;
+-              }
++        if ($result === FALSE) {
++            common_log_db_error($confirm, 'INSERT', __FILE__);
++            common_server_error(_('Couldn\'t insert confirmation code.'));
++            return;
++        }
+hunk ./actions/emailsettings.php 232
+-              mail_confirm_address($user, $confirm->code, $user->nickname, $email);
++        mail_confirm_address($user, $confirm->code, $user->nickname, $email);
+hunk ./actions/emailsettings.php 234
+-              $msg = _('A confirmation code was sent to the email address you added. Check your inbox (and spam box!) for the code and instructions on how to use it.');
++        $msg = _('A confirmation code was sent to the email address you added. Check your inbox (and spam box!) for the code and instructions on how to use it.');
+hunk ./actions/emailsettings.php 236
+-              $this->show_form($msg, TRUE);
+-      }
++        $this->show_form($msg, TRUE);
++    }
+hunk ./actions/emailsettings.php 239
+-      function cancel_confirmation() {
+-              $email = $this->arg('email');
+-              $confirm = $this->get_confirmation();
+-              if (!$confirm) {
+-                      $this->show_form(_('No pending confirmation to cancel.'));
+-                      return;
+-              }
+-              if ($confirm->address != $email) {
+-                      $this->show_form(_('That is the wrong IM address.'));
+-                      return;
+-              }
++    function cancel_confirmation() {
++        $email = $this->arg('email');
++        $confirm = $this->get_confirmation();
++        if (!$confirm) {
++            $this->show_form(_('No pending confirmation to cancel.'));
++            return;
++        }
++        if ($confirm->address != $email) {
++            $this->show_form(_('That is the wrong IM address.'));
++            return;
++        }
+hunk ./actions/emailsettings.php 254
+-                      common_log_db_error($confirm, 'DELETE', __FILE__);
++            common_log_db_error($confirm, 'DELETE', __FILE__);
+hunk ./actions/emailsettings.php 260
+-      }
++    }
+hunk ./actions/emailsettings.php 262
+-      function remove_address() {
++    function remove_address() {
+hunk ./actions/emailsettings.php 264
+-              $user = common_current_user();
+-              $email = $this->arg('email');
++        $user = common_current_user();
++        $email = $this->arg('email');
+hunk ./actions/emailsettings.php 267
+-              # Maybe an old tab open...?
++        # Maybe an old tab open...?
+hunk ./actions/emailsettings.php 269
+-              if ($user->email != $email) {
+-                  $this->show_form(_('That is not your email address.'));
+-                  return;
+-              }
++        if ($user->email != $email) {
++            $this->show_form(_('That is not your email address.'));
++            return;
++        }
+hunk ./actions/emailsettings.php 274
+-              $user->query('BEGIN');
+-              $original = clone($user);
+-              $user->email = NULL;
+-              $result = $user->updateKeys($original);
+-              if (!$result) {
+-                      common_log_db_error($user, 'UPDATE', __FILE__);
+-                      common_server_error(_('Couldn\'t update user.'));
+-                      return;
+-              }
+-              $user->query('COMMIT');
++        $user->query('BEGIN');
++        $original = clone($user);
++        $user->email = NULL;
++        $result = $user->updateKeys($original);
++        if (!$result) {
++            common_log_db_error($user, 'UPDATE', __FILE__);
++            common_server_error(_('Couldn\'t update user.'));
++            return;
++        }
++        $user->query('COMMIT');
+hunk ./actions/emailsettings.php 285
+-              $this->show_form(_('The address was removed.'), TRUE);
+-      }
++        $this->show_form(_('The address was removed.'), TRUE);
++    }
+hunk ./actions/emailsettings.php 288
+-      function remove_incoming() {
+-              $user = common_current_user();
+-              
+-              if (!$user->incomingemail) {
+-                      $this->show_form(_('No incoming email address.'));
+-                      return;
+-              }
+-              
+-              $orig = clone($user);
+-              $user->incomingemail = NULL;
++    function remove_incoming() {
++        $user = common_current_user();
++        
++        if (!$user->incomingemail) {
++            $this->show_form(_('No incoming email address.'));
++            return;
++        }
++        
++        $orig = clone($user);
++        $user->incomingemail = NULL;
+hunk ./actions/emailsettings.php 299
+-              if (!$user->updateKeys($orig)) {
+-                      common_log_db_error($user, 'UPDATE', __FILE__);
+-                      $this->server_error(_("Couldn't update user record."));
+-              }
+-              
+-              $this->show_form(_('Incoming email address removed.'), TRUE);
+-      }
++        if (!$user->updateKeys($orig)) {
++            common_log_db_error($user, 'UPDATE', __FILE__);
++            $this->server_error(_("Couldn't update user record."));
++        }
++        
++        $this->show_form(_('Incoming email address removed.'), TRUE);
++    }
+hunk ./actions/emailsettings.php 307
+-      function new_incoming() {
+-              $user = common_current_user();
+-              
+-              $orig = clone($user);
+-              $user->incomingemail = mail_new_incoming_address();
+-              
+-              if (!$user->updateKeys($orig)) {
+-                      common_log_db_error($user, 'UPDATE', __FILE__);
+-                      $this->server_error(_("Couldn't update user record."));
+-              }
++    function new_incoming() {
++        $user = common_current_user();
++        
++        $orig = clone($user);
++        $user->incomingemail = mail_new_incoming_address();
++        
++        if (!$user->updateKeys($orig)) {
++            common_log_db_error($user, 'UPDATE', __FILE__);
++            $this->server_error(_("Couldn't update user record."));
++        }
+hunk ./actions/emailsettings.php 318
+-              $this->show_form(_('New incoming email address added.'), TRUE);
+-      }
+-      
+-      function email_exists($email) {
+-              $user = common_current_user();
+-              $other = User::staticGet('email', $email);
+-              if (!$other) {
+-                      return false;
+-              } else {
+-                      return $other->id != $user->id;
+-              }
+-      }
++        $this->show_form(_('New incoming email address added.'), TRUE);
++    }
++    
++    function email_exists($email) {
++        $user = common_current_user();
++        $other = User::staticGet('email', $email);
++        if (!$other) {
++            return false;
++        } else {
++            return $other->id != $user->id;
++        }
++    }
+hunk ./actions/facebookhome.php 13
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+hunk ./actions/facebookhome.php 17
+- * along with this program.    If not, see <http://www.gnu.org/licenses/>.
++ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+hunk ./actions/facebookhome.php 26
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/facebookhome.php 29
+-              $this->login();
+-      }
++        $this->login();
++    }
+hunk ./actions/facebookhome.php 32
+-      function login() {
++    function login() {
+hunk ./actions/facebookhome.php 34
+-              $user = null;
++        $user = null;
+hunk ./actions/facebookhome.php 36
+-              $facebook = $this->get_facebook();
+-              $fbuid = $facebook->require_login();
++        $facebook = $this->get_facebook();
++        $fbuid = $facebook->require_login();
+hunk ./actions/facebookhome.php 39
+-              # check to see whether there's already a Facebook link for this user
+-              $flink = Foreign_link::getByForeignID($fbuid, 2); // 2 == Facebook
++        # check to see whether there's already a Facebook link for this user
++        $flink = Foreign_link::getByForeignID($fbuid, 2); // 2 == Facebook
+hunk ./actions/facebookhome.php 42
+-              if ($flink) {
++        if ($flink) {
+hunk ./actions/facebookhome.php 44
+-                      $user = $flink->getUser();
+-                      $this->show_home($facebook, $fbuid, $user);
++            $user = $flink->getUser();
++            $this->show_home($facebook, $fbuid, $user);
+hunk ./actions/facebookhome.php 47
+-              } else {
++        } else {
+hunk ./actions/facebookhome.php 49
+-                      # Make the user put in her Laconica creds
+-                      $nickname = common_canonical_nickname($this->trimmed('nickname'));
+-                      $password = $this->arg('password');
++            # Make the user put in her Laconica creds
++            $nickname = common_canonical_nickname($this->trimmed('nickname'));
++            $password = $this->arg('password');
+hunk ./actions/facebookhome.php 53
+-                      if ($nickname) {
++            if ($nickname) {
+hunk ./actions/facebookhome.php 55
+-                              if (common_check_user($nickname, $password)) {
++                if (common_check_user($nickname, $password)) {
+hunk ./actions/facebookhome.php 58
+-                                      $user = User::staticGet('nickname', $nickname);
++                    $user = User::staticGet('nickname', $nickname);
+hunk ./actions/facebookhome.php 60
+-                                      if (!$user) {
+-                                              echo '<fb:error message="Coudln\'t get user!" />';
+-                                              $this->show_login_form();
+-                                      }
++                    if (!$user) {
++                        echo '<fb:error message="Coudln\'t get user!" />';
++                        $this->show_login_form();
++                    }
+hunk ./actions/facebookhome.php 65
+-                                      $flink = DB_DataObject::factory('foreign_link');
+-                                      $flink->user_id = $user->id;
+-                                      $flink->foreign_id = $fbuid;
+-                                      $flink->service = 2; # Facebook
+-                                      $flink->created = common_sql_now();
++                    $flink = DB_DataObject::factory('foreign_link');
++                    $flink->user_id = $user->id;
++                    $flink->foreign_id = $fbuid;
++                    $flink->service = 2; # Facebook
++                    $flink->created = common_sql_now();
+hunk ./actions/facebookhome.php 71
+-                                      # $this->set_flags($flink, $noticesync, $replysync, $friendsync);
++                    # $this->set_flags($flink, $noticesync, $replysync, $friendsync);
+hunk ./actions/facebookhome.php 73
+-                                      $flink_id = $flink->insert();
++                    $flink_id = $flink->insert();
+hunk ./actions/facebookhome.php 75
+-                                      if ($flink_id) {
+-                                              echo '<fb:success message="You can now use the Identi.ca from Facebook!" />';
+-                                      }
++                    if ($flink_id) {
++                        echo '<fb:success message="You can now use the Identi.ca from Facebook!" />';
++                    }
+hunk ./actions/facebookhome.php 79
+-                                      $this->show_home($facebook, $fbuid, $user);
++                    $this->show_home($facebook, $fbuid, $user);
+hunk ./actions/facebookhome.php 81
+-                                      return;
+-                              } else {
+-                                      echo '<fb:error message="Incorrect username or password." />';
+-                              }
+-                      }
++                    return;
++                } else {
++                    echo '<fb:error message="Incorrect username or password." />';
++                }
++            }
+hunk ./actions/facebookhome.php 87
+-                      $this->show_login_form();
+-              }
++            $this->show_login_form();
++        }
+hunk ./actions/facebookhome.php 90
+-      }
++    }
+hunk ./actions/facebookhome.php 92
+-      function show_home($facebook, $fbuid, $user) {
++    function show_home($facebook, $fbuid, $user) {
+hunk ./actions/facebookhome.php 94
+-              $this->show_header('Home');
++        $this->show_header('Home');
+hunk ./actions/facebookhome.php 96
+-              echo $this->show_notices($user);
+-              $this->update_profile_box($facebook, $fbuid, $user);
++        echo $this->show_notices($user);
++        $this->update_profile_box($facebook, $fbuid, $user);
+hunk ./actions/facebookhome.php 99
+-              $this->show_footer();
+-      }
++        $this->show_footer();
++    }
+hunk ./actions/facebookhome.php 102
+-      function show_notices($user) {
++    function show_notices($user) {
+hunk ./actions/facebookhome.php 104
+-              $page = $this->trimmed('page');
+-              if (!$page) {
+-                      $page = 1;
+-              }
++        $page = $this->trimmed('page');
++        if (!$page) {
++            $page = 1;
++        }
+hunk ./actions/facebookhome.php 109
+-              $notice = $user->noticesWithFriends(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
++        $notice = $user->noticesWithFriends(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+hunk ./actions/facebookhome.php 111
+-              echo '<ul id="notices">';
++        echo '<ul id="notices">';
+hunk ./actions/facebookhome.php 113
+-              $cnt = 0;
++        $cnt = 0;
+hunk ./actions/facebookhome.php 115
+-              while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) {
+-                      $cnt++;
++        while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) {
++            $cnt++;
+hunk ./actions/facebookhome.php 118
+-                      if ($cnt > NOTICES_PER_PAGE) {
+-                              break;
+-                      }
++            if ($cnt > NOTICES_PER_PAGE) {
++                break;
++            }
+hunk ./actions/facebookhome.php 122
+-                      echo $this->render_notice($notice);
+-              }
++            echo $this->render_notice($notice);
++        }
+hunk ./actions/facebookhome.php 125
+-              echo '<ul>';
++        echo '<ul>';
+hunk ./actions/facebookhome.php 127
+-              $this->pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+-                                                $page, 'index.php', array('nickname' => $user->nickname));
++        $this->pagination($page > 1, $cnt > NOTICES_PER_PAGE,
++                          $page, 'index.php', array('nickname' => $user->nickname));
+hunk ./actions/facebookhome.php 130
+-      }
++    }
+hunk ./actions/facebookinvite.php 13
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+hunk ./actions/facebookinvite.php 17
+- * along with this program.    If not, see <http://www.gnu.org/licenses/>.
++ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+hunk ./actions/facebookinvite.php 26
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/facebookinvite.php 29
+-              $this->display();
+-      }
++        $this->display();
++    }
+hunk ./actions/facebookinvite.php 32
+-      function display() {
++    function display() {
+hunk ./actions/facebookinvite.php 34
+-              $facebook = $this->get_facebook();
++        $facebook = $this->get_facebook();
+hunk ./actions/facebookinvite.php 36
+-              $fbuid = $facebook->require_login();
++        $fbuid = $facebook->require_login();
+hunk ./actions/facebookinvite.php 38
+-              $this->show_header('Invite');
++        $this->show_header('Invite');
+hunk ./actions/facebookinvite.php 40
+-              echo '<h2>Coming soon...</h2>';
++        echo '<h2>Coming soon...</h2>';
+hunk ./actions/facebookinvite.php 42
+-              $this->show_footer();
++        $this->show_footer();
+hunk ./actions/facebookinvite.php 44
+-      }
++    }
+hunk ./actions/facebookremove.php 13
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+hunk ./actions/facebookremove.php 17
+- * along with this program.    If not, see <http://www.gnu.org/licenses/>.
++ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+hunk ./actions/facebookremove.php 26
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/facebookremove.php 29
+-              $secret = common_config('facebook', 'secret');
++        $secret = common_config('facebook', 'secret');
+hunk ./actions/facebookremove.php 31
+-              $sig = '';
++        $sig = '';
+hunk ./actions/facebookremove.php 33
+-              ksort($_POST);
++        ksort($_POST);
+hunk ./actions/facebookremove.php 35
+-              foreach ($_POST as $key => $val) {
+-                      if (substr($key, 0, 7) == 'fb_sig_') {
+-                              $sig .= substr($key, 7) . '=' . $val;
+-                      }
+-               }
++        foreach ($_POST as $key => $val) {
++            if (substr($key, 0, 7) == 'fb_sig_') {
++                $sig .= substr($key, 7) . '=' . $val;
++            }
++         }
+hunk ./actions/facebookremove.php 41
+-              $sig .= $secret;
+-              $verify = md5($sig);
++        $sig .= $secret;
++        $verify = md5($sig);
+hunk ./actions/facebookremove.php 44
+-              if ($verify == $this->arg('fb_sig')) {
++        if ($verify == $this->arg('fb_sig')) {
+hunk ./actions/facebookremove.php 46
+-                      $flink = Foreign_link::getByForeignID($this->arg('fb_sig_user'), 2);
++            $flink = Foreign_link::getByForeignID($this->arg('fb_sig_user'), 2);
+hunk ./actions/facebookremove.php 48
+-                      common_debug("Removing foreign link to Facebook - local user ID: $flink->user_id, Facebook ID: $flink->foreign_id");
++            common_debug("Removing foreign link to Facebook - local user ID: $flink->user_id, Facebook ID: $flink->foreign_id");
+hunk ./actions/facebookremove.php 50
+-                      $result = $flink->delete();
++            $result = $flink->delete();
+hunk ./actions/facebookremove.php 52
+-                      if (!$result) {
+-                              common_log_db_error($flink, 'DELETE', __FILE__);
+-                              common_server_error(_('Couldn\'t remove Facebook user.'));
+-                              return;
+-                      }
++            if (!$result) {
++                common_log_db_error($flink, 'DELETE', __FILE__);
++                common_server_error(_('Couldn\'t remove Facebook user.'));
++                return;
++            }
+hunk ./actions/facebookremove.php 58
+-              } else {
+-                      # Someone bad tried to remove facebook link?
+-                      common_log(LOG_ERR, "Someone from $_SERVER[REMOTE_ADDR] " .
+-                              'unsuccessfully tried to remove a foreign link to Facebook!');
+-              }
+-      }
++        } else {
++            # Someone bad tried to remove facebook link?
++            common_log(LOG_ERR, "Someone from $_SERVER[REMOTE_ADDR] " .
++                'unsuccessfully tried to remove a foreign link to Facebook!');
++        }
++    }
+hunk ./actions/facebooksettings.php 13
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+hunk ./actions/facebooksettings.php 17
+- * along with this program.    If not, see <http://www.gnu.org/licenses/>.
++ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+hunk ./actions/facebooksettings.php 26
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/facebooksettings.php 29
+-              $this->display();
+-      }
++        $this->display();
++    }
+hunk ./actions/facebooksettings.php 32
+-      function display() {
++    function display() {
+hunk ./actions/facebooksettings.php 34
+-              $facebook = $this->get_facebook();
++        $facebook = $this->get_facebook();
+hunk ./actions/facebooksettings.php 36
+-              $fbuid = $facebook->require_login();
++        $fbuid = $facebook->require_login();
+hunk ./actions/facebooksettings.php 38
+-              $fbml = '<fb:if-section-not-added section="profile">'
+-                      .'<h2>Add an Identi.ca box to your profile!</h2>'
+-                      .'<fb:add-section-button section="profile"/>'
+-                      .'</fb:if-section-not-added>';
++        $fbml = '<fb:if-section-not-added section="profile">'
++            .'<h2>Add an Identi.ca box to your profile!</h2>'
++            .'<fb:add-section-button section="profile"/>'
++            .'</fb:if-section-not-added>';
+hunk ./actions/facebooksettings.php 44
+-              $this->show_header('Settings');
++        $this->show_header('Settings');
+hunk ./actions/facebooksettings.php 46
+-              echo $fbml;
++        echo $fbml;
+hunk ./actions/facebooksettings.php 48
+-              $this->show_footer();
++        $this->show_footer();
+hunk ./actions/facebooksettings.php 50
+-      }
++    }
+hunk ./actions/favor.php 26
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/favor.php 29
+-              if (!common_logged_in()) {
+-                      common_user_error(_('Not logged in.'));
+-                      return;
+-              }
++        if (!common_logged_in()) {
++            common_user_error(_('Not logged in.'));
++            return;
++        }
+hunk ./actions/favor.php 34
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/favor.php 36
+-              if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+-                      common_redirect(common_local_url('showfavorites', array('nickname' => $user->nickname)));
+-                      return;
+-              }
++        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
++            common_redirect(common_local_url('showfavorites', array('nickname' => $user->nickname)));
++            return;
++        }
+hunk ./actions/favor.php 41
+-              $id = $this->trimmed('notice');
++        $id = $this->trimmed('notice');
+hunk ./actions/favor.php 43
+-              $notice = Notice::staticGet($id);
++        $notice = Notice::staticGet($id);
+hunk ./actions/favor.php 45
+-              # CSRF protection
++        # CSRF protection
+hunk ./actions/favor.php 47
+-              $token = $this->trimmed('token-'.$notice->id);
+-              if (!$token || $token != common_session_token()) {
+-                      $this->client_error(_("There was a problem with your session token. Try again, please."));
+-                      return;
+-              }
++        $token = $this->trimmed('token-'.$notice->id);
++        if (!$token || $token != common_session_token()) {
++            $this->client_error(_("There was a problem with your session token. Try again, please."));
++            return;
++        }
+hunk ./actions/favor.php 53
+-              if ($user->hasFave($notice)) {
+-                      $this->client_error(_('This notice is already a favorite!'));
+-                      return;
+-              }
++        if ($user->hasFave($notice)) {
++            $this->client_error(_('This notice is already a favorite!'));
++            return;
++        }
+hunk ./actions/favor.php 58
+-              $fave = Fave::addNew($user, $notice);
++        $fave = Fave::addNew($user, $notice);
+hunk ./actions/favor.php 60
+-              if (!$fave) {
+-                      $this->server_error(_('Could not create favorite.'));
+-                      return;
+-              }
++        if (!$fave) {
++            $this->server_error(_('Could not create favorite.'));
++            return;
++        }
+hunk ./actions/favor.php 65
+-              $this->notify($fave, $notice, $user);
+-              $user->blowFavesCache();
+-              
+-              if ($this->boolean('ajax')) {
+-                      common_start_html('text/xml;charset=utf-8', true);
+-                      common_element_start('head');
+-                      common_element('title', null, _('Disfavor favorite'));
+-                      common_element_end('head');
+-                      common_element_start('body');
+-                      common_disfavor_form($notice);
+-                      common_element_end('body');
+-                      common_element_end('html');
+-              } else {
+-                      common_redirect(common_local_url('showfavorites',
+-                                                                                       array('nickname' => $user->nickname)));
+-              }
+-      }
++        $this->notify($fave, $notice, $user);
++        $user->blowFavesCache();
++        
++        if ($this->boolean('ajax')) {
++            common_start_html('text/xml;charset=utf-8', true);
++            common_element_start('head');
++            common_element('title', null, _('Disfavor favorite'));
++            common_element_end('head');
++            common_element_start('body');
++            common_disfavor_form($notice);
++            common_element_end('body');
++            common_element_end('html');
++        } else {
++            common_redirect(common_local_url('showfavorites',
++                                             array('nickname' => $user->nickname)));
++        }
++    }
+hunk ./actions/favor.php 83
+-      function notify($fave, $notice, $user) {
+-          $other = User::staticGet('id', $notice->profile_id);
+-              if ($other && $other->id != $user->id) {
+-                      if ($other->email && $other->emailnotifyfav) {
+-                              mail_notify_fave($other, $user, $notice);
+-                      }
+-                      # XXX: notify by IM
+-                      # XXX: notify by SMS
+-              }
+-      }
++    function notify($fave, $notice, $user) {
++        $other = User::staticGet('id', $notice->profile_id);
++        if ($other && $other->id != $user->id) {
++            if ($other->email && $other->emailnotifyfav) {
++                mail_notify_fave($other, $user, $notice);
++            }
++            # XXX: notify by IM
++            # XXX: notify by SMS
++        }
++    }
+hunk ./actions/favorited.php 13
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+hunk ./actions/favorited.php 17
+- * along with this program.    If not, see <http://www.gnu.org/licenses/>.
++ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+hunk ./actions/favorited.php 26
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/favorited.php 29
+-              $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
++        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+hunk ./actions/favorited.php 31
+-              common_show_header(_('Popular notices'),
+-                                                 array($this, 'show_header'), NULL,
+-                                                 array($this, 'show_top'));
++        common_show_header(_('Popular notices'),
++                           array($this, 'show_header'), NULL,
++                           array($this, 'show_top'));
+hunk ./actions/favorited.php 35
+-              $this->show_notices($page);
++        $this->show_notices($page);
+hunk ./actions/favorited.php 37
+-              common_show_footer();
+-      }
++        common_show_footer();
++    }
+hunk ./actions/favorited.php 40
+-      function show_top() {
+-              $instr = $this->get_instructions();
+-              $output = common_markup_to_html($instr);
+-              common_element_start('div', 'instructions');
+-              common_raw($output);
+-              common_element_end('div');
+-              $this->public_views_menu();
+-      }
++    function show_top() {
++        $instr = $this->get_instructions();
++        $output = common_markup_to_html($instr);
++        common_element_start('div', 'instructions');
++        common_raw($output);
++        common_element_end('div');
++        $this->public_views_menu();
++    }
+hunk ./actions/favorited.php 49
+-      function show_header() {
++    function show_header() {
+hunk ./actions/favorited.php 51
+-      }
++    }
+hunk ./actions/favorited.php 53
+-      function get_instructions() {
+-              return _('Showing recently popular notices');
+-      }
++    function get_instructions() {
++        return _('Showing recently popular notices');
++    }
+hunk ./actions/favorited.php 57
+-      function show_notices($page) {
++    function show_notices($page) {
+hunk ./actions/favorited.php 59
+-              $qry = 'SELECT notice.*, sum(exp(-(now() - fave.modified) / %s)) as weight ' .
+-                              'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
+-                              'GROUP BY fave.notice_id ' .
+-                              'ORDER BY weight DESC';
++        $qry = 'SELECT notice.*, sum(exp(-(now() - fave.modified) / %s)) as weight ' .
++                'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
++                'GROUP BY fave.notice_id ' .
++                'ORDER BY weight DESC';
+hunk ./actions/favorited.php 64
+-              $offset = ($page - 1) * NOTICES_PER_PAGE;
+-              $limit = NOTICES_PER_PAGE + 1;
++        $offset = ($page - 1) * NOTICES_PER_PAGE;
++        $limit = NOTICES_PER_PAGE + 1;
+hunk ./actions/favorited.php 67
+-              if (common_config('db','type') == 'pgsql') {
+-                      $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+-              } else {
+-                      $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+-              }
++        if (common_config('db','type') == 'pgsql') {
++            $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
++        } else {
++            $qry .= ' LIMIT ' . $offset . ', ' . $limit;
++        }
+hunk ./actions/favorited.php 73
+-              # Figure out how to cache this query
++        # Figure out how to cache this query
+hunk ./actions/favorited.php 75
+-              $notice = new Notice;
+-              $notice->query(sprintf($qry, common_config('popular', 'dropoff')));
++        $notice = new Notice;
++        $notice->query(sprintf($qry, common_config('popular', 'dropoff')));
+hunk ./actions/favorited.php 78
+-              common_element_start('ul', array('id' => 'notices'));
++        common_element_start('ul', array('id' => 'notices'));
+hunk ./actions/favorited.php 80
+-              $cnt = 0;
++        $cnt = 0;
+hunk ./actions/favorited.php 82
+-              while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) {
+-                      $cnt++;
++        while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) {
++            $cnt++;
+hunk ./actions/favorited.php 85
+-                      if ($cnt > NOTICES_PER_PAGE) {
+-                              break;
+-                      }
++            if ($cnt > NOTICES_PER_PAGE) {
++                break;
++            }
+hunk ./actions/favorited.php 91
+-              }
++        }
+hunk ./actions/favorited.php 93
+-              common_element_end('ul');
++        common_element_end('ul');
+hunk ./actions/favorited.php 95
+-              common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+-                                                $page, 'favorited');
+-      }
++        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
++                          $page, 'favorited');
++    }
+hunk ./actions/favoritesrss.php 28
+-      var $user = NULL;
+-      
+-      function init() {
+-              $nickname = $this->trimmed('nickname');
+-              $this->user = User::staticGet('nickname', $nickname);
++    var $user = NULL;
++    
++    function init() {
++        $nickname = $this->trimmed('nickname');
++        $this->user = User::staticGet('nickname', $nickname);
+hunk ./actions/favoritesrss.php 34
+-              if (!$this->user) {
+-                      common_user_error(_('No such user.'));
+-                      return false;
+-              } else {
+-                      return true;
+-              }
+-      }
++        if (!$this->user) {
++            common_user_error(_('No such user.'));
++            return false;
++        } else {
++            return true;
++        }
++    }
+hunk ./actions/favoritesrss.php 42
+-      function get_notices($limit=0) {
++    function get_notices($limit=0) {
+hunk ./actions/favoritesrss.php 44
+-              $user = $this->user;
++        $user = $this->user;
+hunk ./actions/favoritesrss.php 46
+-              $notice = $user->favoriteNotices(0, $limit);
++        $notice = $user->favoriteNotices(0, $limit);
+hunk ./actions/favoritesrss.php 48
+-              $notices = array();
++        $notices = array();
+hunk ./actions/favoritesrss.php 50
+-              while ($notice->fetch()) {
+-                      $notices[] = clone($notice);
+-              }
++        while ($notice->fetch()) {
++            $notices[] = clone($notice);
++        }
+hunk ./actions/favoritesrss.php 54
+-              return $notices;
+-      }
++        return $notices;
++    }
+hunk ./actions/favoritesrss.php 57
+-      function get_channel() {
+-              $user = $this->user;
+-              $c = array('url' => common_local_url('favoritesrss',
+-                                                                                       array('nickname' =>
+-                                                                                                 $user->nickname)),
+-                                 'title' => sprintf(_("%s favorite notices"), $user->nickname),
+-                                 'link' => common_local_url('showfavorites',
+-                                                                                       array('nickname' =>
+-                                                                                                 $user->nickname)),
+-                                 'description' => sprintf(_('Feed of favorite notices of %s'), $user->nickname));
+-              return $c;
+-      }
++    function get_channel() {
++        $user = $this->user;
++        $c = array('url' => common_local_url('favoritesrss',
++                                             array('nickname' =>
++                                                   $user->nickname)),
++                   'title' => sprintf(_("%s favorite notices"), $user->nickname),
++                   'link' => common_local_url('showfavorites',
++                                             array('nickname' =>
++                                                   $user->nickname)),
++                   'description' => sprintf(_('Feed of favorite notices of %s'), $user->nickname));
++        return $c;
++    }
+hunk ./actions/favoritesrss.php 70
+-      function get_image() {
+-              return NULL;
+-      }
++    function get_image() {
++        return NULL;
++    }
+hunk ./actions/featured.php 13
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+hunk ./actions/featured.php 17
+- * along with this program.    If not, see <http://www.gnu.org/licenses/>.
++ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+hunk ./actions/featured.php 27
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/featured.php 30
+-              $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
++        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+hunk ./actions/featured.php 32
+-              common_show_header(_('Featured users'),
+-                                                 array($this, 'show_header'), NULL,
+-                                                 array($this, 'show_top'));
++        common_show_header(_('Featured users'),
++                           array($this, 'show_header'), NULL,
++                           array($this, 'show_top'));
+hunk ./actions/featured.php 36
+-              $this->show_notices($page);
++        $this->show_notices($page);
+hunk ./actions/featured.php 38
+-              common_show_footer();
+-      }
++        common_show_footer();
++    }
+hunk ./actions/featured.php 41
+-      function show_top() {
+-              $instr = $this->get_instructions();
+-              $output = common_markup_to_html($instr);
+-              common_element_start('div', 'instructions');
+-              common_raw($output);
+-              common_element_end('div');
+-              $this->public_views_menu();
+-      }
++    function show_top() {
++        $instr = $this->get_instructions();
++        $output = common_markup_to_html($instr);
++        common_element_start('div', 'instructions');
++        common_raw($output);
++        common_element_end('div');
++        $this->public_views_menu();
++    }
+hunk ./actions/featured.php 50
+-      function show_header() {
+-      }
++    function show_header() {
++    }
+hunk ./actions/featured.php 53
+-      function get_instructions() {
+-              return _('Featured users');
+-      }
++    function get_instructions() {
++        return _('Featured users');
++    }
+hunk ./actions/featured.php 57
+-      function show_notices($page) {
++    function show_notices($page) {
+hunk ./actions/featured.php 59
+-              // XXX: Note I'm doing it this two-stage way because a raw query
+-              // with a JOIN was *not* working. --Zach
++        // XXX: Note I'm doing it this two-stage way because a raw query
++        // with a JOIN was *not* working. --Zach
+hunk ./actions/featured.php 62
+-              $featured_nicks = common_config('nickname', 'featured');
++        $featured_nicks = common_config('nickname', 'featured');
+hunk ./actions/featured.php 64
+-              if (count($featured_nicks) > 0) {
++        if (count($featured_nicks) > 0) {
+hunk ./actions/featured.php 66
+-                      $quoted = array();
++            $quoted = array();
+hunk ./actions/featured.php 68
+-                      foreach ($featured_nicks as $nick) {
+-                              $quoted[] = "'$nick'";
+-                      }
++            foreach ($featured_nicks as $nick) {
++                $quoted[] = "'$nick'";
++            }
+hunk ./actions/featured.php 72
+-                      $user = new User;
+-                      $user->whereAdd(sprintf('nickname IN (%s)', implode(',', $quoted)));
+-                      $user->limit(($page - 1) * PROFILES_PER_PAGE, PROFILES_PER_PAGE + 1);
+-                      $user->orderBy('user.nickname ASC');
++            $user = new User;
++            $user->whereAdd(sprintf('nickname IN (%s)', implode(',', $quoted)));
++            $user->limit(($page - 1) * PROFILES_PER_PAGE, PROFILES_PER_PAGE + 1);
++            $user->orderBy('user.nickname ASC');
+hunk ./actions/featured.php 77
+-                      $user->find();
++            $user->find();
+hunk ./actions/featured.php 79
+-                      $profile_ids = array();
++            $profile_ids = array();
+hunk ./actions/featured.php 81
+-                      while ($user->fetch()) {
+-                              $profile_ids[] = $user->id;
+-                      }
++            while ($user->fetch()) {
++                $profile_ids[] = $user->id;
++            }
+hunk ./actions/featured.php 85
+-                      $profile = new Profile;
+-                      $profile->whereAdd(sprintf('profile.id IN (%s)', implode(',', $profile_ids)));
+-                      $profile->orderBy('nickname ASC');
++            $profile = new Profile;
++            $profile->whereAdd(sprintf('profile.id IN (%s)', implode(',', $profile_ids)));
++            $profile->orderBy('nickname ASC');
+hunk ./actions/featured.php 89
+-                      $cnt = $profile->find();
++            $cnt = $profile->find();
+hunk ./actions/featured.php 91
+-                      if ($cnt > 0) {
+-                              $featured = new ProfileList($profile);
+-                              $featured->show_list();
+-                      }
++            if ($cnt > 0) {
++                $featured = new ProfileList($profile);
++                $featured->show_list();
++            }
+hunk ./actions/featured.php 96
+-                      $profile->free();
++            $profile->free();
+hunk ./actions/featured.php 98
+-                      common_pagination($page > 1, $cnt > PROFILES_PER_PAGE, $page, 'featured');
+-              }
+-      }
++            common_pagination($page > 1, $cnt > PROFILES_PER_PAGE, $page, 'featured');
++        }
++    }
+hunk ./actions/finishaddopenid.php 26
+-      function handle($args) {
+-              parent::handle($args);
+-              if (!common_logged_in()) {
+-                      common_user_error(_('Not logged in.'));
+-              } else {
+-                      $this->try_login();
+-              }
+-      }
+-      
+-      function try_login() {
++    function handle($args) {
++        parent::handle($args);
++        if (!common_logged_in()) {
++            common_user_error(_('Not logged in.'));
++        } else {
++            $this->try_login();
++        }
++    }
++    
++    function try_login() {
+hunk ./actions/finishaddopenid.php 37
+-              $consumer =& oid_consumer();
++        $consumer =& oid_consumer();
+hunk ./actions/finishaddopenid.php 39
+-              $response = $consumer->complete(common_local_url('finishaddopenid'));
++        $response = $consumer->complete(common_local_url('finishaddopenid'));
+hunk ./actions/finishaddopenid.php 41
+-              if ($response->status == Auth_OpenID_CANCEL) {
+-                      $this->message(_('OpenID authentication cancelled.'));
+-                      return;
+-              } else if ($response->status == Auth_OpenID_FAILURE) {
+-                      // Authentication failed; display the error message.
+-                      $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message));
+-              } else if ($response->status == Auth_OpenID_SUCCESS) {
++        if ($response->status == Auth_OpenID_CANCEL) {
++            $this->message(_('OpenID authentication cancelled.'));
++            return;
++        } else if ($response->status == Auth_OpenID_FAILURE) {
++            // Authentication failed; display the error message.
++            $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message));
++        } else if ($response->status == Auth_OpenID_SUCCESS) {
+hunk ./actions/finishaddopenid.php 49
+-                      $display = $response->getDisplayIdentifier();
+-                      $canonical = ($response->endpoint && $response->endpoint->canonicalID) ?
+-                        $response->endpoint->canonicalID : $display;
++            $display = $response->getDisplayIdentifier();
++            $canonical = ($response->endpoint && $response->endpoint->canonicalID) ?
++              $response->endpoint->canonicalID : $display;
+hunk ./actions/finishaddopenid.php 53
+-                      $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
++            $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
+hunk ./actions/finishaddopenid.php 55
+-                      if ($sreg_resp) {
+-                              $sreg = $sreg_resp->contents();
+-                      }
++            if ($sreg_resp) {
++                $sreg = $sreg_resp->contents();
++            }
+hunk ./actions/finishaddopenid.php 59
+-                      $cur =& common_current_user();
+-                      $other = oid_get_user($canonical);
++            $cur =& common_current_user();
++            $other = oid_get_user($canonical);
+hunk ./actions/finishaddopenid.php 62
+-                      if ($other) {
+-                              if ($other->id == $cur->id) {
+-                                      $this->message(_('You already have this OpenID!'));
+-                              } else {
+-                                      $this->message(_('Someone else already has this OpenID.'));
+-                              }
+-                              return;
+-                      }
++            if ($other) {
++                if ($other->id == $cur->id) {
++                    $this->message(_('You already have this OpenID!'));
++                } else {
++                    $this->message(_('Someone else already has this OpenID.'));
++                }
++                return;
++            }
+hunk ./actions/finishaddopenid.php 71
+-                      # start a transaction
++            # start a transaction
+hunk ./actions/finishaddopenid.php 73
+-                      $cur->query('BEGIN');
++            $cur->query('BEGIN');
+hunk ./actions/finishaddopenid.php 75
+-                      $result = oid_link_user($cur->id, $canonical, $display);
++            $result = oid_link_user($cur->id, $canonical, $display);
+hunk ./actions/finishaddopenid.php 77
+-                      if (!$result) {
+-                              $this->message(_('Error connecting user.'));
+-                              return;
+-                      }
+-                      if ($sreg) {
+-                              if (!oid_update_user($cur, $sreg)) {
+-                                      $this->message(_('Error updating profile'));
+-                                      return;
+-                              }
+-                      }
++            if (!$result) {
++                $this->message(_('Error connecting user.'));
++                return;
++            }
++            if ($sreg) {
++                if (!oid_update_user($cur, $sreg)) {
++                    $this->message(_('Error updating profile'));
++                    return;
++                }
++            }
+hunk ./actions/finishaddopenid.php 88
+-                      # success!
++            # success!
+hunk ./actions/finishaddopenid.php 90
+-                      $cur->query('COMMIT');
++            $cur->query('COMMIT');
+hunk ./actions/finishaddopenid.php 92
+-                      oid_set_last($display);
++            oid_set_last($display);
+hunk ./actions/finishaddopenid.php 94
+-                      common_redirect(common_local_url('openidsettings'));
+-              }
+-      }
++            common_redirect(common_local_url('openidsettings'));
++        }
++    }
+hunk ./actions/finishaddopenid.php 98
+-      function message($msg) {
+-              common_show_header(_('OpenID Login'));
+-              common_element('p', NULL, $msg);
+-              common_show_footer();
+-      }
++    function message($msg) {
++        common_show_header(_('OpenID Login'));
++        common_element('p', NULL, $msg);
++        common_show_footer();
++    }
+hunk ./actions/finishimmediate.php 26
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/finishimmediate.php 29
+-              $consumer = oid_consumer();
++        $consumer = oid_consumer();
+hunk ./actions/finishimmediate.php 31
+-              $response = $consumer->complete(common_local_url('finishimmediate'));
++        $response = $consumer->complete(common_local_url('finishimmediate'));
+hunk ./actions/finishimmediate.php 33
+-              if ($response->status == Auth_OpenID_SUCCESS) {
+-                      $display = $response->getDisplayIdentifier();
+-                      $canonical = ($response->endpoint->canonicalID) ?
+-                        $response->endpoint->canonicalID : $response->getDisplayIdentifier();
++        if ($response->status == Auth_OpenID_SUCCESS) {
++            $display = $response->getDisplayIdentifier();
++            $canonical = ($response->endpoint->canonicalID) ?
++              $response->endpoint->canonicalID : $response->getDisplayIdentifier();
+hunk ./actions/finishimmediate.php 38
+-                      $user = oid_get_user($canonical);
++            $user = oid_get_user($canonical);
+hunk ./actions/finishimmediate.php 40
+-                      if ($user) {
+-                              oid_update_user($user, $sreg);
+-                              oid_set_last($display); # refresh for another year
+-                              common_set_user($user->nickname);
+-                              $this->go_backto();
+-                              return;
+-                      }
+-              }
++            if ($user) {
++                oid_update_user($user, $sreg);
++                oid_set_last($display); # refresh for another year
++                common_set_user($user->nickname);
++                $this->go_backto();
++                return;
++            }
++        }
+hunk ./actions/finishimmediate.php 49
+-              # Failure! Clear openid so we don't try it again
++        # Failure! Clear openid so we don't try it again
+hunk ./actions/finishimmediate.php 51
+-              oid_clear_last();
+-              $this->go_backto();
+-              return;
+-      }
++        oid_clear_last();
++        $this->go_backto();
++        return;
++    }
+hunk ./actions/finishimmediate.php 56
+-      function go_backto() {
+-              common_ensure_session();
+-              $backto = $_SESSION['openid_immediate_backto'];
+-              if (!$backto) {
+-                      # gar. Well, push them to the public page
+-                      $backto = common_local_url('public');
+-              }
+-              common_redirect($backto);
+-      }
++    function go_backto() {
++        common_ensure_session();
++        $backto = $_SESSION['openid_immediate_backto'];
++        if (!$backto) {
++            # gar. Well, push them to the public page
++            $backto = common_local_url('public');
++        }
++        common_redirect($backto);
++    }
+hunk ./actions/finishopenidlogin.php 26
+-      function handle($args) {
+-              parent::handle($args);
+-              if (common_logged_in()) {
+-                      common_user_error(_('Already logged in.'));
+-              } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+-                      $token = $this->trimmed('token');
+-                      if (!$token || $token != common_session_token()) {
+-                              $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                              return;
+-                      }
+-                      if ($this->arg('create')) {
+-                              if (!$this->boolean('license')) {
+-                                      $this->show_form(_('You can\'t register if you don\'t agree to the license.'),
+-                                                                       $this->trimmed('newname'));
+-                                      return;
+-                              }
+-                              $this->create_new_user();
+-                      } else if ($this->arg('connect')) {
+-                              $this->connect_user();
+-                      } else {
+-                              common_debug(print_r($this->args, true), __FILE__);
+-                              $this->show_form(_('Something weird happened.'),
+-                                                               $this->trimmed('newname'));
+-                      }
+-              } else {
+-                      $this->try_login();
+-              }
+-      }
++    function handle($args) {
++        parent::handle($args);
++        if (common_logged_in()) {
++            common_user_error(_('Already logged in.'));
++        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
++            $token = $this->trimmed('token');
++            if (!$token || $token != common_session_token()) {
++                $this->show_form(_('There was a problem with your session token. Try again, please.'));
++                return;
++            }
++            if ($this->arg('create')) {
++                if (!$this->boolean('license')) {
++                    $this->show_form(_('You can\'t register if you don\'t agree to the license.'),
++                                     $this->trimmed('newname'));
++                    return;
++                }
++                $this->create_new_user();
++            } else if ($this->arg('connect')) {
++                $this->connect_user();
++            } else {
++                common_debug(print_r($this->args, true), __FILE__);
++                $this->show_form(_('Something weird happened.'),
++                                 $this->trimmed('newname'));
++            }
++        } else {
++            $this->try_login();
++        }
++    }
+hunk ./actions/finishopenidlogin.php 55
+-      function show_top($error=NULL) {
+-              if ($error) {
+-                      common_element('div', array('class' => 'error'), $error);
+-              } else {
+-                      global $config;
+-                      common_element('div', 'instructions',
+-                                                 sprintf(_('This is the first time you\'ve logged into %s so we must connect your OpenID to a local account. You can either create a new account, or connect with your existing account, if you have one.'), $config['site']['name']));
+-              }
+-      }
++    function show_top($error=NULL) {
++        if ($error) {
++            common_element('div', array('class' => 'error'), $error);
++        } else {
++            global $config;
++            common_element('div', 'instructions',
++                           sprintf(_('This is the first time you\'ve logged into %s so we must connect your OpenID to a local account. You can either create a new account, or connect with your existing account, if you have one.'), $config['site']['name']));
++        }
++    }
+hunk ./actions/finishopenidlogin.php 65
+-      function show_form($error=NULL, $username=NULL) {
+-              common_show_header(_('OpenID Account Setup'), NULL, $error,
+-                                                 array($this, 'show_top'));
++    function show_form($error=NULL, $username=NULL) {
++        common_show_header(_('OpenID Account Setup'), NULL, $error,
++                           array($this, 'show_top'));
+hunk ./actions/finishopenidlogin.php 69
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'account_connect',
+-                                                                                 'action' => common_local_url('finishopenidlogin')));
+-              common_hidden('token', common_session_token());
+-              common_element('h2', NULL,
+-                                         _('Create new account'));
+-              common_element('p', NULL,
+-                                         _('Create a new user with this nickname.'));
+-              common_input('newname', _('New nickname'),
+-                                       ($username) ? $username : '',
+-                                       _('1-64 lowercase letters or numbers, no punctuation or spaces'));
+-              common_element_start('p');
+-              common_element('input', array('type' => 'checkbox',
+-                                                                        'id' => 'license',
+-                                                                        'name' => 'license',
+-                                                                        'value' => 'true'));
+-              common_text(_('My text and files are available under '));
+-              common_element('a', array(href => common_config('license', 'url')),
+-                                         common_config('license', 'title'));
+-              common_text(_(' except this private data: password, email address, IM address, phone number.'));
+-              common_element_end('p');
+-              common_submit('create', _('Create'));
+-              common_element('h2', NULL,
+-                                         _('Connect existing account'));
+-              common_element('p', NULL,
+-                                         _('If you already have an account, login with your username and password to connect it to your OpenID.'));
+-              common_input('nickname', _('Existing nickname'));
+-              common_password('password', _('Password'));
+-              common_submit('connect', _('Connect'));
+-              common_element_end('form');
+-              common_show_footer();
+-      }
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'account_connect',
++                                           'action' => common_local_url('finishopenidlogin')));
++        common_hidden('token', common_session_token());
++        common_element('h2', NULL,
++                       _('Create new account'));
++        common_element('p', NULL,
++                       _('Create a new user with this nickname.'));
++        common_input('newname', _('New nickname'),
++                     ($username) ? $username : '',
++                     _('1-64 lowercase letters or numbers, no punctuation or spaces'));
++        common_element_start('p');
++        common_element('input', array('type' => 'checkbox',
++                                      'id' => 'license',
++                                      'name' => 'license',
++                                      'value' => 'true'));
++        common_text(_('My text and files are available under '));
++        common_element('a', array(href => common_config('license', 'url')),
++                       common_config('license', 'title'));
++        common_text(_(' except this private data: password, email address, IM address, phone number.'));
++        common_element_end('p');
++        common_submit('create', _('Create'));
++        common_element('h2', NULL,
++                       _('Connect existing account'));
++        common_element('p', NULL,
++                       _('If you already have an account, login with your username and password to connect it to your OpenID.'));
++        common_input('nickname', _('Existing nickname'));
++        common_password('password', _('Password'));
++        common_submit('connect', _('Connect'));
++        common_element_end('form');
++        common_show_footer();
++    }
+hunk ./actions/finishopenidlogin.php 102
+-      function try_login() {
++    function try_login() {
+hunk ./actions/finishopenidlogin.php 104
+-              $consumer = oid_consumer();
++        $consumer = oid_consumer();
+hunk ./actions/finishopenidlogin.php 106
+-              $response = $consumer->complete(common_local_url('finishopenidlogin'));
++        $response = $consumer->complete(common_local_url('finishopenidlogin'));
+hunk ./actions/finishopenidlogin.php 108
+-              if ($response->status == Auth_OpenID_CANCEL) {
+-                      $this->message(_('OpenID authentication cancelled.'));
+-                      return;
+-              } else if ($response->status == Auth_OpenID_FAILURE) {
+-                      // Authentication failed; display the error message.
+-                      $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message));
+-              } else if ($response->status == Auth_OpenID_SUCCESS) {
+-                      // This means the authentication succeeded; extract the
+-                      // identity URL and Simple Registration data (if it was
+-                      // returned).
+-                      $display = $response->getDisplayIdentifier();
+-                      $canonical = ($response->endpoint->canonicalID) ?
+-                        $response->endpoint->canonicalID : $response->getDisplayIdentifier();
++        if ($response->status == Auth_OpenID_CANCEL) {
++            $this->message(_('OpenID authentication cancelled.'));
++            return;
++        } else if ($response->status == Auth_OpenID_FAILURE) {
++            // Authentication failed; display the error message.
++            $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message));
++        } else if ($response->status == Auth_OpenID_SUCCESS) {
++            // This means the authentication succeeded; extract the
++            // identity URL and Simple Registration data (if it was
++            // returned).
++            $display = $response->getDisplayIdentifier();
++            $canonical = ($response->endpoint->canonicalID) ?
++              $response->endpoint->canonicalID : $response->getDisplayIdentifier();
+hunk ./actions/finishopenidlogin.php 122
+-                      $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
++            $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
+hunk ./actions/finishopenidlogin.php 124
+-                      if ($sreg_resp) {
+-                              $sreg = $sreg_resp->contents();
+-                      }
++            if ($sreg_resp) {
++                $sreg = $sreg_resp->contents();
++            }
+hunk ./actions/finishopenidlogin.php 128
+-                      $user = oid_get_user($canonical);
++            $user = oid_get_user($canonical);
+hunk ./actions/finishopenidlogin.php 130
+-                      if ($user) {
+-                              oid_set_last($display);
+-                              # XXX: commented out at @edd's request until better
+-                              # control over how data flows from OpenID provider.
+-                              # oid_update_user($user, $sreg);
+-                              common_set_user($user);
+-                              common_real_login(true);
+-                              if (isset($_SESSION['openid_rememberme']) && $_SESSION['openid_rememberme']) {
+-                                      common_rememberme($user);
+-                              }
++            if ($user) {
++                oid_set_last($display);
++                # XXX: commented out at @edd's request until better
++                # control over how data flows from OpenID provider.
++                # oid_update_user($user, $sreg);
++                common_set_user($user);
++                common_real_login(true);
++                if (isset($_SESSION['openid_rememberme']) && $_SESSION['openid_rememberme']) {
++                    common_rememberme($user);
++                }
+hunk ./actions/finishopenidlogin.php 141
+-                              $this->go_home($user->nickname);
+-                      } else {
+-                              $this->save_values($display, $canonical, $sreg);
+-                              $this->show_form(NULL, $this->best_new_nickname($display, $sreg));
+-                      }
+-              }
+-      }
++                $this->go_home($user->nickname);
++            } else {
++                $this->save_values($display, $canonical, $sreg);
++                $this->show_form(NULL, $this->best_new_nickname($display, $sreg));
++            }
++        }
++    }
+hunk ./actions/finishopenidlogin.php 149
+-      function message($msg) {
+-              common_show_header(_('OpenID Login'));
+-              common_element('p', NULL, $msg);
+-              common_show_footer();
+-      }
++    function message($msg) {
++        common_show_header(_('OpenID Login'));
++        common_element('p', NULL, $msg);
++        common_show_footer();
++    }
+hunk ./actions/finishopenidlogin.php 155
+-      function save_values($display, $canonical, $sreg) {
+-              common_ensure_session();
+-              $_SESSION['openid_display'] = $display;
+-              $_SESSION['openid_canonical'] = $canonical;
+-              $_SESSION['openid_sreg'] = $sreg;
+-      }
++    function save_values($display, $canonical, $sreg) {
++        common_ensure_session();
++        $_SESSION['openid_display'] = $display;
++        $_SESSION['openid_canonical'] = $canonical;
++        $_SESSION['openid_sreg'] = $sreg;
++    }
+hunk ./actions/finishopenidlogin.php 162
+-      function get_saved_values() {
+-              return array($_SESSION['openid_display'],
+-                                       $_SESSION['openid_canonical'],
+-                                       $_SESSION['openid_sreg']);
+-      }
++    function get_saved_values() {
++        return array($_SESSION['openid_display'],
++                     $_SESSION['openid_canonical'],
++                     $_SESSION['openid_sreg']);
++    }
+hunk ./actions/finishopenidlogin.php 168
+-      function create_new_user() {
++    function create_new_user() {
+hunk ./actions/finishopenidlogin.php 172
+-              if (common_config('site', 'closed') || common_config('site', 'inviteonly')) {
+-                      common_user_error(_('Registration not allowed.'));
++        if (common_config('site', 'closed') || common_config('site', 'inviteonly')) {
++            common_user_error(_('Registration not allowed.'));
+hunk ./actions/finishopenidlogin.php 177
+-              $nickname = $this->trimmed('newname');
++        $nickname = $this->trimmed('newname');
+hunk ./actions/finishopenidlogin.php 179
+-              if (!Validate::string($nickname, array('min_length' => 1,
+-                                                                                         'max_length' => 64,
+-                                                                                         'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+-                      $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
+-                      return;
+-              }
++        if (!Validate::string($nickname, array('min_length' => 1,
++                                               'max_length' => 64,
++                                               'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
++            $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
++            return;
++        }
+hunk ./actions/finishopenidlogin.php 186
+-              if (!User::allowed_nickname($nickname)) {
+-                      $this->show_form(_('Nickname not allowed.'));
+-                      return;
+-              }
++        if (!User::allowed_nickname($nickname)) {
++            $this->show_form(_('Nickname not allowed.'));
++            return;
++        }
+hunk ./actions/finishopenidlogin.php 191
+-              if (User::staticGet('nickname', $nickname)) {
+-                      $this->show_form(_('Nickname already in use. Try another one.'));
+-                      return;
+-              }
++        if (User::staticGet('nickname', $nickname)) {
++            $this->show_form(_('Nickname already in use. Try another one.'));
++            return;
++        }
+hunk ./actions/finishopenidlogin.php 196
+-              list($display, $canonical, $sreg) = $this->get_saved_values();
++        list($display, $canonical, $sreg) = $this->get_saved_values();
+hunk ./actions/finishopenidlogin.php 198
+-              if (!$display || !$canonical) {
+-                      common_server_error(_('Stored OpenID not found.'));
+-                      return;
+-              }
++        if (!$display || !$canonical) {
++            common_server_error(_('Stored OpenID not found.'));
++            return;
++        }
+hunk ./actions/finishopenidlogin.php 203
+-              # Possible race condition... let's be paranoid
++        # Possible race condition... let's be paranoid
+hunk ./actions/finishopenidlogin.php 205
+-              $other = oid_get_user($canonical);
++        $other = oid_get_user($canonical);
+hunk ./actions/finishopenidlogin.php 207
+-              if ($other) {
+-                      common_server_error(_('Creating new account for OpenID that already has a user.'));
+-                      return;
+-              }
++        if ($other) {
++            common_server_error(_('Creating new account for OpenID that already has a user.'));
++            return;
++        }
+hunk ./actions/finishopenidlogin.php 212
+-              if ($sreg['country']) {
+-                      if ($sreg['postcode']) {
+-                              # XXX: use postcode to get city and region
+-                              # XXX: also, store postcode somewhere -- it's valuable!
+-                              $location = $sreg['postcode'] . ', ' . $sreg['country'];
+-                      } else {
+-                              $location = $sreg['country'];
+-                      }
+-              }
++        if ($sreg['country']) {
++            if ($sreg['postcode']) {
++                # XXX: use postcode to get city and region
++                # XXX: also, store postcode somewhere -- it's valuable!
++                $location = $sreg['postcode'] . ', ' . $sreg['country'];
++            } else {
++                $location = $sreg['country'];
++            }
++        }
+hunk ./actions/finishopenidlogin.php 222
+-              if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
+-                      $fullname = $sreg['fullname'];
+-              }
++        if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
++            $fullname = $sreg['fullname'];
++        }
+hunk ./actions/finishopenidlogin.php 226
+-              if ($sreg['email'] && Validate::email($sreg['email'], true)) {
+-                      $email = $sreg['email'];
+-              }
++        if ($sreg['email'] && Validate::email($sreg['email'], true)) {
++            $email = $sreg['email'];
++        }
+hunk ./actions/finishopenidlogin.php 230
+-              # XXX: add language
+-              # XXX: add timezone
++        # XXX: add language
++        # XXX: add timezone
+hunk ./actions/finishopenidlogin.php 233
+-              $user = User::register(array('nickname' => $nickname,
+-                                                                       'email' => $email,
+-                                                                       'fullname' => $fullname,
+-                                                                       'location' => $location));
++        $user = User::register(array('nickname' => $nickname,
++                                     'email' => $email,
++                                     'fullname' => $fullname,
++                                     'location' => $location));
+hunk ./actions/finishopenidlogin.php 238
+-              $result = oid_link_user($user->id, $canonical, $display);
++        $result = oid_link_user($user->id, $canonical, $display);
+hunk ./actions/finishopenidlogin.php 240
+-              oid_set_last($display);
+-              common_set_user($user);
+-              common_real_login(true);
++        oid_set_last($display);
++        common_set_user($user);
++        common_real_login(true);
+hunk ./actions/finishopenidlogin.php 244
+-                      common_rememberme($user);
+-              }
++            common_rememberme($user);
++        }
+hunk ./actions/finishopenidlogin.php 247
+-              common_redirect(common_local_url('showstream', array('nickname' => $user->nickname)));
+-      }
++        common_redirect(common_local_url('showstream', array('nickname' => $user->nickname)));
++    }
+hunk ./actions/finishopenidlogin.php 250
+-      function connect_user() {
++    function connect_user() {
+hunk ./actions/finishopenidlogin.php 252
+-              $nickname = $this->trimmed('nickname');
+-              $password = $this->trimmed('password');
++        $nickname = $this->trimmed('nickname');
++        $password = $this->trimmed('password');
+hunk ./actions/finishopenidlogin.php 255
+-              if (!common_check_user($nickname, $password)) {
+-                      $this->show_form(_('Invalid username or password.'));
+-                      return;
+-              }
++        if (!common_check_user($nickname, $password)) {
++            $this->show_form(_('Invalid username or password.'));
++            return;
++        }
+hunk ./actions/finishopenidlogin.php 260
+-              # They're legit!
++        # They're legit!
+hunk ./actions/finishopenidlogin.php 262
+-              $user = User::staticGet('nickname', $nickname);
++        $user = User::staticGet('nickname', $nickname);
+hunk ./actions/finishopenidlogin.php 264
+-              list($display, $canonical, $sreg) = $this->get_saved_values();
++        list($display, $canonical, $sreg) = $this->get_saved_values();
+hunk ./actions/finishopenidlogin.php 266
+-              if (!$display || !$canonical) {
+-                      common_server_error(_('Stored OpenID not found.'));
+-                      return;
+-              }
++        if (!$display || !$canonical) {
++            common_server_error(_('Stored OpenID not found.'));
++            return;
++        }
+hunk ./actions/finishopenidlogin.php 271
+-              $result = oid_link_user($user->id, $canonical, $display);
++        $result = oid_link_user($user->id, $canonical, $display);
+hunk ./actions/finishopenidlogin.php 273
+-              if (!$result) {
+-                      common_server_error(_('Error connecting user to OpenID.'));
+-                      return;
+-              }
++        if (!$result) {
++            common_server_error(_('Error connecting user to OpenID.'));
++            return;
++        }
+hunk ./actions/finishopenidlogin.php 278
+-              oid_update_user($user, $sreg);
+-              oid_set_last($display);
+-              common_set_user($user);
+-              common_real_login(true);
++        oid_update_user($user, $sreg);
++        oid_set_last($display);
++        common_set_user($user);
++        common_real_login(true);
+hunk ./actions/finishopenidlogin.php 283
+-                      common_rememberme($user);
+-              }
+-              unset($_SESSION['openid_rememberme']);
+-              $this->go_home($user->nickname);
+-      }
++            common_rememberme($user);
++        }
++        unset($_SESSION['openid_rememberme']);
++        $this->go_home($user->nickname);
++    }
+hunk ./actions/finishopenidlogin.php 289
+-      function go_home($nickname) {
+-              $url = common_get_returnto();
+-              if ($url) {
+-                      # We don't have to return to it again
+-                      common_set_returnto(NULL);
+-              } else {
+-                      $url = common_local_url('all',
+-                                                                      array('nickname' =>
+-                                                                                $nickname));
+-              }
+-              common_redirect($url);
+-      }
++    function go_home($nickname) {
++        $url = common_get_returnto();
++        if ($url) {
++            # We don't have to return to it again
++            common_set_returnto(NULL);
++        } else {
++            $url = common_local_url('all',
++                                    array('nickname' =>
++                                          $nickname));
++        }
++        common_redirect($url);
++    }
+hunk ./actions/finishopenidlogin.php 302
+-      function best_new_nickname($display, $sreg) {
++    function best_new_nickname($display, $sreg) {
+hunk ./actions/finishopenidlogin.php 304
+-              # Try the passed-in nickname
++        # Try the passed-in nickname
+hunk ./actions/finishopenidlogin.php 306
+-              if ($sreg['nickname']) {
+-                      $nickname = $this->nicknamize($sreg['nickname']);
+-                      if ($this->is_new_nickname($nickname)) {
+-                              return $nickname;
+-                      }
+-              }
++        if ($sreg['nickname']) {
++            $nickname = $this->nicknamize($sreg['nickname']);
++            if ($this->is_new_nickname($nickname)) {
++                return $nickname;
++            }
++        }
+hunk ./actions/finishopenidlogin.php 313
+-              # Try the full name
++        # Try the full name
+hunk ./actions/finishopenidlogin.php 315
+-              if ($sreg['fullname']) {
+-                      $fullname = $this->nicknamize($sreg['fullname']);
+-                      if ($this->is_new_nickname($fullname)) {
+-                              return $fullname;
+-                      }
+-              }
++        if ($sreg['fullname']) {
++            $fullname = $this->nicknamize($sreg['fullname']);
++            if ($this->is_new_nickname($fullname)) {
++                return $fullname;
++            }
++        }
+hunk ./actions/finishopenidlogin.php 322
+-              # Try the URL
++        # Try the URL
+hunk ./actions/finishopenidlogin.php 324
+-              $from_url = $this->openid_to_nickname($display);
++        $from_url = $this->openid_to_nickname($display);
+hunk ./actions/finishopenidlogin.php 326
+-              if ($from_url && $this->is_new_nickname($from_url)) {
+-                      return $from_url;
+-              }
++        if ($from_url && $this->is_new_nickname($from_url)) {
++            return $from_url;
++        }
+hunk ./actions/finishopenidlogin.php 330
+-              # XXX: others?
++        # XXX: others?
+hunk ./actions/finishopenidlogin.php 332
+-              return NULL;
+-      }
++        return NULL;
++    }
+hunk ./actions/finishopenidlogin.php 335
+-      function is_new_nickname($str) {
+-              if (!Validate::string($str, array('min_length' => 1,
+-                                                                                'max_length' => 64,
+-                                                                                'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+-                      return false;
+-              }
+-      if (!User::allowed_nickname($str)) {
+-                      return false;
+-              }
+-              if (User::staticGet('nickname', $str)) {
+-                      return false;
+-              }
+-              return true;
+-      }
++    function is_new_nickname($str) {
++        if (!Validate::string($str, array('min_length' => 1,
++                                          'max_length' => 64,
++                                          'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
++            return false;
++        }
++    if (!User::allowed_nickname($str)) {
++            return false;
++        }
++        if (User::staticGet('nickname', $str)) {
++            return false;
++        }
++        return true;
++    }
+hunk ./actions/finishopenidlogin.php 350
+-      function openid_to_nickname($openid) {
++    function openid_to_nickname($openid) {
+hunk ./actions/finishopenidlogin.php 352
+-                      return $this->xri_to_nickname($openid);
+-              } else {
+-                      return $this->url_to_nickname($openid);
+-              }
+-      }
++            return $this->xri_to_nickname($openid);
++        } else {
++            return $this->url_to_nickname($openid);
++        }
++    }
+hunk ./actions/finishopenidlogin.php 358
+-      # We try to use an OpenID URL as a legal Laconica user name in this order
+-      # 1. Plain hostname, like http://evanp.myopenid.com/
+-      # 2. One element in path, like http://profile.typekey.com/EvanProdromou/
+-      #    or http://getopenid.com/evanprodromou
++    # We try to use an OpenID URL as a legal Laconica user name in this order
++    # 1. Plain hostname, like http://evanp.myopenid.com/
++    # 2. One element in path, like http://profile.typekey.com/EvanProdromou/
++    #    or http://getopenid.com/evanprodromou
+hunk ./actions/finishopenidlogin.php 364
+-              static $bad = array('query', 'user', 'password', 'port', 'fragment');
++        static $bad = array('query', 'user', 'password', 'port', 'fragment');
+hunk ./actions/finishopenidlogin.php 366
+-          $parts = parse_url($openid);
++        $parts = parse_url($openid);
+hunk ./actions/finishopenidlogin.php 368
+-              # If any of these parts exist, this won't work
++        # If any of these parts exist, this won't work
+hunk ./actions/finishopenidlogin.php 370
+-              foreach ($bad as $badpart) {
+-                      if (array_key_exists($badpart, $parts)) {
+-                              return NULL;
+-                      }
+-              }
++        foreach ($bad as $badpart) {
++            if (array_key_exists($badpart, $parts)) {
++                return NULL;
++            }
++        }
+hunk ./actions/finishopenidlogin.php 376
+-              # We just have host and/or path
++        # We just have host and/or path
+hunk ./actions/finishopenidlogin.php 378
+-              # If it's just a host...
+-              if (array_key_exists('host', $parts) &&
+-                      (!array_key_exists('path', $parts) || strcmp($parts['path'], '/') == 0))
+-              {
+-                      $hostparts = explode('.', $parts['host']);
++        # If it's just a host...
++        if (array_key_exists('host', $parts) &&
++            (!array_key_exists('path', $parts) || strcmp($parts['path'], '/') == 0))
++        {
++            $hostparts = explode('.', $parts['host']);
+hunk ./actions/finishopenidlogin.php 384
+-                      # Try to catch common idiom of nickname.service.tld
++            # Try to catch common idiom of nickname.service.tld
+hunk ./actions/finishopenidlogin.php 386
+-                      if ((count($hostparts) > 2) &&
+-                              (strlen($hostparts[count($hostparts) - 2]) > 3) && # try to skip .co.uk, .com.au
+-                              (strcmp($hostparts[0], 'www') != 0))
+-                      {
+-                              return $this->nicknamize($hostparts[0]);
+-                      } else {
+-                              # Do the whole hostname
+-                              return $this->nicknamize($parts['host']);
+-                      }
+-              } else {
+-                      if (array_key_exists('path', $parts)) {
+-                              # Strip starting, ending slashes
+-                              $path = preg_replace('@/$@', '', $parts['path']);
+-                              $path = preg_replace('@^/@', '', $path);
+-                              if (strpos($path, '/') === false) {
+-                                      return $this->nicknamize($path);
+-                              }
+-                      }
+-              }
++            if ((count($hostparts) > 2) &&
++                (strlen($hostparts[count($hostparts) - 2]) > 3) && # try to skip .co.uk, .com.au
++                (strcmp($hostparts[0], 'www') != 0))
++            {
++                return $this->nicknamize($hostparts[0]);
++            } else {
++                # Do the whole hostname
++                return $this->nicknamize($parts['host']);
++            }
++        } else {
++            if (array_key_exists('path', $parts)) {
++                # Strip starting, ending slashes
++                $path = preg_replace('@/$@', '', $parts['path']);
++                $path = preg_replace('@^/@', '', $path);
++                if (strpos($path, '/') === false) {
++                    return $this->nicknamize($path);
++                }
++            }
++        }
+hunk ./actions/finishopenidlogin.php 406
+-              return NULL;
+-      }
++        return NULL;
++    }
+hunk ./actions/finishopenidlogin.php 409
+-      function xri_to_nickname($xri) {
+-              $base = $this->xri_base($xri);
++    function xri_to_nickname($xri) {
++        $base = $this->xri_base($xri);
+hunk ./actions/finishopenidlogin.php 412
+-              if (!$base) {
+-                      return NULL;
+-              } else {
+-                      # =evan.prodromou
+-                      # or @gratis*evan.prodromou
+-                      $parts = explode('*', substr($base, 1));
+-                      return $this->nicknamize(array_pop($parts));
+-              }
+-      }
++        if (!$base) {
++            return NULL;
++        } else {
++            # =evan.prodromou
++            # or @gratis*evan.prodromou
++            $parts = explode('*', substr($base, 1));
++            return $this->nicknamize(array_pop($parts));
++        }
++    }
+hunk ./actions/finishopenidlogin.php 422
+-      function xri_base($xri) {
+-              if (substr($xri, 0, 6) == 'xri://') {
+-                      return substr($xri, 6);
+-              } else {
+-                      return $xri;
+-              }
+-      }
++    function xri_base($xri) {
++        if (substr($xri, 0, 6) == 'xri://') {
++            return substr($xri, 6);
++        } else {
++            return $xri;
++        }
++    }
+hunk ./actions/finishopenidlogin.php 430
+-      # Given a string, try to make it work as a nickname
++    # Given a string, try to make it work as a nickname
+hunk ./actions/finishopenidlogin.php 432
+-      function nicknamize($str) {
+-              $str = preg_replace('/\W/', '', $str);
+-              return strtolower($str);
+-      }
++    function nicknamize($str) {
++        $str = preg_replace('/\W/', '', $str);
++        return strtolower($str);
++    }
+hunk ./actions/finishremotesubscribe.php 26
+-      function handle($args) {
++    function handle($args) {
+hunk ./actions/finishremotesubscribe.php 28
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/finishremotesubscribe.php 30
+-              if (common_logged_in()) {
+-                      common_user_error(_('You can use the local subscription!'));
+-                  return;
+-              }
++        if (common_logged_in()) {
++            common_user_error(_('You can use the local subscription!'));
++            return;
++        }
+hunk ./actions/finishremotesubscribe.php 35
+-              $omb = $_SESSION['oauth_authorization_request'];
++        $omb = $_SESSION['oauth_authorization_request'];
+hunk ./actions/finishremotesubscribe.php 37
+-              if (!$omb) {
+-                      common_user_error(_('Not expecting this response!'));
+-                      return;
+-              }
++        if (!$omb) {
++            common_user_error(_('Not expecting this response!'));
++            return;
++        }
+hunk ./actions/finishremotesubscribe.php 42
+-              common_debug('stored request: '.print_r($omb,true), __FILE__);
++        common_debug('stored request: '.print_r($omb,true), __FILE__);
+hunk ./actions/finishremotesubscribe.php 44
+-              common_remove_magic_from_request();
+-              $req = OAuthRequest::from_request();
++        common_remove_magic_from_request();
++        $req = OAuthRequest::from_request();
+hunk ./actions/finishremotesubscribe.php 47
+-              $token = $req->get_parameter('oauth_token');
++        $token = $req->get_parameter('oauth_token');
+hunk ./actions/finishremotesubscribe.php 49
+-              # I think this is the success metric
++        # I think this is the success metric
+hunk ./actions/finishremotesubscribe.php 51
+-              if ($token != $omb['token']) {
+-                      common_user_error(_('Not authorized.'));
+-                      return;
+-              }
++        if ($token != $omb['token']) {
++            common_user_error(_('Not authorized.'));
++            return;
++        }
+hunk ./actions/finishremotesubscribe.php 56
+-              $version = $req->get_parameter('omb_version');
++        $version = $req->get_parameter('omb_version');
+hunk ./actions/finishremotesubscribe.php 58
+-              if ($version != OMB_VERSION_01) {
+-                      common_user_error(_('Unknown version of OMB protocol.'));
+-                      return;
+-              }
++        if ($version != OMB_VERSION_01) {
++            common_user_error(_('Unknown version of OMB protocol.'));
++            return;
++        }
+hunk ./actions/finishremotesubscribe.php 63
+-              $nickname = $req->get_parameter('omb_listener_nickname');
++        $nickname = $req->get_parameter('omb_listener_nickname');
+hunk ./actions/finishremotesubscribe.php 65
+-              if (!$nickname) {
+-                      common_user_error(_('No nickname provided by remote server.'));
+-                      return;
+-              }
++        if (!$nickname) {
++            common_user_error(_('No nickname provided by remote server.'));
++            return;
++        }
+hunk ./actions/finishremotesubscribe.php 70
+-              $profile_url = $req->get_parameter('omb_listener_profile');
++        $profile_url = $req->get_parameter('omb_listener_profile');
+hunk ./actions/finishremotesubscribe.php 72
+-              if (!$profile_url) {
+-                      common_user_error(_('No profile URL returned by server.'));
+-                      return;
+-              }
++        if (!$profile_url) {
++            common_user_error(_('No profile URL returned by server.'));
++            return;
++        }
+hunk ./actions/finishremotesubscribe.php 77
+-              if (!Validate::uri($profile_url, array('allowed_schemes' => array('http', 'https')))) {
+-                      common_user_error(_('Invalid profile URL returned by server.'));
+-                      return;
+-              }
++        if (!Validate::uri($profile_url, array('allowed_schemes' => array('http', 'https')))) {
++            common_user_error(_('Invalid profile URL returned by server.'));
++            return;
++        }
+hunk ./actions/finishremotesubscribe.php 82
+-              if ($profile_url == common_local_url('showstream', array('nickname' => $nickname))) {
+-                      common_user_error(_('You can use the local subscription!'));
+-                  return;
+-              }
++        if ($profile_url == common_local_url('showstream', array('nickname' => $nickname))) {
++            common_user_error(_('You can use the local subscription!'));
++            return;
++        }
+hunk ./actions/finishremotesubscribe.php 87
+-              common_debug('listenee: "'.$omb['listenee'].'"', __FILE__);
++        common_debug('listenee: "'.$omb['listenee'].'"', __FILE__);
+hunk ./actions/finishremotesubscribe.php 89
+-              $user = User::staticGet('nickname', $omb['listenee']);
++        $user = User::staticGet('nickname', $omb['listenee']);
+hunk ./actions/finishremotesubscribe.php 91
+-              if (!$user) {
+-                      common_user_error(_('User being listened to doesn\'t exist.'));
+-                      return;
+-              }
++        if (!$user) {
++            common_user_error(_('User being listened to doesn\'t exist.'));
++            return;
++        }
+hunk ./actions/finishremotesubscribe.php 96
+-              $other = User::staticGet('uri', $omb['listener']);
++        $other = User::staticGet('uri', $omb['listener']);
+hunk ./actions/finishremotesubscribe.php 98
+-              if ($other) {
+-                      common_user_error(_('You can use the local subscription!'));
+-                      return;
+-              }
++        if ($other) {
++            common_user_error(_('You can use the local subscription!'));
++            return;
++        }
+hunk ./actions/finishremotesubscribe.php 103
+-              $fullname = $req->get_parameter('omb_listener_fullname');
+-              $homepage = $req->get_parameter('omb_listener_homepage');
+-              $bio = $req->get_parameter('omb_listener_bio');
+-              $location = $req->get_parameter('omb_listener_location');
+-              $avatar_url = $req->get_parameter('omb_listener_avatar');
++        $fullname = $req->get_parameter('omb_listener_fullname');
++        $homepage = $req->get_parameter('omb_listener_homepage');
++        $bio = $req->get_parameter('omb_listener_bio');
++        $location = $req->get_parameter('omb_listener_location');
++        $avatar_url = $req->get_parameter('omb_listener_avatar');
+hunk ./actions/finishremotesubscribe.php 109
+-              list($newtok, $newsecret) = $this->access_token($omb);
++        list($newtok, $newsecret) = $this->access_token($omb);
+hunk ./actions/finishremotesubscribe.php 111
+-              if (!$newtok || !$newsecret) {
+-                      common_user_error(_('Couldn\'t convert request tokens to access tokens.'));
+-                      return;
+-              }
++        if (!$newtok || !$newsecret) {
++            common_user_error(_('Couldn\'t convert request tokens to access tokens.'));
++            return;
++        }
+hunk ./actions/finishremotesubscribe.php 116
+-              # XXX: possible attack point; subscribe and return someone else's profile URI
++        # XXX: possible attack point; subscribe and return someone else's profile URI
+hunk ./actions/finishremotesubscribe.php 118
+-              $remote = Remote_profile::staticGet('uri', $omb['listener']);
++        $remote = Remote_profile::staticGet('uri', $omb['listener']);
+hunk ./actions/finishremotesubscribe.php 120
+-              if ($remote) {
+-                      $exists = true;
+-                      $profile = Profile::staticGet($remote->id);
+-                      $orig_remote = clone($remote);
+-                      $orig_profile = clone($profile);
+-                      # XXX: compare current postNotice and updateProfile URLs to the ones
+-                      # stored in the DB to avoid (possibly...) above attack
+-              } else {
+-                      $exists = false;
+-                      $remote = new Remote_profile();
+-                      $remote->uri = $omb['listener'];
+-                      $profile = new Profile();
+-              }
++        if ($remote) {
++            $exists = true;
++            $profile = Profile::staticGet($remote->id);
++            $orig_remote = clone($remote);
++            $orig_profile = clone($profile);
++            # XXX: compare current postNotice and updateProfile URLs to the ones
++            # stored in the DB to avoid (possibly...) above attack
++        } else {
++            $exists = false;
++            $remote = new Remote_profile();
++            $remote->uri = $omb['listener'];
++            $profile = new Profile();
++        }
+hunk ./actions/finishremotesubscribe.php 134
+-              $profile->nickname = $nickname;
+-              $profile->profileurl = $profile_url;
++        $profile->nickname = $nickname;
++        $profile->profileurl = $profile_url;
+hunk ./actions/finishremotesubscribe.php 137
+-              if ($fullname) {
+-                      $profile->fullname = $fullname;
+-              }
+-              if ($homepage) {
+-                      $profile->homepage = $homepage;
+-              }
+-              if ($bio) {
+-                      $profile->bio = $bio;
+-              }
+-              if ($location) {
+-                      $profile->location = $location;
+-              }
++        if ($fullname) {
++            $profile->fullname = $fullname;
++        }
++        if ($homepage) {
++            $profile->homepage = $homepage;
++        }
++        if ($bio) {
++            $profile->bio = $bio;
++        }
++        if ($location) {
++            $profile->location = $location;
++        }
+hunk ./actions/finishremotesubscribe.php 150
+-              if ($exists) {
+-                      $profile->update($orig_profile);
+-              } else {
+-                      $profile->created = DB_DataObject_Cast::dateTime(); # current time
+-                      $id = $profile->insert();
+-                      if (!$id) {
+-                              common_server_error(_('Error inserting new profile'));
+-                              return;
+-                      }
+-                      $remote->id = $id;
+-              }
++        if ($exists) {
++            $profile->update($orig_profile);
++        } else {
++            $profile->created = DB_DataObject_Cast::dateTime(); # current time
++            $id = $profile->insert();
++            if (!$id) {
++                common_server_error(_('Error inserting new profile'));
++                return;
++            }
++            $remote->id = $id;
++        }
+hunk ./actions/finishremotesubscribe.php 162
+-              if ($avatar_url) {
+-                      if (!$this->add_avatar($profile, $avatar_url)) {
+-                              common_server_error(_('Error inserting avatar'));
+-                              return;
+-                      }
+-              }
++        if ($avatar_url) {
++            if (!$this->add_avatar($profile, $avatar_url)) {
++                common_server_error(_('Error inserting avatar'));
++                return;
++            }
++        }
+hunk ./actions/finishremotesubscribe.php 169
+-              $remote->postnoticeurl = $omb['post_notice_url'];
+-              $remote->updateprofileurl = $omb['update_profile_url'];
++        $remote->postnoticeurl = $omb['post_notice_url'];
++        $remote->updateprofileurl = $omb['update_profile_url'];
+hunk ./actions/finishremotesubscribe.php 172
+-              if ($exists) {
+-                      if (!$remote->update($orig_remote)) {
+-                              common_server_error(_('Error updating remote profile'));
+-                              return;
+-                      }
+-              } else {
+-                      $remote->created = DB_DataObject_Cast::dateTime(); # current time
+-                      if (!$remote->insert()) {
+-                              common_server_error(_('Error inserting remote profile'));
+-                              return;
+-                      }
+-              }
++        if ($exists) {
++            if (!$remote->update($orig_remote)) {
++                common_server_error(_('Error updating remote profile'));
++                return;
++            }
++        } else {
++            $remote->created = DB_DataObject_Cast::dateTime(); # current time
++            if (!$remote->insert()) {
++                common_server_error(_('Error inserting remote profile'));
++                return;
++            }
++        }
+hunk ./actions/finishremotesubscribe.php 190
+-              $sub = new Subscription();
++        $sub = new Subscription();
+hunk ./actions/finishremotesubscribe.php 192
+-              $sub->subscriber = $remote->id;
+-              $sub->subscribed = $user->id;
++        $sub->subscriber = $remote->id;
++        $sub->subscribed = $user->id;
+hunk ./actions/finishremotesubscribe.php 205
+-              $sub->token = $newtok;
+-              $sub->secret = $newsecret;
++        $sub->token = $newtok;
++        $sub->secret = $newsecret;
+hunk ./actions/finishremotesubscribe.php 214
+-              if (!$result) {
++        if (!$result) {
+hunk ./actions/finishremotesubscribe.php 216
+-                      common_user_error(_('Couldn\'t insert new subscription.'));
+-                      return;
+-              }
++            common_user_error(_('Couldn\'t insert new subscription.'));
++            return;
++        }
+hunk ./actions/finishremotesubscribe.php 220
+-              # Notify user, if necessary
++        # Notify user, if necessary
+hunk ./actions/finishremotesubscribe.php 222
+-              mail_subscribe_notify_profile($user, $profile);
++        mail_subscribe_notify_profile($user, $profile);
+hunk ./actions/finishremotesubscribe.php 224
+-              # Clear the data
+-              unset($_SESSION['oauth_authorization_request']);
++        # Clear the data
++        unset($_SESSION['oauth_authorization_request']);
+hunk ./actions/finishremotesubscribe.php 227
+-              # If we show subscriptions in reverse chron order, this should
+-              # show up close to the top of the page
++        # If we show subscriptions in reverse chron order, this should
++        # show up close to the top of the page
+hunk ./actions/finishremotesubscribe.php 230
+-              common_redirect(common_local_url('subscribers', array('nickname' =>
+-                                                                                                                       $user->nickname)));
+-      }
++        common_redirect(common_local_url('subscribers', array('nickname' =>
++                                                             $user->nickname)));
++    }
+hunk ./actions/finishremotesubscribe.php 234
+-      function add_avatar($profile, $url) {
+-              $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar');
+-              copy($url, $temp_filename);
+-              return $profile->setOriginal($temp_filename);
+-      }
++    function add_avatar($profile, $url) {
++        $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar');
++        copy($url, $temp_filename);
++        return $profile->setOriginal($temp_filename);
++    }
+hunk ./actions/finishremotesubscribe.php 240
+-      function access_token($omb) {
++    function access_token($omb) {
+hunk ./actions/finishremotesubscribe.php 242
+-              common_debug('starting request for access token', __FILE__);
++        common_debug('starting request for access token', __FILE__);
+hunk ./actions/finishremotesubscribe.php 244
+-              $con = omb_oauth_consumer();
+-              $tok = new OAuthToken($omb['token'], $omb['secret']);
++        $con = omb_oauth_consumer();
++        $tok = new OAuthToken($omb['token'], $omb['secret']);
+hunk ./actions/finishremotesubscribe.php 247
+-              common_debug('using request token "'.$tok.'"', __FILE__);
++        common_debug('using request token "'.$tok.'"', __FILE__);
+hunk ./actions/finishremotesubscribe.php 249
+-              $url = $omb['access_token_url'];
++        $url = $omb['access_token_url'];
+hunk ./actions/finishremotesubscribe.php 251
+-              common_debug('using access token url "'.$url.'"', __FILE__);
++        common_debug('using access token url "'.$url.'"', __FILE__);
+hunk ./actions/finishremotesubscribe.php 253
+-              # XXX: Is this the right thing to do? Strip off GET params and make them
+-              # POST params? Seems wrong to me.
++        # XXX: Is this the right thing to do? Strip off GET params and make them
++        # POST params? Seems wrong to me.
+hunk ./actions/finishremotesubscribe.php 256
+-              $parsed = parse_url($url);
+-              $params = array();
+-              parse_str($parsed['query'], $params);
++        $parsed = parse_url($url);
++        $params = array();
++        parse_str($parsed['query'], $params);
+hunk ./actions/finishremotesubscribe.php 260
+-              $req = OAuthRequest::from_consumer_and_token($con, $tok, "POST", $url, $params);
++        $req = OAuthRequest::from_consumer_and_token($con, $tok, "POST", $url, $params);
+hunk ./actions/finishremotesubscribe.php 262
+-              $req->set_parameter('omb_version', OMB_VERSION_01);
++        $req->set_parameter('omb_version', OMB_VERSION_01);
+hunk ./actions/finishremotesubscribe.php 264
+-              # XXX: test to see if endpoint accepts this signature method
++        # XXX: test to see if endpoint accepts this signature method
+hunk ./actions/finishremotesubscribe.php 266
+-              $req->sign_request(omb_hmac_sha1(), $con, $tok);
++        $req->sign_request(omb_hmac_sha1(), $con, $tok);
+hunk ./actions/finishremotesubscribe.php 268
+-              # We re-use this tool's fetcher, since it's pretty good
++        # We re-use this tool's fetcher, since it's pretty good
+hunk ./actions/finishremotesubscribe.php 270
+-              common_debug('posting to access token url "'.$req->get_normalized_http_url().'"', __FILE__);
+-              common_debug('posting request data "'.$req->to_postdata().'"', __FILE__);
++        common_debug('posting to access token url "'.$req->get_normalized_http_url().'"', __FILE__);
++        common_debug('posting request data "'.$req->to_postdata().'"', __FILE__);
+hunk ./actions/finishremotesubscribe.php 273
+-              $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+-              $result = $fetcher->post($req->get_normalized_http_url(),
+-                                                               $req->to_postdata(),
++        $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
++        $result = $fetcher->post($req->get_normalized_http_url(),
++                                 $req->to_postdata(),
+hunk ./actions/finishremotesubscribe.php 278
+-              common_debug('got result: "'.print_r($result,TRUE).'"', __FILE__);
++        common_debug('got result: "'.print_r($result,TRUE).'"', __FILE__);
+hunk ./actions/finishremotesubscribe.php 280
+-              if ($result->status != 200) {
+-                      return NULL;
+-              }
++        if ($result->status != 200) {
++            return NULL;
++        }
+hunk ./actions/finishremotesubscribe.php 284
+-              parse_str($result->body, $return);
++        parse_str($result->body, $return);
+hunk ./actions/finishremotesubscribe.php 286
+-              return array($return['oauth_token'], $return['oauth_token_secret']);
+-      }
++        return array($return['oauth_token'], $return['oauth_token_secret']);
++    }
+hunk ./actions/foaf.php 28
+-      function is_readonly() {
+-              return true;
+-      }
++    function is_readonly() {
++        return true;
++    }
+hunk ./actions/foaf.php 32
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/foaf.php 35
+-              $nickname = $this->trimmed('nickname');
++        $nickname = $this->trimmed('nickname');
+hunk ./actions/foaf.php 37
+-              $user = User::staticGet('nickname', $nickname);
++        $user = User::staticGet('nickname', $nickname);
+hunk ./actions/foaf.php 39
+-              if (!$user) {
+-                      common_user_error(_('No such user.'), 404);
+-                      return;
+-              }
++        if (!$user) {
++            common_user_error(_('No such user.'), 404);
++            return;
++        }
+hunk ./actions/foaf.php 44
+-              $profile = $user->getProfile();
++        $profile = $user->getProfile();
+hunk ./actions/foaf.php 46
+-              if (!$profile) {
+-                      common_server_error(_('User has no profile.'), 500);
+-                      return;
+-              }
++        if (!$profile) {
++            common_server_error(_('User has no profile.'), 500);
++            return;
++        }
+hunk ./actions/foaf.php 51
+-              header('Content-Type: application/rdf+xml');
++        header('Content-Type: application/rdf+xml');
+hunk ./actions/foaf.php 53
+-              common_start_xml();
+-              common_element_start('rdf:RDF', array('xmlns:rdf' =>
+-                                                                                        'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
+-                                                                                        'xmlns:rdfs' =>
+-                                                                                        'http://www.w3.org/2000/01/rdf-schema#',
+-                                                                                        'xmlns:geo' =>
+-                                                                                        'http://www.w3.org/2003/01/geo/wgs84_pos#',
+-                                                                                        'xmlns' => 'http://xmlns.com/foaf/0.1/'));
++        common_start_xml();
++        common_element_start('rdf:RDF', array('xmlns:rdf' =>
++                                              'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
++                                              'xmlns:rdfs' =>
++                                              'http://www.w3.org/2000/01/rdf-schema#',
++                                              'xmlns:geo' =>
++                                              'http://www.w3.org/2003/01/geo/wgs84_pos#',
++                                              'xmlns' => 'http://xmlns.com/foaf/0.1/'));
+hunk ./actions/foaf.php 62
+-              # This is the document about the user
++        # This is the document about the user
+hunk ./actions/foaf.php 64
+-              $this->show_ppd('', $user->uri);
++        $this->show_ppd('', $user->uri);
+hunk ./actions/foaf.php 66
+-              # XXX: might not be a person
+-              common_element_start('Person', array('rdf:about' =>
+-                                                                                       $user->uri));
+-              common_element('mbox_sha1sum', NULL, sha1('mailto:' . $user->email));
+-              if ($profile->fullname) {
+-                      common_element('name', NULL, $profile->fullname);
+-              }
+-              if ($profile->homepage) {
+-                      common_element('homepage', array('rdf:resource' => $profile->homepage));
+-              }
+-              if ($profile->bio) {
+-                      common_element('rdfs:comment', NULL, $profile->bio);
+-              }
+-              # XXX: more structured location data
+-              if ($profile->location) {
+-                      common_element_start('based_near');
+-                      common_element_start('geo:SpatialThing');
+-                      common_element('name', NULL, $profile->location);
+-                      common_element_end('geo:SpatialThing');
+-                      common_element_end('based_near');
+-              }
++        # XXX: might not be a person
++        common_element_start('Person', array('rdf:about' =>
++                                             $user->uri));
++        common_element('mbox_sha1sum', NULL, sha1('mailto:' . $user->email));
++        if ($profile->fullname) {
++            common_element('name', NULL, $profile->fullname);
++        }
++        if ($profile->homepage) {
++            common_element('homepage', array('rdf:resource' => $profile->homepage));
++        }
++        if ($profile->bio) {
++            common_element('rdfs:comment', NULL, $profile->bio);
++        }
++        # XXX: more structured location data
++        if ($profile->location) {
++            common_element_start('based_near');
++            common_element_start('geo:SpatialThing');
++            common_element('name', NULL, $profile->location);
++            common_element_end('geo:SpatialThing');
++            common_element_end('based_near');
++        }
+hunk ./actions/foaf.php 88
+-              $this->show_microblogging_account($profile, common_root_url());
++        $this->show_microblogging_account($profile, common_root_url());
+hunk ./actions/foaf.php 90
+-              $avatar = $profile->getOriginalAvatar();
++        $avatar = $profile->getOriginalAvatar();
+hunk ./actions/foaf.php 92
+-              if ($avatar) {
+-                      common_element_start('img');
+-                      common_element_start('Image', array('rdf:about' => $avatar->url));
+-                      foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
+-                              $scaled = $profile->getAvatar($size);
+-                              if (!$scaled->original) { # sometimes the original has one of our scaled sizes
+-                                      common_element_start('thumbnail');
+-                                      common_element('Image', array('rdf:about' => $scaled->url));
+-                                      common_element_end('thumbnail');
+-                              }
+-                      }
+-                      common_element_end('Image');
+-                      common_element_end('img');
+-              }
++        if ($avatar) {
++            common_element_start('img');
++            common_element_start('Image', array('rdf:about' => $avatar->url));
++            foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
++                $scaled = $profile->getAvatar($size);
++                if (!$scaled->original) { # sometimes the original has one of our scaled sizes
++                    common_element_start('thumbnail');
++                    common_element('Image', array('rdf:about' => $scaled->url));
++                    common_element_end('thumbnail');
++                }
++            }
++            common_element_end('Image');
++            common_element_end('img');
++        }
+hunk ./actions/foaf.php 107
+-              # Get people user is subscribed to
++        # Get people user is subscribed to
+hunk ./actions/foaf.php 109
+-              $person = array();
++        $person = array();
+hunk ./actions/foaf.php 111
+-              $sub = new Subscription();
+-              $sub->subscriber = $profile->id;
+-              $sub->whereAdd('subscriber != subscribed');
+-              
+-              if ($sub->find()) {
+-                      while ($sub->fetch()) {
+-                              if ($sub->token) {
+-                                      $other = Remote_profile::staticGet('id', $sub->subscribed);
+-                              } else {
+-                                      $other = User::staticGet('id', $sub->subscribed);
+-                              }
+-                              if (!$other) {
+-                                      common_debug('Got a bad subscription: '.print_r($sub,TRUE));
+-                                      continue;
+-                              }
+-                              common_element('knows', array('rdf:resource' => $other->uri));
+-                              $person[$other->uri] = array(LISTENEE, $other);
+-                      }
+-              }
++        $sub = new Subscription();
++        $sub->subscriber = $profile->id;
++        $sub->whereAdd('subscriber != subscribed');
++        
++        if ($sub->find()) {
++            while ($sub->fetch()) {
++                if ($sub->token) {
++                    $other = Remote_profile::staticGet('id', $sub->subscribed);
++                } else {
++                    $other = User::staticGet('id', $sub->subscribed);
++                }
++                if (!$other) {
++                    common_debug('Got a bad subscription: '.print_r($sub,TRUE));
++                    continue;
++                }
++                common_element('knows', array('rdf:resource' => $other->uri));
++                $person[$other->uri] = array(LISTENEE, $other);
++            }
++        }
+hunk ./actions/foaf.php 131
+-              # Get people who subscribe to user
++        # Get people who subscribe to user
+hunk ./actions/foaf.php 133
+-              $sub = new Subscription();
+-              $sub->subscribed = $profile->id;
+-              $sub->whereAdd('subscriber != subscribed');
++        $sub = new Subscription();
++        $sub->subscribed = $profile->id;
++        $sub->whereAdd('subscriber != subscribed');
+hunk ./actions/foaf.php 137
+-              if ($sub->find()) {
+-                      while ($sub->fetch()) {
+-                              if ($sub->token) {
+-                                      $other = Remote_profile::staticGet('id', $sub->subscriber);
+-                              } else {
+-                                      $other = User::staticGet('id', $sub->subscriber);
+-                              }
+-                              if (!$other) {
+-                                      common_debug('Got a bad subscription: '.print_r($sub,TRUE));
+-                                      continue;
+-                              }
+-                              if (array_key_exists($other->uri, $person)) {
+-                                      $person[$other->uri][0] = BOTH;
+-                              } else {
+-                                      $person[$other->uri] = array(LISTENER, $other);
+-                              }
+-                      }
+-              }
++        if ($sub->find()) {
++            while ($sub->fetch()) {
++                if ($sub->token) {
++                    $other = Remote_profile::staticGet('id', $sub->subscriber);
++                } else {
++                    $other = User::staticGet('id', $sub->subscriber);
++                }
++                if (!$other) {
++                    common_debug('Got a bad subscription: '.print_r($sub,TRUE));
++                    continue;
++                }
++                if (array_key_exists($other->uri, $person)) {
++                    $person[$other->uri][0] = BOTH;
++                } else {
++                    $person[$other->uri] = array(LISTENER, $other);
++                }
++            }
++        }
+hunk ./actions/foaf.php 156
+-              common_element_end('Person');
++        common_element_end('Person');
+hunk ./actions/foaf.php 158
+-              foreach ($person as $uri => $p) {
+-                      $foaf_url = NULL;
+-                      if ($p[1] instanceof User) {
+-                              $foaf_url = common_local_url('foaf', array('nickname' => $p[1]->nickname));
+-                      }
+-                      $profile = Profile::staticGet($p[1]->id);
+-                      common_element_start('Person', array('rdf:about' => $uri));
+-                      if ($p[0] == LISTENER || $p[0] == BOTH) {
+-                              common_element('knows', array('rdf:resource' => $user->uri));
+-                      }
+-                      $this->show_microblogging_account($profile, ($p[1] instanceof User) ?
+-                                                                                        common_root_url() : NULL);
+-                      if ($foaf_url) {
+-                              common_element('rdfs:seeAlso', array('rdf:resource' => $foaf_url));
+-                      }
+-                      common_element_end('Person');
+-                      if ($foaf_url) {
+-                              $this->show_ppd($foaf_url, $uri);
+-                      }
+-              }
++        foreach ($person as $uri => $p) {
++            $foaf_url = NULL;
++            if ($p[1] instanceof User) {
++                $foaf_url = common_local_url('foaf', array('nickname' => $p[1]->nickname));
++            }
++            $profile = Profile::staticGet($p[1]->id);
++            common_element_start('Person', array('rdf:about' => $uri));
++            if ($p[0] == LISTENER || $p[0] == BOTH) {
++                common_element('knows', array('rdf:resource' => $user->uri));
++            }
++            $this->show_microblogging_account($profile, ($p[1] instanceof User) ?
++                                              common_root_url() : NULL);
++            if ($foaf_url) {
++                common_element('rdfs:seeAlso', array('rdf:resource' => $foaf_url));
++            }
++            common_element_end('Person');
++            if ($foaf_url) {
++                $this->show_ppd($foaf_url, $uri);
++            }
++        }
+hunk ./actions/foaf.php 179
+-              common_element_end('rdf:RDF');
+-      }
++        common_element_end('rdf:RDF');
++    }
+hunk ./actions/foaf.php 182
+-      function show_ppd($foaf_url, $person_uri) {
+-              common_element_start('PersonalProfileDocument', array('rdf:about' => $foaf_url));
+-              common_element('maker', array('rdf:resource' => $person_uri));
+-              common_element('primaryTopic', array('rdf:resource' => $person_uri));
+-              common_element_end('PersonalProfileDocument');
+-      }
++    function show_ppd($foaf_url, $person_uri) {
++        common_element_start('PersonalProfileDocument', array('rdf:about' => $foaf_url));
++        common_element('maker', array('rdf:resource' => $person_uri));
++        common_element('primaryTopic', array('rdf:resource' => $person_uri));
++        common_element_end('PersonalProfileDocument');
++    }
+hunk ./actions/foaf.php 189
+-      function show_microblogging_account($profile, $service=NULL) {
+-              # Their account
+-              common_element_start('holdsAccount');
+-              common_element_start('OnlineAccount');
+-              if ($service) {
+-                      common_element('accountServiceHomepage', array('rdf:resource' =>
+-                                                                                                                 $service));
+-              }
+-              common_element('accountName', NULL, $profile->nickname);
+-              common_element('homepage', array('rdf:resource' => $profile->profileurl));
+-              common_element_end('OnlineAccount');
+-              common_element_end('holdsAccount');
+-      }
++    function show_microblogging_account($profile, $service=NULL) {
++        # Their account
++        common_element_start('holdsAccount');
++        common_element_start('OnlineAccount');
++        if ($service) {
++            common_element('accountServiceHomepage', array('rdf:resource' =>
++                                                           $service));
++        }
++        common_element('accountName', NULL, $profile->nickname);
++        common_element('homepage', array('rdf:resource' => $profile->profileurl));
++        common_element_end('OnlineAccount');
++        common_element_end('holdsAccount');
++    }
+hunk ./actions/imsettings.php 27
+-      function get_instructions() {
+-              return _('You can send and receive notices through Jabber/GTalk [instant messages](%%doc.im%%). Configure your address and settings below.');
+-      }
++    function get_instructions() {
++        return _('You can send and receive notices through Jabber/GTalk [instant messages](%%doc.im%%). Configure your address and settings below.');
++    }
+hunk ./actions/imsettings.php 31
+-      function show_form($msg=NULL, $success=false) {
+-              $user = common_current_user();
+-              $this->form_header(_('IM Settings'), $msg, $success);
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'imsettings',
+-                                                                                 'action' =>
+-                                                                                 common_local_url('imsettings')));
+-              common_hidden('token', common_session_token());
++    function show_form($msg=NULL, $success=false) {
++        $user = common_current_user();
++        $this->form_header(_('IM Settings'), $msg, $success);
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'imsettings',
++                                           'action' =>
++                                           common_local_url('imsettings')));
++        common_hidden('token', common_session_token());
+hunk ./actions/imsettings.php 40
+-              common_element('h2', NULL, _('Address'));
++        common_element('h2', NULL, _('Address'));
+hunk ./actions/imsettings.php 42
+-              if ($user->jabber) {
+-                      common_element_start('p');
+-                      common_element('span', 'address confirmed', $user->jabber);
+-                      common_element('span', 'input_instructions',
+-                                     _('Current confirmed Jabber/GTalk address.'));
+-                      common_hidden('jabber', $user->jabber);
+-                      common_element_end('p');
+-                      common_submit('remove', _('Remove'));
+-              } else {
+-                      $confirm = $this->get_confirmation();
+-                      if ($confirm) {
+-                              common_element_start('p');
+-                              common_element('span', 'address unconfirmed', $confirm->address);
+-                              common_element('span', 'input_instructions',
+-                                            sprintf(_('Awaiting confirmation on this address. Check your Jabber/GTalk account for a message with further instructions. (Did you add %s to your buddy list?)'), jabber_daemon_address()));
+-                              common_hidden('jabber', $confirm->address);
+-                              common_element_end('p');
+-                              common_submit('cancel', _('Cancel'));
+-                      } else {
+-                              common_input('jabber', _('IM Address'),
+-                                                      ($this->arg('jabber')) ? $this->arg('jabber') : NULL,
+-                                               sprintf(_('Jabber or GTalk address, like "UserName@example.org". First, make sure to add %s to your buddy list in your IM client or on GTalk.'), jabber_daemon_address()));
+-                              common_submit('add', _('Add'));
+-                      }
+-              }
++        if ($user->jabber) {
++            common_element_start('p');
++            common_element('span', 'address confirmed', $user->jabber);
++            common_element('span', 'input_instructions',
++                           _('Current confirmed Jabber/GTalk address.'));
++            common_hidden('jabber', $user->jabber);
++            common_element_end('p');
++            common_submit('remove', _('Remove'));
++        } else {
++            $confirm = $this->get_confirmation();
++            if ($confirm) {
++                common_element_start('p');
++                common_element('span', 'address unconfirmed', $confirm->address);
++                common_element('span', 'input_instructions',
++                                sprintf(_('Awaiting confirmation on this address. Check your Jabber/GTalk account for a message with further instructions. (Did you add %s to your buddy list?)'), jabber_daemon_address()));
++                common_hidden('jabber', $confirm->address);
++                common_element_end('p');
++                common_submit('cancel', _('Cancel'));
++            } else {
++                common_input('jabber', _('IM Address'),
++                             ($this->arg('jabber')) ? $this->arg('jabber') : NULL,
++                         sprintf(_('Jabber or GTalk address, like "UserName@example.org". First, make sure to add %s to your buddy list in your IM client or on GTalk.'), jabber_daemon_address()));
++                common_submit('add', _('Add'));
++            }
++        }
+hunk ./actions/imsettings.php 68
+-              common_element('h2', NULL, _('Preferences'));
++        common_element('h2', NULL, _('Preferences'));
+hunk ./actions/imsettings.php 70
+-              common_checkbox('jabbernotify',
+-                              _('Send me notices through Jabber/GTalk.'),
+-                              $user->jabbernotify);
+-              common_checkbox('updatefrompresence',
+-                              _('Post a notice when my Jabber/GTalk status changes.'),
+-                              $user->updatefrompresence);
+-              common_checkbox('jabberreplies',
+-                              _('Send me replies through Jabber/GTalk from people I\'m not subscribed to.'),
+-                              $user->jabberreplies);
+-              common_checkbox('jabbermicroid',
+-                              _('Publish a MicroID for my Jabber/GTalk address.'),
+-                              $user->jabbermicroid);
+-              common_submit('save', _('Save'));
++        common_checkbox('jabbernotify',
++                        _('Send me notices through Jabber/GTalk.'),
++                        $user->jabbernotify);
++        common_checkbox('updatefrompresence',
++                        _('Post a notice when my Jabber/GTalk status changes.'),
++                        $user->updatefrompresence);
++        common_checkbox('jabberreplies',
++                        _('Send me replies through Jabber/GTalk from people I\'m not subscribed to.'),
++                        $user->jabberreplies);
++        common_checkbox('jabbermicroid',
++                        _('Publish a MicroID for my Jabber/GTalk address.'),
++                        $user->jabbermicroid);
++        common_submit('save', _('Save'));
+hunk ./actions/imsettings.php 84
+-              common_element_end('form');
+-              common_show_footer();
+-      }
++        common_element_end('form');
++        common_show_footer();
++    }
+hunk ./actions/imsettings.php 88
+-      function get_confirmation() {
+-              $user = common_current_user();
+-              $confirm = new Confirm_address();
+-              $confirm->user_id = $user->id;
+-              $confirm->address_type = 'jabber';
+-              if ($confirm->find(TRUE)) {
+-                      return $confirm;
+-              } else {
+-                      return NULL;
+-              }
+-      }
++    function get_confirmation() {
++        $user = common_current_user();
++        $confirm = new Confirm_address();
++        $confirm->user_id = $user->id;
++        $confirm->address_type = 'jabber';
++        if ($confirm->find(TRUE)) {
++            return $confirm;
++        } else {
++            return NULL;
++        }
++    }
+hunk ./actions/imsettings.php 100
+-      function handle_post() {
++    function handle_post() {
+hunk ./actions/imsettings.php 102
+-              # CSRF protection
+-              $token = $this->trimmed('token');
+-              if (!$token || $token != common_session_token()) {
+-                      $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        # CSRF protection
++        $token = $this->trimmed('token');
++        if (!$token || $token != common_session_token()) {
++            $this->show_form(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/imsettings.php 109
+-              if ($this->arg('save')) {
+-                      $this->save_preferences();
+-              } else if ($this->arg('add')) {
+-                      $this->add_address();
+-              } else if ($this->arg('cancel')) {
+-                      $this->cancel_confirmation();
+-              } else if ($this->arg('remove')) {
+-                      $this->remove_address();
+-              } else {
+-                      $this->show_form(_('Unexpected form submission.'));
+-              }
+-      }
++        if ($this->arg('save')) {
++            $this->save_preferences();
++        } else if ($this->arg('add')) {
++            $this->add_address();
++        } else if ($this->arg('cancel')) {
++            $this->cancel_confirmation();
++        } else if ($this->arg('remove')) {
++            $this->remove_address();
++        } else {
++            $this->show_form(_('Unexpected form submission.'));
++        }
++    }
+hunk ./actions/imsettings.php 122
+-      function save_preferences() {
++    function save_preferences() {
+hunk ./actions/imsettings.php 124
+-              $jabbernotify = $this->boolean('jabbernotify');
+-              $updatefrompresence = $this->boolean('updatefrompresence');
+-              $jabberreplies = $this->boolean('jabberreplies');
+-              $jabbermicroid = $this->boolean('jabbermicroid');
++        $jabbernotify = $this->boolean('jabbernotify');
++        $updatefrompresence = $this->boolean('updatefrompresence');
++        $jabberreplies = $this->boolean('jabberreplies');
++        $jabbermicroid = $this->boolean('jabbermicroid');
+hunk ./actions/imsettings.php 129
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/imsettings.php 131
+-              assert(!is_null($user)); # should already be checked
++        assert(!is_null($user)); # should already be checked
+hunk ./actions/imsettings.php 133
+-              $user->query('BEGIN');
++        $user->query('BEGIN');
+hunk ./actions/imsettings.php 135
+-              $original = clone($user);
++        $original = clone($user);
+hunk ./actions/imsettings.php 137
+-              $user->jabbernotify = $jabbernotify;
+-              $user->updatefrompresence = $updatefrompresence;
+-              $user->jabberreplies = $jabberreplies;
+-              $user->jabbermicroid = $jabbermicroid;
++        $user->jabbernotify = $jabbernotify;
++        $user->updatefrompresence = $updatefrompresence;
++        $user->jabberreplies = $jabberreplies;
++        $user->jabbermicroid = $jabbermicroid;
+hunk ./actions/imsettings.php 142
+-              $result = $user->update($original);
++        $result = $user->update($original);
+hunk ./actions/imsettings.php 144
+-              if ($result === FALSE) {
+-                      common_log_db_error($user, 'UPDATE', __FILE__);
+-                      common_server_error(_('Couldn\'t update user.'));
+-                      return;
+-              }
++        if ($result === FALSE) {
++            common_log_db_error($user, 'UPDATE', __FILE__);
++            common_server_error(_('Couldn\'t update user.'));
++            return;
++        }
+hunk ./actions/imsettings.php 150
+-              $user->query('COMMIT');
++        $user->query('COMMIT');
+hunk ./actions/imsettings.php 152
+-              $this->show_form(_('Preferences saved.'), true);
+-      }
++        $this->show_form(_('Preferences saved.'), true);
++    }
+hunk ./actions/imsettings.php 155
+-      function add_address() {
++    function add_address() {
+hunk ./actions/imsettings.php 157
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/imsettings.php 159
+-              $jabber = $this->trimmed('jabber');
++        $jabber = $this->trimmed('jabber');
+hunk ./actions/imsettings.php 161
+-              # Some validation
++        # Some validation
+hunk ./actions/imsettings.php 163
+-              if (!$jabber) {
+-                      $this->show_form(_('No Jabber ID.'));
+-                      return;
+-              }
++        if (!$jabber) {
++            $this->show_form(_('No Jabber ID.'));
++            return;
++        }
+hunk ./actions/imsettings.php 168
+-              $jabber = jabber_normalize_jid($jabber);
++        $jabber = jabber_normalize_jid($jabber);
+hunk ./actions/imsettings.php 170
+-              if (!$jabber) {
+-                  $this->show_form(_('Cannot normalize that Jabber ID'));
+-                  return;
+-              }
+-              if (!jabber_valid_base_jid($jabber)) {
+-                  $this->show_form(_('Not a valid Jabber ID'));
+-                  return;
+-              } else if ($user->jabber == $jabber) {
+-                  $this->show_form(_('That is already your Jabber ID.'));
+-                  return;
+-              } else if ($this->jabber_exists($jabber)) {
+-                  $this->show_form(_('Jabber ID already belongs to another user.'));
+-                  return;
+-              }
++        if (!$jabber) {
++            $this->show_form(_('Cannot normalize that Jabber ID'));
++            return;
++        }
++        if (!jabber_valid_base_jid($jabber)) {
++            $this->show_form(_('Not a valid Jabber ID'));
++            return;
++        } else if ($user->jabber == $jabber) {
++            $this->show_form(_('That is already your Jabber ID.'));
++            return;
++        } else if ($this->jabber_exists($jabber)) {
++            $this->show_form(_('Jabber ID already belongs to another user.'));
++            return;
++        }
+hunk ./actions/imsettings.php 185
+-              $confirm = new Confirm_address();
+-              $confirm->address = $jabber;
+-              $confirm->address_type = 'jabber';
+-              $confirm->user_id = $user->id;
+-              $confirm->code = common_confirmation_code(64);
++          $confirm = new Confirm_address();
++           $confirm->address = $jabber;
++           $confirm->address_type = 'jabber';
++           $confirm->user_id = $user->id;
++           $confirm->code = common_confirmation_code(64);
+hunk ./actions/imsettings.php 191
+-              $result = $confirm->insert();
++        $result = $confirm->insert();
+hunk ./actions/imsettings.php 193
+-              if ($result === FALSE) {
+-                      common_log_db_error($confirm, 'INSERT', __FILE__);
+-                      common_server_error(_('Couldn\'t insert confirmation code.'));
+-                      return;
+-              }
++        if ($result === FALSE) {
++            common_log_db_error($confirm, 'INSERT', __FILE__);
++            common_server_error(_('Couldn\'t insert confirmation code.'));
++            return;
++        }
+hunk ./actions/imsettings.php 199
+-              if (!common_config('queue', 'enabled')) {
+-                      jabber_confirm_address($confirm->code,
+-                                                                 $user->nickname,
+-                                                                 $jabber);
+-              }
++        if (!common_config('queue', 'enabled')) {
++            jabber_confirm_address($confirm->code,
++                                   $user->nickname,
++                                   $jabber);
++        }
+hunk ./actions/imsettings.php 205
+-              $msg = sprintf(_('A confirmation code was sent to the IM address you added. You must approve %s for sending messages to you.'), jabber_daemon_address());
++        $msg = sprintf(_('A confirmation code was sent to the IM address you added. You must approve %s for sending messages to you.'), jabber_daemon_address());
+hunk ./actions/imsettings.php 207
+-              $this->show_form($msg, TRUE);
+-      }
++        $this->show_form($msg, TRUE);
++    }
+hunk ./actions/imsettings.php 210
+-      function cancel_confirmation() {
+-              $jabber = $this->arg('jabber');
+-              $confirm = $this->get_confirmation();
+-              if (!$confirm) {
+-                      $this->show_form(_('No pending confirmation to cancel.'));
+-                      return;
+-              }
+-              if ($confirm->address != $jabber) {
+-                      $this->show_form(_('That is the wrong IM address.'));
+-                      return;
+-              }
++    function cancel_confirmation() {
++        $jabber = $this->arg('jabber');
++        $confirm = $this->get_confirmation();
++        if (!$confirm) {
++            $this->show_form(_('No pending confirmation to cancel.'));
++            return;
++        }
++        if ($confirm->address != $jabber) {
++            $this->show_form(_('That is the wrong IM address.'));
++            return;
++        }
+hunk ./actions/imsettings.php 225
+-                      common_log_db_error($confirm, 'DELETE', __FILE__);
++            common_log_db_error($confirm, 'DELETE', __FILE__);
+hunk ./actions/imsettings.php 231
+-      }
++    }
+hunk ./actions/imsettings.php 233
+-      function remove_address() {
++    function remove_address() {
+hunk ./actions/imsettings.php 235
+-              $user = common_current_user();
+-              $jabber = $this->arg('jabber');
++        $user = common_current_user();
++        $jabber = $this->arg('jabber');
+hunk ./actions/imsettings.php 238
+-              # Maybe an old tab open...?
++        # Maybe an old tab open...?
+hunk ./actions/imsettings.php 240
+-              if ($user->jabber != $jabber) {
+-                  $this->show_form(_('That is not your Jabber ID.'));
+-                  return;
+-              }
++        if ($user->jabber != $jabber) {
++            $this->show_form(_('That is not your Jabber ID.'));
++            return;
++        }
+hunk ./actions/imsettings.php 245
+-              $user->query('BEGIN');
+-              $original = clone($user);
+-              $user->jabber = NULL;
+-              $result = $user->updateKeys($original);
+-              if (!$result) {
+-                      common_log_db_error($user, 'UPDATE', __FILE__);
+-                      common_server_error(_('Couldn\'t update user.'));
+-                      return;
+-              }
+-              $user->query('COMMIT');
++        $user->query('BEGIN');
++        $original = clone($user);
++        $user->jabber = NULL;
++        $result = $user->updateKeys($original);
++        if (!$result) {
++            common_log_db_error($user, 'UPDATE', __FILE__);
++            common_server_error(_('Couldn\'t update user.'));
++            return;
++        }
++        $user->query('COMMIT');
+hunk ./actions/imsettings.php 256
+-              # XXX: unsubscribe to the old address
++        # XXX: unsubscribe to the old address
+hunk ./actions/imsettings.php 258
+-              $this->show_form(_('The address was removed.'), TRUE);
+-      }
++        $this->show_form(_('The address was removed.'), TRUE);
++    }
+hunk ./actions/imsettings.php 261
+-      function jabber_exists($jabber) {
+-              $user = common_current_user();
+-              $other = User::staticGet('jabber', $jabber);
+-              if (!$other) {
+-                      return false;
+-              } else {
+-                      return $other->id != $user->id;
+-              }
+-      }
++    function jabber_exists($jabber) {
++        $user = common_current_user();
++        $other = User::staticGet('jabber', $jabber);
++        if (!$other) {
++            return false;
++        } else {
++            return $other->id != $user->id;
++        }
++    }
+hunk ./actions/invite.php 24
+-      function is_readonly() {
+-              return false;
+-      }
++    function is_readonly() {
++        return false;
++    }
+hunk ./actions/invite.php 30
+-              if (!common_logged_in()) {
+-                      $this->client_error(sprintf(_('You must be logged in to invite other users to use %s'),
+-                                                                              common_config('site', 'name')));
+-                      return;
+-              } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+-                      $this->send_invitations();
+-              } else {
+-                      $this->show_form();
+-              }
+-      }
++        if (!common_logged_in()) {
++            $this->client_error(sprintf(_('You must be logged in to invite other users to use %s'),
++                                        common_config('site', 'name')));
++            return;
++        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
++            $this->send_invitations();
++        } else {
++            $this->show_form();
++        }
++    }
+hunk ./actions/invite.php 41
+-      function send_invitations() {
++    function send_invitations() {
+hunk ./actions/invite.php 43
+-              # CSRF protection
+-              $token = $this->trimmed('token');
+-              if (!$token || $token != common_session_token()) {
+-                      $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        # CSRF protection
++        $token = $this->trimmed('token');
++        if (!$token || $token != common_session_token()) {
++            $this->show_form(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/invite.php 50
+-              $user = common_current_user();
+-              $profile = $user->getProfile();
++        $user = common_current_user();
++        $profile = $user->getProfile();
+hunk ./actions/invite.php 53
+-              $bestname = $profile->getBestName();
+-              $sitename = common_config('site', 'name');
+-              $personal = $this->trimmed('personal');
++        $bestname = $profile->getBestName();
++        $sitename = common_config('site', 'name');
++        $personal = $this->trimmed('personal');
+hunk ./actions/invite.php 57
+-              $addresses = explode("\n", $this->trimmed('addresses'));
++        $addresses = explode("\n", $this->trimmed('addresses'));
+hunk ./actions/invite.php 59
+-              foreach ($addresses as $email) {
+-                      $email = trim($email);
+-                      if (!Validate::email($email, true)) {
+-                              $this->show_form(sprintf(_('Invalid email address: %s'), $email));
+-                              return;
+-                      }
+-              }
++        foreach ($addresses as $email) {
++            $email = trim($email);
++            if (!Validate::email($email, true)) {
++                $this->show_form(sprintf(_('Invalid email address: %s'), $email));
++                return;
++            }
++        }
+hunk ./actions/invite.php 67
+-              $already = array();
+-              $subbed = array();
++        $already = array();
++        $subbed = array();
+hunk ./actions/invite.php 70
+-              foreach ($addresses as $email) {
+-                      $email = common_canonical_email($email);
+-                      $other = User::staticGet('email', $email);
+-                      if ($other) {
+-                              if ($user->isSubscribed($other)) {
+-                                      $already[] = $other;
+-                              } else {
+-                                      subs_subscribe_to($user, $other);
+-                                      $subbed[] = $other;
+-                              }
+-                      } else {
+-                              $sent[] = $email;
+-                              $this->send_invitation($email, $user, $personal);
+-                      }
+-              }
++        foreach ($addresses as $email) {
++            $email = common_canonical_email($email);
++            $other = User::staticGet('email', $email);
++            if ($other) {
++                if ($user->isSubscribed($other)) {
++                    $already[] = $other;
++                } else {
++                    subs_subscribe_to($user, $other);
++                    $subbed[] = $other;
++                }
++            } else {
++                $sent[] = $email;
++                $this->send_invitation($email, $user, $personal);
++            }
++        }
+hunk ./actions/invite.php 86
+-              common_show_header(_('Invitation(s) sent'));
+-              if ($already) {
+-                      common_element('p', NULL, _('You are already subscribed to these users:'));
+-                      common_element_start('ul');
+-                      foreach ($already as $other) {
+-                              common_element('li', NULL, sprintf(_('%s (%s)'), $other->nickname, $other->email));
+-                      }
+-                      common_element_end('ul');
+-              }
+-              if ($subbed) {
+-                      common_element('p', NULL, _('These people are already users and you were automatically subscribed to them:'));
+-                      common_element_start('ul');
+-                      foreach ($subbed as $other) {
+-                              common_element('li', NULL, sprintf(_('%s (%s)'), $other->nickname, $other->email));
+-                      }
+-                      common_element_end('ul');
+-              }
+-              if ($sent) {
+-                      common_element('p', NULL, _('Invitation(s) sent to the following people:'));
+-                      common_element_start('ul');
+-                      foreach ($sent as $other) {
+-                              common_element('li', NULL, $other);
+-                      }
+-                      common_element_end('ul');
+-                      common_element('p', NULL, _('You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!'));
+-              }
+-              common_show_footer();
+-      }
++        common_show_header(_('Invitation(s) sent'));
++        if ($already) {
++            common_element('p', NULL, _('You are already subscribed to these users:'));
++            common_element_start('ul');
++            foreach ($already as $other) {
++                common_element('li', NULL, sprintf(_('%s (%s)'), $other->nickname, $other->email));
++            }
++            common_element_end('ul');
++        }
++        if ($subbed) {
++            common_element('p', NULL, _('These people are already users and you were automatically subscribed to them:'));
++            common_element_start('ul');
++            foreach ($subbed as $other) {
++                common_element('li', NULL, sprintf(_('%s (%s)'), $other->nickname, $other->email));
++            }
++            common_element_end('ul');
++        }
++        if ($sent) {
++            common_element('p', NULL, _('Invitation(s) sent to the following people:'));
++            common_element_start('ul');
++            foreach ($sent as $other) {
++                common_element('li', NULL, $other);
++            }
++            common_element_end('ul');
++            common_element('p', NULL, _('You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!'));
++        }
++        common_show_footer();
++    }
+hunk ./actions/invite.php 115
+-      function show_top($error=NULL) {
+-              if ($error) {
+-                      common_element('p', 'error', $error);
+-              } else {
+-                      common_element_start('div', 'instructions');
+-                      common_element('p', NULL,
+-                                                 _('Use this form to invite your friends and colleagues to use this service.'));
+-                      common_element_end('div');
+-              }
+-      }
++    function show_top($error=NULL) {
++        if ($error) {
++            common_element('p', 'error', $error);
++        } else {
++            common_element_start('div', 'instructions');
++            common_element('p', NULL,
++                           _('Use this form to invite your friends and colleagues to use this service.'));
++            common_element_end('div');
++        }
++    }
+hunk ./actions/invite.php 126
+-      function show_form($error=NULL) {
++    function show_form($error=NULL) {
+hunk ./actions/invite.php 128
+-              global $config;
++        global $config;
+hunk ./actions/invite.php 130
+-              common_show_header(_('Invite new users'), NULL, $error, array($this, 'show_top'));
++        common_show_header(_('Invite new users'), NULL, $error, array($this, 'show_top'));
+hunk ./actions/invite.php 132
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'invite',
+-                                                                                 'action' => common_local_url('invite')));
+-              common_hidden('token', common_session_token());
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'invite',
++                                           'action' => common_local_url('invite')));
++        common_hidden('token', common_session_token());
+hunk ./actions/invite.php 137
+-              common_textarea('addresses', _('Email addresses'),
+-                                              $this->trimmed('addresses'),
+-                                              _('Addresses of friends to invite (one per line)'));
++        common_textarea('addresses', _('Email addresses'),
++                        $this->trimmed('addresses'),
++                        _('Addresses of friends to invite (one per line)'));
+hunk ./actions/invite.php 141
+-              common_textarea('personal', _('Personal message'),
+-                                              $this->trimmed('personal'),
+-                                              _('Optionally add a personal message to the invitation.'));
++        common_textarea('personal', _('Personal message'),
++                        $this->trimmed('personal'),
++                        _('Optionally add a personal message to the invitation.'));
+hunk ./actions/invite.php 145
+-              common_submit('send', _('Send'));
++        common_submit('send', _('Send'));
+hunk ./actions/invite.php 147
+-              common_element_end('form');
++        common_element_end('form');
+hunk ./actions/invite.php 149
+-              common_show_footer();
+-      }
++        common_show_footer();
++    }
+hunk ./actions/invite.php 152
+-      function send_invitation($email, $user, $personal) {
++    function send_invitation($email, $user, $personal) {
+hunk ./actions/invite.php 154
+-              $profile = $user->getProfile();
+-              $bestname = $profile->getBestName();
++        $profile = $user->getProfile();
++        $bestname = $profile->getBestName();
+hunk ./actions/invite.php 157
+-              $sitename = common_config('site', 'name');
++        $sitename = common_config('site', 'name');
+hunk ./actions/invite.php 159
+-              $invite = new Invitation();
++        $invite = new Invitation();
+hunk ./actions/invite.php 161
+-              $invite->address = $email;
+-              $invite->address_type = 'email';
+-              $invite->code = common_confirmation_code(128);
+-              $invite->user_id = $user->id;
+-              $invite->created = common_sql_now();
++        $invite->address = $email;
++        $invite->address_type = 'email';
++        $invite->code = common_confirmation_code(128);
++        $invite->user_id = $user->id;
++        $invite->created = common_sql_now();
+hunk ./actions/invite.php 167
+-              if (!$invite->insert()) {
+-                      common_log_db_error($invite, 'INSERT', __FILE__);
+-                      return false;
+-              }
++        if (!$invite->insert()) {
++            common_log_db_error($invite, 'INSERT', __FILE__);
++            return false;
++        }
+hunk ./actions/invite.php 172
+-              $recipients = array($email);
++        $recipients = array($email);
+hunk ./actions/invite.php 174
+-              $headers['From'] = mail_notify_from();
+-              $headers['To'] = $email;
+-              $headers['Subject'] = sprintf(_('%1$s has invited you to join them on %2$s'), $bestname, $sitename);
++        $headers['From'] = mail_notify_from();
++        $headers['To'] = $email;
++        $headers['Subject'] = sprintf(_('%1$s has invited you to join them on %2$s'), $bestname, $sitename);
+hunk ./actions/invite.php 178
+-              $body = sprintf(_("%1\$s has invited you to join them on %2\$s (%3\$s).\n\n".
+-                                                "%2\$s is a micro-blogging service that lets you keep up-to-date with people you know and people who interest you.\n\n".
+-                                                "You can also share news about yourself, your thoughts, or your life online with people who know about you. ".
+-                                                "It's also great for meeting new people who share your interests.\n\n".
+-                                                "%1\$s said:\n\n%4\$s\n\n".
+-                                                "You can see %1\$s's profile page on %2\$s here:\n\n".
+-                                                "%5\$s\n\n".
+-                                                "If you'd like to try the service, click on the link below to accept the invitation.\n\n".
+-                                                "%6\$s\n\n".
+-                                                "If not, you can ignore this message. Thanks for your patience and your time.\n\n".
+-                                                "Sincerely, %2\$s\n"),
+-                                              $bestname,
+-                                              $sitename,
+-                                              common_root_url(),
+-                                              $personal,
+-                                              common_local_url('showstream', array('nickname' => $user->nickname)),
+-                                              common_local_url('register', array('code' => $invite->code)));
++        $body = sprintf(_("%1\$s has invited you to join them on %2\$s (%3\$s).\n\n".
++                          "%2\$s is a micro-blogging service that lets you keep up-to-date with people you know and people who interest you.\n\n".
++                          "You can also share news about yourself, your thoughts, or your life online with people who know about you. ".
++                          "It's also great for meeting new people who share your interests.\n\n".
++                          "%1\$s said:\n\n%4\$s\n\n".
++                          "You can see %1\$s's profile page on %2\$s here:\n\n".
++                          "%5\$s\n\n".
++                          "If you'd like to try the service, click on the link below to accept the invitation.\n\n".
++                          "%6\$s\n\n".
++                          "If not, you can ignore this message. Thanks for your patience and your time.\n\n".
++                          "Sincerely, %2\$s\n"),
++                        $bestname,
++                        $sitename,
++                        common_root_url(),
++                        $personal,
++                        common_local_url('showstream', array('nickname' => $user->nickname)),
++                        common_local_url('register', array('code' => $invite->code)));
+hunk ./actions/invite.php 196
+-              mail_send($recipients, $headers, $body);
+-      }
++        mail_send($recipients, $headers, $body);
++    }
+hunk ./actions/login.php 24
+-      function is_readonly() {
+-              return true;
+-      }
++    function is_readonly() {
++        return true;
++    }
+hunk ./actions/login.php 28
+-      function handle($args) {
+-              parent::handle($args);
+-              if (common_is_real_login()) {
+-                      common_user_error(_('Already logged in.'));
+-              } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+-                      $this->check_login();
+-              } else {
+-                      $this->show_form();
+-              }
+-      }
++    function handle($args) {
++        parent::handle($args);
++        if (common_is_real_login()) {
++            common_user_error(_('Already logged in.'));
++        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
++            $this->check_login();
++        } else {
++            $this->show_form();
++        }
++    }
+hunk ./actions/login.php 39
+-      function check_login() {
+-              # XXX: login throttle
++    function check_login() {
++        # XXX: login throttle
+hunk ./actions/login.php 42
+-              # CSRF protection - token set in common_notice_form()
+-              $token = $this->trimmed('token');
+-              if (!$token || $token != common_session_token()) {
+-                      $this->client_error(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        # CSRF protection - token set in common_notice_form()
++        $token = $this->trimmed('token');
++        if (!$token || $token != common_session_token()) {
++            $this->client_error(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/login.php 49
+-              $nickname = common_canonical_nickname($this->trimmed('nickname'));
+-              $password = $this->arg('password');
+-              if (common_check_user($nickname, $password)) {
+-                      # success!
+-                      if (!common_set_user($nickname)) {
+-                              common_server_error(_('Error setting user.'));
+-                              return;
+-                      }
+-                      common_real_login(true);
+-                      if ($this->boolean('rememberme')) {
+-                              common_debug('Adding rememberme cookie for ' . $nickname);
+-                              common_rememberme();
+-                      }
+-                      # success!
+-                      $url = common_get_returnto();
+-                      if ($url) {
+-                              # We don't have to return to it again
+-                              common_set_returnto(NULL);
+-                      } else {
+-                              $url = common_local_url('all',
+-                                                                              array('nickname' =>
+-                                                                                        $nickname));
+-                      }
+-                      common_redirect($url);
+-              } else {
+-                      $this->show_form(_('Incorrect username or password.'));
+-                      return;
+-              }
++        $nickname = common_canonical_nickname($this->trimmed('nickname'));
++        $password = $this->arg('password');
++        if (common_check_user($nickname, $password)) {
++            # success!
++            if (!common_set_user($nickname)) {
++                common_server_error(_('Error setting user.'));
++                return;
++            }
++            common_real_login(true);
++            if ($this->boolean('rememberme')) {
++                common_debug('Adding rememberme cookie for ' . $nickname);
++                common_rememberme();
++            }
++            # success!
++            $url = common_get_returnto();
++            if ($url) {
++                # We don't have to return to it again
++                common_set_returnto(NULL);
++            } else {
++                $url = common_local_url('all',
++                                        array('nickname' =>
++                                              $nickname));
++            }
++            common_redirect($url);
++        } else {
++            $this->show_form(_('Incorrect username or password.'));
++            return;
++        }
+hunk ./actions/login.php 78
+-              # success!
+-              if (!common_set_user($user)) {
+-                      common_server_error(_('Error setting user.'));
+-                      return;
+-              }
++        # success!
++        if (!common_set_user($user)) {
++            common_server_error(_('Error setting user.'));
++            return;
++        }
+hunk ./actions/login.php 84
+-              common_real_login(true);
++        common_real_login(true);
+hunk ./actions/login.php 86
+-              if ($this->boolean('rememberme')) {
+-                      common_debug('Adding rememberme cookie for ' . $nickname);
+-                      common_rememberme($user);
+-              }
+-              # success!
+-              $url = common_get_returnto();
+-              if ($url) {
+-                      # We don't have to return to it again
+-                      common_set_returnto(NULL);
+-              } else {
+-                      $url = common_local_url('all',
+-                                                                      array('nickname' =>
+-                                                                                $nickname));
+-              }
+-              common_redirect($url);
+-      }
++        if ($this->boolean('rememberme')) {
++            common_debug('Adding rememberme cookie for ' . $nickname);
++            common_rememberme($user);
++        }
++        # success!
++        $url = common_get_returnto();
++        if ($url) {
++            # We don't have to return to it again
++            common_set_returnto(NULL);
++        } else {
++            $url = common_local_url('all',
++                                    array('nickname' =>
++                                          $nickname));
++        }
++        common_redirect($url);
++    }
+hunk ./actions/login.php 103
+-      function show_form($error=NULL) {
+-              common_show_header(_('Login'), NULL, $error, array($this, 'show_top'));
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'login',
+-                                                                                 'action' => common_local_url('login')));
+-              common_input('nickname', _('Nickname'));
+-              common_password('password', _('Password'));
+-              common_checkbox('rememberme', _('Remember me'), false,
+-                              _('Automatically login in the future; ' .
+-                                 'not for shared computers!'));
+-              common_submit('submit', _('Login'));
+-              common_hidden('token', common_session_token());
+-              common_element_end('form');
+-              common_element_start('p');
+-              common_element('a', array('href' => common_local_url('recoverpassword')),
+-                                         _('Lost or forgotten password?'));
+-              common_element_end('p');
+-              common_show_footer();
+-      }
++    function show_form($error=NULL) {
++        common_show_header(_('Login'), NULL, $error, array($this, 'show_top'));
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'login',
++                                           'action' => common_local_url('login')));
++        common_input('nickname', _('Nickname'));
++        common_password('password', _('Password'));
++        common_checkbox('rememberme', _('Remember me'), false,
++                        _('Automatically login in the future; ' .
++                           'not for shared computers!'));
++        common_submit('submit', _('Login'));
++        common_hidden('token', common_session_token());
++        common_element_end('form');
++        common_element_start('p');
++        common_element('a', array('href' => common_local_url('recoverpassword')),
++                       _('Lost or forgotten password?'));
++        common_element_end('p');
++        common_show_footer();
++    }
+hunk ./actions/login.php 123
+-      function get_instructions() {
+-              if (common_logged_in() &&
+-                      !common_is_real_login() &&
+-                      common_get_returnto())
+-              {
+-                      # rememberme logins have to reauthenticate before
+-                      # changing any profile settings (cookie-stealing protection)
+-                      return _('For security reasons, please re-enter your ' .
+-                                       'user name and password ' .
+-                                       'before changing your settings.');
+-              } else {
+-                      return _('Login with your username and password. ' .
+-                                       'Don\'t have a username yet? ' .
+-                                       '[Register](%%action.register%%) a new account, or ' .
+-                                       'try [OpenID](%%action.openidlogin%%). ');
+-              }
+-      }
++    function get_instructions() {
++        if (common_logged_in() &&
++            !common_is_real_login() &&
++            common_get_returnto())
++        {
++            # rememberme logins have to reauthenticate before
++            # changing any profile settings (cookie-stealing protection)
++            return _('For security reasons, please re-enter your ' .
++                     'user name and password ' .
++                     'before changing your settings.');
++        } else {
++            return _('Login with your username and password. ' .
++                     'Don\'t have a username yet? ' .
++                     '[Register](%%action.register%%) a new account, or ' .
++                     'try [OpenID](%%action.openidlogin%%). ');
++        }
++    }
+hunk ./actions/login.php 141
+-      function show_top($error=NULL) {
+-              if ($error) {
+-                      common_element('p', 'error', $error);
+-              } else {
+-                      $instr = $this->get_instructions();
+-                      $output = common_markup_to_html($instr);
+-                      common_element_start('div', 'instructions');
+-                      common_raw($output);
+-                      common_element_end('div');
+-              }
+-      }
++    function show_top($error=NULL) {
++        if ($error) {
++            common_element('p', 'error', $error);
++        } else {
++            $instr = $this->get_instructions();
++            $output = common_markup_to_html($instr);
++            common_element_start('div', 'instructions');
++            common_raw($output);
++            common_element_end('div');
++        }
++    }
+hunk ./actions/logout.php 25
+-      
+-      function is_readonly() {
+-              return true;
+-      }
+-      
+-      function handle($args) {
+-              parent::handle($args);
+-              if (!common_logged_in()) {
+-                      common_user_error(_('Not logged in.'));
+-              } else {
+-                      common_set_user(NULL);
+-                      common_real_login(false); # not logged in
+-                      common_forgetme(); # don't log back in!
+-                      common_redirect(common_local_url('public'));
+-              }
+-      }
++    
++    function is_readonly() {
++        return true;
++    }
++    
++    function handle($args) {
++        parent::handle($args);
++        if (!common_logged_in()) {
++            common_user_error(_('Not logged in.'));
++        } else {
++            common_set_user(NULL);
++            common_real_login(false); # not logged in
++            common_forgetme(); # don't log back in!
++            common_redirect(common_local_url('public'));
++        }
++    }
+hunk ./actions/microsummary.php 24
+-      function handle($args) {
++    function handle($args) {
+hunk ./actions/microsummary.php 26
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/microsummary.php 28
+-              $nickname = common_canonical_nickname($this->arg('nickname'));
+-              $user = User::staticGet('nickname', $nickname);
++        $nickname = common_canonical_nickname($this->arg('nickname'));
++        $user = User::staticGet('nickname', $nickname);
+hunk ./actions/microsummary.php 31
+-              if (!$user) {
+-                      $this->client_error(_('No such user'), 404);
+-                      return;
+-              }
+-              
+-              $notice = $user->getCurrentNotice();
+-              
+-              if (!$notice) {
+-                      $this->client_error(_('No current status'), 404);
+-              }
+-              
+-              header('Content-Type: text/plain');
+-              
+-              print $user->nickname . ': ' . $notice->content;
+-      }
++        if (!$user) {
++            $this->client_error(_('No such user'), 404);
++            return;
++        }
++        
++        $notice = $user->getCurrentNotice();
++        
++        if (!$notice) {
++            $this->client_error(_('No current status'), 404);
++        }
++        
++        header('Content-Type: text/plain');
++        
++        print $user->nickname . ': ' . $notice->content;
++    }
+hunk ./actions/newmessage.php 23
+-      
+-      function handle($args) {
+-              parent::handle($args);
++    
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/newmessage.php 27
+-              if (!common_logged_in()) {
+-                      $this->client_error(_('Not logged in.'), 403);
+-              } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+-                      $this->save_new_message();
+-              } else {
+-                      $this->show_form();
+-              }
+-      }
++        if (!common_logged_in()) {
++            $this->client_error(_('Not logged in.'), 403);
++        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
++            $this->save_new_message();
++        } else {
++            $this->show_form();
++        }
++    }
+hunk ./actions/newmessage.php 36
+-      function save_new_message() {
+-              $user = common_current_user();
+-              assert($user); # XXX: maybe an error instead...
++    function save_new_message() {
++        $user = common_current_user();
++        assert($user); # XXX: maybe an error instead...
+hunk ./actions/newmessage.php 40
+-              # CSRF protection
+-              
+-              $token = $this->trimmed('token');
+-              if (!$token || $token != common_session_token()) {
+-                      $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
+-              
+-              $content = $this->trimmed('content');
+-              $to = $this->trimmed('to');
+-              
+-              if (!$content) {
+-                      $this->show_form(_('No content!'));
+-                      return;
+-              } else {
+-                      $content_shortened = common_shorten_links($content);
++        # CSRF protection
++        
++        $token = $this->trimmed('token');
++        if (!$token || $token != common_session_token()) {
++            $this->show_form(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
++        
++        $content = $this->trimmed('content');
++        $to = $this->trimmed('to');
++        
++        if (!$content) {
++            $this->show_form(_('No content!'));
++            return;
++        } else {
++            $content_shortened = common_shorten_links($content);
+hunk ./actions/newmessage.php 57
+-                      if (mb_strlen($content_shortened) > 140) {
+-                              common_debug("Content = '$content_shortened'", __FILE__);
+-                              common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__);
+-                              $this->show_form(_('That\'s too long. Max message size is 140 chars.'));
+-                              return;
+-                      }
+-              }
++            if (mb_strlen($content_shortened) > 140) {
++                common_debug("Content = '$content_shortened'", __FILE__);
++                common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__);
++                $this->show_form(_('That\'s too long. Max message size is 140 chars.'));
++                return;
++            }
++        }
+hunk ./actions/newmessage.php 65
+-              $other = User::staticGet('id', $to);
+-              
+-              if (!$other) {
+-                      $this->show_form(_('No recipient specified.'));
+-                      return;
+-              } else if (!$user->mutuallySubscribed($other)) {
+-                      $this->client_error(_('You can\'t send a message to this user.'), 404);
+-                      return;
+-              } else if ($user->id == $other->id) {
+-                      $this->client_error(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'), 403);
+-                      return;
+-              }
+-              
+-              $message = Message::saveNew($user->id, $other->id, $content, 'web');
+-              
+-              if (is_string($message)) {
+-                      $this->show_form($message);
+-                      return;
+-              }
++        $other = User::staticGet('id', $to);
++        
++        if (!$other) {
++            $this->show_form(_('No recipient specified.'));
++            return;
++        } else if (!$user->mutuallySubscribed($other)) {
++            $this->client_error(_('You can\'t send a message to this user.'), 404);
++            return;
++        } else if ($user->id == $other->id) {
++            $this->client_error(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'), 403);
++            return;
++        }
++        
++        $message = Message::saveNew($user->id, $other->id, $content, 'web');
++        
++        if (is_string($message)) {
++            $this->show_form($message);
++            return;
++        }
+hunk ./actions/newmessage.php 85
+-              $this->notify($user, $other, $message);
++        $this->notify($user, $other, $message);
+hunk ./actions/newmessage.php 87
+-              $url = common_local_url('outbox', array('nickname' => $user->nickname));
++        $url = common_local_url('outbox', array('nickname' => $user->nickname));
+hunk ./actions/newmessage.php 89
+-              common_redirect($url, 303);
+-      }
++        common_redirect($url, 303);
++    }
+hunk ./actions/newmessage.php 92
+-      function show_top($params) {
++    function show_top($params) {
+hunk ./actions/newmessage.php 94
+-              list($content, $user, $to) = $params;
+-              
+-              assert(!is_null($user));
++        list($content, $user, $to) = $params;
++        
++        assert(!is_null($user));
+hunk ./actions/newmessage.php 98
+-              common_message_form($content, $user, $to);
+-      }
++        common_message_form($content, $user, $to);
++    }
+hunk ./actions/newmessage.php 101
+-      function show_form($msg=NULL) {
+-              
+-              $content = $this->trimmed('content');
+-              $user = common_current_user();
++    function show_form($msg=NULL) {
++        
++        $content = $this->trimmed('content');
++        $user = common_current_user();
+hunk ./actions/newmessage.php 106
+-              $to = $this->trimmed('to');
+-              
+-              $other = User::staticGet('id', $to);
++        $to = $this->trimmed('to');
++        
++        $other = User::staticGet('id', $to);
+hunk ./actions/newmessage.php 110
+-              if (!$other) {
+-                      $this->client_error(_('No such user'), 404);
+-                      return;
+-              }
++        if (!$other) {
++            $this->client_error(_('No such user'), 404);
++            return;
++        }
+hunk ./actions/newmessage.php 115
+-              if (!$user->mutuallySubscribed($other)) {
+-                      $this->client_error(_('You can\'t send a message to this user.'), 404);
+-                      return;
+-              }
+-              
+-              common_show_header(_('New message'), NULL,
+-                                                 array($content, $user, $other),
+-                                 array($this, 'show_top'));
+-              
+-              if ($msg) {
+-                      common_element('p', array('id'=>'error'), $msg);
+-              }
+-              
+-              common_show_footer();
+-      }
+-      
+-      function notify($from, $to, $message) {
+-              mail_notify_message($message, $from, $to);
+-              # XXX: Jabber, SMS notifications... probably queued
+-      }
++        if (!$user->mutuallySubscribed($other)) {
++            $this->client_error(_('You can\'t send a message to this user.'), 404);
++            return;
++        }
++        
++        common_show_header(_('New message'), NULL,
++                           array($content, $user, $other),
++                           array($this, 'show_top'));
++        
++        if ($msg) {
++            common_element('p', array('id'=>'error'), $msg);
++        }
++        
++        common_show_footer();
++    }
++    
++    function notify($from, $to, $message) {
++        mail_notify_message($message, $from, $to);
++        # XXX: Jabber, SMS notifications... probably queued
++    }
+hunk ./actions/newnotice.php 13
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+hunk ./actions/newnotice.php 17
+- * along with this program.    If not, see <http://www.gnu.org/licenses/>.
++ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+hunk ./actions/newnotice.php 26
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/newnotice.php 29
+-              if (!common_logged_in()) {
+-                      common_user_error(_('Not logged in.'));
+-              } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
++        if (!common_logged_in()) {
++            common_user_error(_('Not logged in.'));
++        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+hunk ./actions/newnotice.php 33
+-                      # CSRF protection - token set in common_notice_form()
+-                      $token = $this->trimmed('token');
+-                      if (!$token || $token != common_session_token()) {
+-                              $this->client_error(_('There was a problem with your session token. Try again, please.'));
+-                              return;
+-                      }
++            # CSRF protection - token set in common_notice_form()
++            $token = $this->trimmed('token');
++            if (!$token || $token != common_session_token()) {
++                $this->client_error(_('There was a problem with your session token. Try again, please.'));
++                return;
++            }
+hunk ./actions/newnotice.php 40
+-                      $this->save_new_notice();
+-              } else {
+-                      $this->show_form();
+-              }
+-      }
++            $this->save_new_notice();
++        } else {
++            $this->show_form();
++        }
++    }
+hunk ./actions/newnotice.php 46
+-      function save_new_notice() {
++    function save_new_notice() {
+hunk ./actions/newnotice.php 48
+-              $user = common_current_user();
+-              assert($user); # XXX: maybe an error instead...
+-              $content = $this->trimmed('status_textarea');
++        $user = common_current_user();
++        assert($user); # XXX: maybe an error instead...
++        $content = $this->trimmed('status_textarea');
+hunk ./actions/newnotice.php 52
+-              if (!$content) {
+-                      $this->show_form(_('No content!'));
+-                      return;
+-              } else {
+-                      $content_shortened = common_shorten_links($content);
++        if (!$content) {
++            $this->show_form(_('No content!'));
++            return;
++        } else {
++            $content_shortened = common_shorten_links($content);
+hunk ./actions/newnotice.php 58
+-                      if (mb_strlen($content_shortened) > 140) {
+-                              common_debug("Content = '$content_shortened'", __FILE__);
+-                              common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__);
+-                              $this->show_form(_('That\'s too long. Max notice size is 140 chars.'));
+-                              return;
+-                      }
+-              }
++            if (mb_strlen($content_shortened) > 140) {
++                common_debug("Content = '$content_shortened'", __FILE__);
++                common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__);
++                $this->show_form(_('That\'s too long. Max notice size is 140 chars.'));
++                return;
++            }
++        }
+hunk ./actions/newnotice.php 66
+-              $inter = new CommandInterpreter();
++        $inter = new CommandInterpreter();
+hunk ./actions/newnotice.php 68
+-              $cmd = $inter->handle_command($user, $content_shortened);
++        $cmd = $inter->handle_command($user, $content_shortened);
+hunk ./actions/newnotice.php 70
+-              if ($cmd) {
+-                      if ($this->boolean('ajax')) {
+-                              $cmd->execute(new AjaxWebChannel());
+-                      } else {
+-                              $cmd->execute(new WebChannel());
+-                      }
+-                      return;
+-              }
++        if ($cmd) {
++            if ($this->boolean('ajax')) {
++                $cmd->execute(new AjaxWebChannel());
++            } else {
++                $cmd->execute(new WebChannel());
++            }
++            return;
++        }
+hunk ./actions/newnotice.php 79
+-              $replyto = $this->trimmed('inreplyto');
++        $replyto = $this->trimmed('inreplyto');
+hunk ./actions/newnotice.php 81
+-              $notice = Notice::saveNew($user->id, $content, 'web', 1, ($replyto == 'false') ? NULL : $replyto);
++        $notice = Notice::saveNew($user->id, $content, 'web', 1, ($replyto == 'false') ? NULL : $replyto);
+hunk ./actions/newnotice.php 83
+-              if (is_string($notice)) {
+-                      $this->show_form($notice);
+-                      return;
+-              }
++        if (is_string($notice)) {
++            $this->show_form($notice);
++            return;
++        }
+hunk ./actions/newnotice.php 88
+-              common_broadcast_notice($notice);
++        common_broadcast_notice($notice);
+hunk ./actions/newnotice.php 90
+-              if ($this->boolean('ajax')) {
+-                      common_start_html('text/xml;charset=utf-8', true);
+-                      common_element_start('head');
+-                      common_element('title', null, _('Notice posted'));
+-                      common_element_end('head');
+-                      common_element_start('body');
+-                      $this->show_notice($notice);
+-                      common_element_end('body');
+-                      common_element_end('html');
+-              } else {
+-                      $returnto = $this->trimmed('returnto');
++        if ($this->boolean('ajax')) {
++            common_start_html('text/xml;charset=utf-8', true);
++            common_element_start('head');
++            common_element('title', null, _('Notice posted'));
++            common_element_end('head');
++            common_element_start('body');
++            $this->show_notice($notice);
++            common_element_end('body');
++            common_element_end('html');
++        } else {
++            $returnto = $this->trimmed('returnto');
+hunk ./actions/newnotice.php 102
+-                      if ($returnto) {
+-                              $url = common_local_url($returnto,
+-                                                                              array('nickname' => $user->nickname));
+-                      } else {
+-                              $url = common_local_url('shownotice',
+-                                                                              array('notice' => $notice->id));
+-                      }
+-                      common_redirect($url, 303);
+-              }
+-      }
++            if ($returnto) {
++                $url = common_local_url($returnto,
++                                        array('nickname' => $user->nickname));
++            } else {
++                $url = common_local_url('shownotice',
++                                        array('notice' => $notice->id));
++            }
++            common_redirect($url, 303);
++        }
++    }
+hunk ./actions/newnotice.php 113
+-      function ajax_error_msg($msg) {
+-              common_start_html('text/xml;charset=utf-8', true);
+-              common_element_start('head');
+-              common_element('title', null, _('Ajax Error'));
+-              common_element_end('head');
+-              common_element_start('body');
+-              common_element('p', array('id' => 'error'), $msg);
+-              common_element_end('body');
+-              common_element_end('html');
+-      }
++    function ajax_error_msg($msg) {
++        common_start_html('text/xml;charset=utf-8', true);
++        common_element_start('head');
++        common_element('title', null, _('Ajax Error'));
++        common_element_end('head');
++        common_element_start('body');
++        common_element('p', array('id' => 'error'), $msg);
++        common_element_end('body');
++        common_element_end('html');
++    }
+hunk ./actions/newnotice.php 124
+-      function show_top($content=NULL) {
+-              common_notice_form(NULL, $content);
+-      }
++    function show_top($content=NULL) {
++        common_notice_form(NULL, $content);
++    }
+hunk ./actions/newnotice.php 128
+-      function show_form($msg=NULL) {
+-              if ($msg && $this->boolean('ajax')) {
+-                      $this->ajax_error_msg($msg);
+-                      return;
+-              }
+-              $content = $this->trimmed('status_textarea');
+-              if (!$content) {
+-                      $replyto = $this->trimmed('replyto');
+-                      $profile = Profile::staticGet('nickname', $replyto);
+-                      if ($profile) {
+-                              $content = '@' . $profile->nickname . ' ';
+-                      }
+-              }
+-              common_show_header(_('New notice'), NULL, $content,
+-                                                 array($this, 'show_top'));
+-              if ($msg) {
+-                      common_element('p', array('id' => 'error'), $msg);
+-              }
+-              common_show_footer();
+-      }
++    function show_form($msg=NULL) {
++        if ($msg && $this->boolean('ajax')) {
++            $this->ajax_error_msg($msg);
++            return;
++        }
++        $content = $this->trimmed('status_textarea');
++        if (!$content) {
++            $replyto = $this->trimmed('replyto');
++            $profile = Profile::staticGet('nickname', $replyto);
++            if ($profile) {
++                $content = '@' . $profile->nickname . ' ';
++            }
++        }
++        common_show_header(_('New notice'), NULL, $content,
++                           array($this, 'show_top'));
++        if ($msg) {
++            common_element('p', array('id' => 'error'), $msg);
++        }
++        common_show_footer();
++    }
+hunk ./actions/newnotice.php 149
+-      function show_notice($notice) {
++    function show_notice($notice) {
+hunk ./actions/newnotice.php 152
+-      }
++    }
+hunk ./actions/noticesearch.php 28
+-      function get_instructions() {
+-              return _('Search for notices on %%site.name%% by their contents. Separate search terms by spaces; they must be 3 characters or more.');
+-      }
++    function get_instructions() {
++        return _('Search for notices on %%site.name%% by their contents. Separate search terms by spaces; they must be 3 characters or more.');
++    }
+hunk ./actions/noticesearch.php 32
+-      function get_title() {
+-              return _('Text search');
+-      }
++    function get_title() {
++        return _('Text search');
++    }
+hunk ./actions/noticesearch.php 36
+-      function show_results($q, $page) {
++    function show_results($q, $page) {
+hunk ./actions/noticesearch.php 38
+-              $notice = new Notice();
++        $notice = new Notice();
+hunk ./actions/noticesearch.php 40
+-              # lcase it for comparison
+-              $q = strtolower($q);
++        # lcase it for comparison
++        $q = strtolower($q);
+hunk ./actions/noticesearch.php 46
+-              # Ask for an extra to see if there's more.
+-              $search_engine->limit((($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
++        # Ask for an extra to see if there's more.
++        $search_engine->limit((($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
+hunk ./actions/noticesearch.php 53
+-              $cnt = $notice->find();
++            $cnt = $notice->find();
++        }
++        if ($cnt > 0) {
++            $terms = preg_split('/[\s,]+/', $q);
++            common_element_start('ul', array('id' => 'notices'));
++            for ($i = 0; $i < min($cnt, NOTICES_PER_PAGE); $i++) {
++                if ($notice->fetch()) {
++                    $this->show_notice($notice, $terms);
++                } else {
++                    // shouldn't happen!
++                    break;
++                }
++            }
++            common_element_end('ul');
++        } else {
++            common_element('p', 'error', _('No results'));
+hunk ./actions/noticesearch.php 70
+-              if ($cnt > 0) {
+-                      $terms = preg_split('/[\s,]+/', $q);
+-                      common_element_start('ul', array('id' => 'notices'));
+-                      for ($i = 0; $i < min($cnt, NOTICES_PER_PAGE); $i++) {
+-                              if ($notice->fetch()) {
+-                                      $this->show_notice($notice, $terms);
+-                              } else {
+-                                      // shouldn't happen!
+-                                      break;
+-                              }
+-                      }
+-                      common_element_end('ul');
+-              } else {
+-                      common_element('p', 'error', _('No results'));
+-              }
+hunk ./actions/noticesearch.php 71
+-              common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+-                                                $page, 'noticesearch', array('q' => $q));
+-      }
++        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
++                          $page, 'noticesearch', array('q' => $q));
++    }
+hunk ./actions/noticesearch.php 75
+-      function show_header($arr) {
+-              if ($arr) {
+-                      $q = $arr[0];
+-              }
+-              if ($q) {
+-                      common_element('link', array('rel' => 'alternate',
+-                                                                               'href' => common_local_url('noticesearchrss',
+-                                                                                                                                      array('q' => $q)),
+-                                                                               'type' => 'application/rss+xml',
+-                                                                               'title' => _('Search Stream Feed')));
+-              }
+-      }
++    function show_header($arr) {
++        if ($arr) {
++            $q = $arr[0];
++        }
++        if ($q) {
++            common_element('link', array('rel' => 'alternate',
++                                         'href' => common_local_url('noticesearchrss',
++                                                                    array('q' => $q)),
++                                         'type' => 'application/rss+xml',
++                                         'title' => _('Search Stream Feed')));
++        }
++    }
+hunk ./actions/noticesearch.php 88
+-      # XXX: refactor and combine with StreamAction::show_notice()
++    # XXX: refactor and combine with StreamAction::show_notice()
+hunk ./actions/noticesearch.php 90
+-      function show_notice($notice, $terms) {
+-              $profile = $notice->getProfile();
+-              if (!$profile) {
+-                      common_log_db_error($notice, 'SELECT', __FILE__);
+-                      $this->server_error(_('Notice without matching profile'));
+-                      return;
+-              }
+-              # XXX: RDFa
+-              common_element_start('li', array('class' => 'notice_single',
+-                                                                                'id' => 'notice-' . $notice->id));
+-              $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
+-              common_element_start('a', array('href' => $profile->profileurl));
+-              common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
+-                                                                      'class' => 'avatar stream',
+-                                                                      'width' => AVATAR_STREAM_SIZE,
+-                                                                      'height' => AVATAR_STREAM_SIZE,
+-                                                                      'alt' =>
+-                                                                      ($profile->fullname) ? $profile->fullname :
+-                                                                      $profile->nickname));
+-              common_element_end('a');
+-              common_element('a', array('href' => $profile->profileurl,
+-                                                                'class' => 'nickname'),
+-                                         $profile->nickname);
+-              # FIXME: URL, image, video, audio
+-              common_element_start('p', array('class' => 'content'));
+-              if ($notice->rendered) {
+-                      common_raw($this->highlight($notice->rendered, $terms));
+-              } else {
+-                      # XXX: may be some uncooked notices in the DB,
+-                      # we cook them right now. This should probably disappear in future
+-                      # versions (>> 0.4.x)
+-                      common_raw($this->highlight(common_render_content($notice->content, $notice), $terms));
+-              }
+-              common_element_end('p');
+-              $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
+-              common_element_start('p', 'time');
+-              common_element('a', array('class' => 'permalink',
+-                                                                'href' => $noticeurl,
+-                                                                'title' => common_exact_date($notice->created)),
+-                                         common_date_string($notice->created));
+-              if ($notice->reply_to) {
+-                      $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to));
+-                      common_text(' (');
+-                      common_element('a', array('class' => 'inreplyto',
+-                                                                        'href' => $replyurl),
+-                                                 _('in reply to...'));
+-                      common_text(')');
+-              }
+-              common_element_start('a',
+-                                                       array('href' => common_local_url('newnotice',
+-                                                                                                                        array('replyto' => $profile->nickname)),
+-                                                                 'onclick' => 'doreply("'.$profile->nickname.'"); return false',
+-                                                                 'title' => _('reply'),
+-                                                                 'class' => 'replybutton'));
+-              common_hidden('posttoken', common_session_token());
+-              
+-              common_raw('&rarr;');
+-              common_element_end('a');
+-              common_element_end('p');
+-              common_element_end('li');
+-      }
++    function show_notice($notice, $terms) {
++        $profile = $notice->getProfile();
++        if (!$profile) {
++            common_log_db_error($notice, 'SELECT', __FILE__);
++            $this->server_error(_('Notice without matching profile'));
++            return;
++        }
++        # XXX: RDFa
++        common_element_start('li', array('class' => 'notice_single',
++                                          'id' => 'notice-' . $notice->id));
++        $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
++        common_element_start('a', array('href' => $profile->profileurl));
++        common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
++                                    'class' => 'avatar stream',
++                                    'width' => AVATAR_STREAM_SIZE,
++                                    'height' => AVATAR_STREAM_SIZE,
++                                    'alt' =>
++                                    ($profile->fullname) ? $profile->fullname :
++                                    $profile->nickname));
++        common_element_end('a');
++        common_element('a', array('href' => $profile->profileurl,
++                                  'class' => 'nickname'),
++                       $profile->nickname);
++        # FIXME: URL, image, video, audio
++        common_element_start('p', array('class' => 'content'));
++        if ($notice->rendered) {
++            common_raw($this->highlight($notice->rendered, $terms));
++        } else {
++            # XXX: may be some uncooked notices in the DB,
++            # we cook them right now. This should probably disappear in future
++            # versions (>> 0.4.x)
++            common_raw($this->highlight(common_render_content($notice->content, $notice), $terms));
++        }
++        common_element_end('p');
++        $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
++        common_element_start('p', 'time');
++        common_element('a', array('class' => 'permalink',
++                                  'href' => $noticeurl,
++                                  'title' => common_exact_date($notice->created)),
++                       common_date_string($notice->created));
++        if ($notice->reply_to) {
++            $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to));
++            common_text(' (');
++            common_element('a', array('class' => 'inreplyto',
++                                      'href' => $replyurl),
++                           _('in reply to...'));
++            common_text(')');
++        }
++        common_element_start('a',
++                             array('href' => common_local_url('newnotice',
++                                                              array('replyto' => $profile->nickname)),
++                                   'onclick' => 'doreply("'.$profile->nickname.'"); return false',
++                                   'title' => _('reply'),
++                                   'class' => 'replybutton'));
++        common_hidden('posttoken', common_session_token());
++        
++        common_raw('&rarr;');
++        common_element_end('a');
++        common_element_end('p');
++        common_element_end('li');
++    }
+hunk ./actions/noticesearch.php 152
+-      function highlight($text, $terms) {
+-              /* Highligh serach terms */
+-              $pattern = '/('.implode('|',array_map('htmlspecialchars', $terms)).')/i';
+-              $result = preg_replace($pattern, '<strong>\\1</strong>', $text);
++    function highlight($text, $terms) {
++        /* Highligh serach terms */
++        $pattern = '/('.implode('|',array_map('htmlspecialchars', $terms)).')/i';
++        $result = preg_replace($pattern, '<strong>\\1</strong>', $text);
+hunk ./actions/noticesearch.php 157
+-              /* Remove highlighting from inside links, loop incase multiple highlights in links */
+-              $pattern = '/(href="[^"]*)<strong>('.implode('|',array_map('htmlspecialchars', $terms)).')<\/strong>([^"]*")/iU';
+-              do {
+-                      $result = preg_replace($pattern, '\\1\\2\\3', $result, -1, $count);
+-              } while ($count);
+-              return $result;
+-      }
++        /* Remove highlighting from inside links, loop incase multiple highlights in links */
++        $pattern = '/(href="[^"]*)<strong>('.implode('|',array_map('htmlspecialchars', $terms)).')<\/strong>([^"]*")/iU';
++        do {
++            $result = preg_replace($pattern, '\\1\\2\\3', $result, -1, $count);
++        } while ($count);
++        return $result;
++    }
+hunk ./actions/noticesearchrss.php 28
+-      function init() {
+-              return true;
+-      }
++    function init() {
++        return true;
++    }
+hunk ./actions/noticesearchrss.php 32
+-      function get_notices($limit=0) {
++    function get_notices($limit=0) {
+hunk ./actions/noticesearchrss.php 34
+-              $q = $this->trimmed('q');
+-              $notices = array();
++        $q = $this->trimmed('q');
++        $notices = array();
+hunk ./actions/noticesearchrss.php 37
+-              $notice = new Notice();
++        $notice = new Notice();
+hunk ./actions/noticesearchrss.php 39
+-              # lcase it for comparison
+-              $q = strtolower($q);
++        # lcase it for comparison
++        $q = strtolower($q);
+hunk ./actions/noticesearchrss.php 45
+-              if (!$limit) $limit = 20;
++        if (!$limit) $limit = 20;
+hunk ./actions/noticesearchrss.php 48
+-              $notice->find();
++        $notice->find();
+hunk ./actions/noticesearchrss.php 50
+-              while ($notice->fetch()) {
+-                      $notices[] = clone($notice);
+-              }
++        while ($notice->fetch()) {
++            $notices[] = clone($notice);
++        }
+hunk ./actions/noticesearchrss.php 54
+-              return $notices;
+-      }
++        return $notices;
++    }
+hunk ./actions/noticesearchrss.php 57
+-      function get_channel() {
+-              global $config;
+-              $q = $this->trimmed('q');
+-              $c = array('url' => common_local_url('noticesearchrss', array('q' => $q)),
+-                                 'title' => $config['site']['name'] . sprintf(_(' Search Stream for "%s"'), $q),
+-                                 'link' => common_local_url('noticesearch', array('q' => $q)),
+-                                 'description' => sprintf(_('All updates matching search term "%s"'), $q));
+-              return $c;
+-      }
++    function get_channel() {
++        global $config;
++        $q = $this->trimmed('q');
++        $c = array('url' => common_local_url('noticesearchrss', array('q' => $q)),
++                   'title' => $config['site']['name'] . sprintf(_(' Search Stream for "%s"'), $q),
++                   'link' => common_local_url('noticesearch', array('q' => $q)),
++                   'description' => sprintf(_('All updates matching search term "%s"'), $q));
++        return $c;
++    }
+hunk ./actions/noticesearchrss.php 67
+-      function get_image() {
+-              return NULL;
+-      }
++    function get_image() {
++        return NULL;
++    }
+hunk ./actions/nudge.php 26
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/nudge.php 29
+-              if (!common_logged_in()) {
+-                      $this->client_error(_('Not logged in.'));
+-                      return;
+-              }
++        if (!common_logged_in()) {
++            $this->client_error(_('Not logged in.'));
++            return;
++        }
+hunk ./actions/nudge.php 34
+-              $user = common_current_user();
+-              $other = User::staticGet('nickname', $this->arg('nickname'));
++        $user = common_current_user();
++        $other = User::staticGet('nickname', $this->arg('nickname'));
+hunk ./actions/nudge.php 37
+-              if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+-                      common_redirect(common_local_url('showstream', array('nickname' => $other->nickname)));
+-                      return;
+-              }
++        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
++            common_redirect(common_local_url('showstream', array('nickname' => $other->nickname)));
++            return;
++        }
+hunk ./actions/nudge.php 42
+-              # CSRF protection
++        # CSRF protection
+hunk ./actions/nudge.php 44
+-              $token = $this->trimmed('token');
+-              
+-              if (!$token || $token != common_session_token()) {
+-                      $this->client_error(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        $token = $this->trimmed('token');
++        
++        if (!$token || $token != common_session_token()) {
++            $this->client_error(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/nudge.php 56
+-              $this->notify($user, $other);
++        $this->notify($user, $other);
+hunk ./actions/nudge.php 58
+-              if ($this->boolean('ajax')) {
+-                      common_start_html('text/xml;charset=utf-8', true);
+-                      common_element_start('head');
+-                      common_element('title', null, _('Nudge sent'));
+-                      common_element_end('head');
+-                      common_element_start('body');
+-                      common_nudge_response();
+-                      common_element_end('body');
+-                      common_element_end('html');
+-              } else {
++        if ($this->boolean('ajax')) {
++            common_start_html('text/xml;charset=utf-8', true);
++            common_element_start('head');
++            common_element('title', null, _('Nudge sent'));
++            common_element_end('head');
++            common_element_start('body');
++            common_nudge_response();
++            common_element_end('body');
++            common_element_end('html');
++        } else {
+hunk ./actions/nudge.php 69
+-                      common_redirect(common_local_url('showstream',
+-                                                                                       array('nickname' => $other->nickname)));
+-              }
+-      }
++            common_redirect(common_local_url('showstream',
++                                             array('nickname' => $other->nickname)));
++        }
++    }
+hunk ./actions/nudge.php 74
+-      function notify($user, $other) {
+-              if ($other->id != $user->id) {
+-                      if ($other->email && $other->emailnotifynudge) {
+-                              mail_notify_nudge($user, $other);
+-                      }
+-                      # XXX: notify by IM
+-                      # XXX: notify by SMS
+-              }
+-      }
++    function notify($user, $other) {
++        if ($other->id != $user->id) {
++            if ($other->email && $other->emailnotifynudge) {
++                mail_notify_nudge($user, $other);
++            }
++            # XXX: notify by IM
++            # XXX: notify by SMS
++        }
++    }
+hunk ./actions/openidlogin.php 26
+-      function handle($args) {
+-              parent::handle($args);
+-              if (common_logged_in()) {
+-                      common_user_error(_('Already logged in.'));
+-              } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+-                      $openid_url = $this->trimmed('openid_url');
++    function handle($args) {
++        parent::handle($args);
++        if (common_logged_in()) {
++            common_user_error(_('Already logged in.'));
++        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
++            $openid_url = $this->trimmed('openid_url');
+hunk ./actions/openidlogin.php 33
+-                      # CSRF protection
+-                      $token = $this->trimmed('token');
+-                      if (!$token || $token != common_session_token()) {
+-                              $this->show_form(_('There was a problem with your session token. Try again, please.'), $openid_url);
+-                              return;
+-                      }
++            # CSRF protection
++            $token = $this->trimmed('token');
++            if (!$token || $token != common_session_token()) {
++                $this->show_form(_('There was a problem with your session token. Try again, please.'), $openid_url);
++                return;
++            }
+hunk ./actions/openidlogin.php 40
+-                      $rememberme = $this->boolean('rememberme');
+-                      
+-                      common_ensure_session();
+-                      
+-                      $_SESSION['openid_rememberme'] = $rememberme;
+-                      
+-                      $result = oid_authenticate($openid_url,
+-                                                                         'finishopenidlogin');
+-                      
+-                      if (is_string($result)) { # error message
+-                              unset($_SESSION['openid_rememberme']);
+-                              $this->show_form($result, $openid_url);
+-                      }
+-              } else {
+-                      $openid_url = oid_get_last();
+-                      $this->show_form(NULL, $openid_url);
+-              }
+-      }
++            $rememberme = $this->boolean('rememberme');
++            
++            common_ensure_session();
++            
++            $_SESSION['openid_rememberme'] = $rememberme;
++            
++            $result = oid_authenticate($openid_url,
++                                       'finishopenidlogin');
++            
++            if (is_string($result)) { # error message
++                unset($_SESSION['openid_rememberme']);
++                $this->show_form($result, $openid_url);
++            }
++        } else {
++            $openid_url = oid_get_last();
++            $this->show_form(NULL, $openid_url);
++        }
++    }
+hunk ./actions/openidlogin.php 59
+-      function get_instructions() {
+-              return _('Login with an [OpenID](%%doc.openid%%) account.');
+-      }
++    function get_instructions() {
++        return _('Login with an [OpenID](%%doc.openid%%) account.');
++    }
+hunk ./actions/openidlogin.php 63
+-      function show_top($error=NULL) {
+-              if ($error) {
+-                      common_element('div', array('class' => 'error'), $error);
+-              } else {
+-                      $instr = $this->get_instructions();
+-                      $output = common_markup_to_html($instr);
+-                      common_element_start('div', 'instructions');
+-                      common_raw($output);
+-                      common_element_end('div');
+-              }
+-      }
++    function show_top($error=NULL) {
++        if ($error) {
++            common_element('div', array('class' => 'error'), $error);
++        } else {
++            $instr = $this->get_instructions();
++            $output = common_markup_to_html($instr);
++            common_element_start('div', 'instructions');
++            common_raw($output);
++            common_element_end('div');
++        }
++    }
+hunk ./actions/openidlogin.php 75
+-      function show_form($error=NULL, $openid_url) {
+-              common_show_header(_('OpenID Login'), NULL, $error, array($this, 'show_top'));
+-              $formaction = common_local_url('openidlogin');
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'openidlogin',
+-                                                                                 'action' => $formaction));
+-              common_hidden('token', common_session_token());
+-              common_input('openid_url', _('OpenID URL'),
+-                                       $openid_url,
+-                                       _('Your OpenID URL'));
+-              common_checkbox('rememberme', _('Remember me'), false,
+-                              _('Automatically login in the future; ' .
+-                                 'not for shared computers!'));
+-              common_submit('submit', _('Login'));
+-              common_element_end('form');
+-              common_show_footer();
+-      }
++    function show_form($error=NULL, $openid_url) {
++        common_show_header(_('OpenID Login'), NULL, $error, array($this, 'show_top'));
++        $formaction = common_local_url('openidlogin');
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'openidlogin',
++                                           'action' => $formaction));
++        common_hidden('token', common_session_token());
++        common_input('openid_url', _('OpenID URL'),
++                     $openid_url,
++                     _('Your OpenID URL'));
++        common_checkbox('rememberme', _('Remember me'), false,
++                        _('Automatically login in the future; ' .
++                           'not for shared computers!'));
++        common_submit('submit', _('Login'));
++        common_element_end('form');
++        common_show_footer();
++    }
+hunk ./actions/openidsettings.php 27
+-      function get_instructions() {
+-              return _('[OpenID](%%doc.openid%%) lets you log into many sites ' .
+-                        ' with the same user account. '.
+-                        ' Manage your associated OpenIDs from here.');
+-      }
++    function get_instructions() {
++        return _('[OpenID](%%doc.openid%%) lets you log into many sites ' .
++                  ' with the same user account. '.
++                  ' Manage your associated OpenIDs from here.');
++    }
+hunk ./actions/openidsettings.php 33
+-      function show_form($msg=NULL, $success=false) {
++    function show_form($msg=NULL, $success=false) {
+hunk ./actions/openidsettings.php 35
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/openidsettings.php 37
+-              $this->form_header(_('OpenID settings'), $msg, $success);
++        $this->form_header(_('OpenID settings'), $msg, $success);
+hunk ./actions/openidsettings.php 39
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'openidadd',
+-                                                                                 'action' =>
+-                                                                                 common_local_url('openidsettings')));
+-              common_hidden('token', common_session_token());
+-              common_element('h2', NULL, _('Add OpenID'));
+-              common_element('p', NULL,
+-                                         _('If you want to add an OpenID to your account, ' .
+-                                                'enter it in the box below and click "Add".'));
+-              common_element_start('p');
+-              common_element('label', array('for' => 'openid_url'),
+-                                         _('OpenID URL'));
+-              common_element('input', array('name' => 'openid_url',
+-                                                                        'type' => 'text',
+-                                                                        'id' => 'openid_url'));
+-              common_element('input', array('type' => 'submit',
+-                                                                        'id' => 'add',
+-                                                                        'name' => 'add',
+-                                                                        'class' => 'submit',
+-                                                                        'value' => _('Add')));
+-              common_element_end('p');
+-              common_element_end('form');
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'openidadd',
++                                           'action' =>
++                                           common_local_url('openidsettings')));
++        common_hidden('token', common_session_token());
++        common_element('h2', NULL, _('Add OpenID'));
++        common_element('p', NULL,
++                       _('If you want to add an OpenID to your account, ' .
++                          'enter it in the box below and click "Add".'));
++        common_element_start('p');
++        common_element('label', array('for' => 'openid_url'),
++                       _('OpenID URL'));
++        common_element('input', array('name' => 'openid_url',
++                                      'type' => 'text',
++                                      'id' => 'openid_url'));
++        common_element('input', array('type' => 'submit',
++                                      'id' => 'add',
++                                      'name' => 'add',
++                                      'class' => 'submit',
++                                      'value' => _('Add')));
++        common_element_end('p');
++        common_element_end('form');
+hunk ./actions/openidsettings.php 62
+-              $oid = new User_openid();
+-              $oid->user_id = $user->id;
++        $oid = new User_openid();
++        $oid->user_id = $user->id;
+hunk ./actions/openidsettings.php 65
+-              $cnt = $oid->find();
++        $cnt = $oid->find();
+hunk ./actions/openidsettings.php 67
+-              if ($cnt > 0) {
++        if ($cnt > 0) {
+hunk ./actions/openidsettings.php 69
+-                      common_element('h2', NULL, _('Remove OpenID'));
++            common_element('h2', NULL, _('Remove OpenID'));
+hunk ./actions/openidsettings.php 71
+-                      if ($cnt == 1 && !$user->password) {
++            if ($cnt == 1 && !$user->password) {
+hunk ./actions/openidsettings.php 73
+-                              common_element('p', NULL,
+-                                                         _('Removing your only OpenID would make it impossible to log in! ' .
+-                                                                'If you need to remove it, add another OpenID first.'));
++                common_element('p', NULL,
++                               _('Removing your only OpenID would make it impossible to log in! ' .
++                                  'If you need to remove it, add another OpenID first.'));
+hunk ./actions/openidsettings.php 77
+-                              if ($oid->fetch()) {
+-                                      common_element_start('p');
+-                                      common_element('a', array('href' => $oid->canonical),
+-                                                                 $oid->display);
+-                                      common_element_end('p');
+-                              }
++                if ($oid->fetch()) {
++                    common_element_start('p');
++                    common_element('a', array('href' => $oid->canonical),
++                                   $oid->display);
++                    common_element_end('p');
++                }
+hunk ./actions/openidsettings.php 84
+-                      } else {
++            } else {
+hunk ./actions/openidsettings.php 86
+-                              common_element('p', NULL,
+-                                                         _('You can remove an OpenID from your account '.
+-                                                                'by clicking the button marked "Remove".'));
+-                              $idx = 0;
++                common_element('p', NULL,
++                               _('You can remove an OpenID from your account '.
++                                  'by clicking the button marked "Remove".'));
++                $idx = 0;
+hunk ./actions/openidsettings.php 91
+-                              while ($oid->fetch()) {
+-                                      common_element_start('form', array('method' => 'POST',
+-                                                                                                         'id' => 'openiddelete' . $idx,
+-                                                                                                         'action' =>
+-                                                                                                         common_local_url('openidsettings')));
+-                                      common_element_start('p');
+-                                      common_hidden('token', common_session_token());
+-                                      common_element('a', array('href' => $oid->canonical),
+-                                                                 $oid->display);
+-                                      common_element('input', array('type' => 'hidden',
+-                                                                                                'id' => 'openid_url'.$idx,
+-                                                                                                'name' => 'openid_url',
+-                                                                                                'value' => $oid->canonical));
+-                                      common_element('input', array('type' => 'submit',
+-                                                                                                'id' => 'remove'.$idx,
+-                                                                                                'name' => 'remove',
+-                                                                                                'class' => 'submit',
+-                                                                                                'value' => _('Remove')));
+-                                      common_element_end('p');
+-                                      common_element_end('form');
+-                                      $idx++;
+-                              }
+-                      }
+-              }
++                while ($oid->fetch()) {
++                    common_element_start('form', array('method' => 'POST',
++                                                       'id' => 'openiddelete' . $idx,
++                                                       'action' =>
++                                                       common_local_url('openidsettings')));
++                    common_element_start('p');
++                    common_hidden('token', common_session_token());
++                    common_element('a', array('href' => $oid->canonical),
++                                   $oid->display);
++                    common_element('input', array('type' => 'hidden',
++                                                  'id' => 'openid_url'.$idx,
++                                                  'name' => 'openid_url',
++                                                  'value' => $oid->canonical));
++                    common_element('input', array('type' => 'submit',
++                                                  'id' => 'remove'.$idx,
++                                                  'name' => 'remove',
++                                                  'class' => 'submit',
++                                                  'value' => _('Remove')));
++                    common_element_end('p');
++                    common_element_end('form');
++                    $idx++;
++                }
++            }
++        }
+hunk ./actions/openidsettings.php 116
+-              common_show_footer();
+-      }
++        common_show_footer();
++    }
+hunk ./actions/openidsettings.php 119
+-      function handle_post() {
+-              # CSRF protection
+-              $token = $this->trimmed('token');
+-              if (!$token || $token != common_session_token()) {
+-                      $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++    function handle_post() {
++        # CSRF protection
++        $token = $this->trimmed('token');
++        if (!$token || $token != common_session_token()) {
++            $this->show_form(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/openidsettings.php 127
+-              if ($this->arg('add')) {
+-                      $result = oid_authenticate($this->trimmed('openid_url'), 'finishaddopenid');
+-                      if (is_string($result)) { # error message
+-                              $this->show_form($result);
+-                      }
+-              } else if ($this->arg('remove')) {
+-                      $this->remove_openid();
+-              } else {
+-                      $this->show_form(_('Something weird happened.'));
+-              }
+-      }
++        if ($this->arg('add')) {
++            $result = oid_authenticate($this->trimmed('openid_url'), 'finishaddopenid');
++            if (is_string($result)) { # error message
++                $this->show_form($result);
++            }
++        } else if ($this->arg('remove')) {
++            $this->remove_openid();
++        } else {
++            $this->show_form(_('Something weird happened.'));
++        }
++    }
+hunk ./actions/openidsettings.php 139
+-      function remove_openid() {
++    function remove_openid() {
+hunk ./actions/openidsettings.php 141
+-              $openid_url = $this->trimmed('openid_url');
+-              $oid = User_openid::staticGet('canonical', $openid_url);
+-              if (!$oid) {
+-                      $this->show_form(_('No such OpenID.'));
+-                      return;
+-              }
+-              $cur = common_current_user();
+-              if (!$cur || $oid->user_id != $cur->id) {
+-                      $this->show_form(_('That OpenID does not belong to you.'));
+-                      return;
+-              }
+-              $oid->delete();
+-              $this->show_form(_('OpenID removed.'), true);
+-              return;
+-      }
++        $openid_url = $this->trimmed('openid_url');
++        $oid = User_openid::staticGet('canonical', $openid_url);
++        if (!$oid) {
++            $this->show_form(_('No such OpenID.'));
++            return;
++        }
++        $cur = common_current_user();
++        if (!$cur || $oid->user_id != $cur->id) {
++            $this->show_form(_('That OpenID does not belong to you.'));
++            return;
++        }
++        $oid->delete();
++        $this->show_form(_('OpenID removed.'), true);
++        return;
++    }
+hunk ./actions/opensearch.php 24
+-      function handle($args) {
++    function handle($args) {
+hunk ./actions/opensearch.php 26
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/opensearch.php 28
+-              $type = $this->trimmed('type');
++        $type = $this->trimmed('type');
+hunk ./actions/opensearch.php 30
+-              $short_name = '';
+-              if ($type == 'people') {
+-                      $type = 'peoplesearch';
+-                      $short_name = _('People Search');
+-              } else {
+-                      $short_name = _('Notice Search');
+-                      $type = 'noticesearch';
+-              }
++        $short_name = '';
++        if ($type == 'people') {
++            $type = 'peoplesearch';
++            $short_name = _('People Search');
++        } else {
++            $short_name = _('Notice Search');
++            $type = 'noticesearch';
++        }
+hunk ./actions/opensearch.php 39
+-              header('Content-Type: text/html');
++        header('Content-Type: text/html');
+hunk ./actions/opensearch.php 41
+-              common_start_xml();
+-              common_element_start('OpenSearchDescription', array('xmlns' => 'http://a9.com/-/spec/opensearch/1.1/'));
++        common_start_xml();
++        common_element_start('OpenSearchDescription', array('xmlns' => 'http://a9.com/-/spec/opensearch/1.1/'));
+hunk ./actions/opensearch.php 44
+-              $short_name =  common_config('site', 'name').' '.$short_name;
+-              common_element('ShortName', NULL, $short_name);
+-              common_element('Contact', NULL, common_config('site', 'email'));
+-              common_element('Url', array('type' => 'text/html', 'method' => 'get',
+-                                         'template' => str_replace('---', '{searchTerms}', common_local_url($type, array('q' => '---')))));
+-              common_element('Image', array('height' => 16, 'width' => 16, 'type' => 'image/vnd.microsoft.icon'), common_path('favicon.ico'));
+-              common_element('Image', array('height' => 50, 'width' => 50, 'type' => 'image/png'), theme_path('logo.png'));
+-              common_element('AdultContent', NULL, 'false');
+-              common_element('Language', NULL, common_language());
+-              common_element('OutputEncoding', NULL, 'UTF-8');
+-              common_element('InputEncoding', NULL, 'UTF-8');
++        $short_name =  common_config('site', 'name').' '.$short_name;
++        common_element('ShortName', NULL, $short_name);
++        common_element('Contact', NULL, common_config('site', 'email'));
++        common_element('Url', array('type' => 'text/html', 'method' => 'get',
++                       'template' => str_replace('---', '{searchTerms}', common_local_url($type, array('q' => '---')))));
++        common_element('Image', array('height' => 16, 'width' => 16, 'type' => 'image/vnd.microsoft.icon'), common_path('favicon.ico'));
++        common_element('Image', array('height' => 50, 'width' => 50, 'type' => 'image/png'), theme_path('logo.png'));
++        common_element('AdultContent', NULL, 'false');
++        common_element('Language', NULL, common_language());
++        common_element('OutputEncoding', NULL, 'UTF-8');
++        common_element('InputEncoding', NULL, 'UTF-8');
+hunk ./actions/opensearch.php 56
+-              common_element_end('OpenSearchDescription');
+-              common_end_xml();
+-      }
++        common_element_end('OpenSearchDescription');
++        common_end_xml();
++    }
+hunk ./actions/othersettings.php 26
+-      function get_instructions() {
+-              return _('Manage various other options.');
+-      }
++    function get_instructions() {
++        return _('Manage various other options.');
++    }
+hunk ./actions/othersettings.php 30
+-      function show_form($msg=NULL, $success=false) {
+-              $user = common_current_user();
++    function show_form($msg=NULL, $success=false) {
++        $user = common_current_user();
+hunk ./actions/othersettings.php 33
+-              $this->form_header(_('Other Settings'), $msg, $success);
++        $this->form_header(_('Other Settings'), $msg, $success);
+hunk ./actions/othersettings.php 35
+-              common_element('h2', NULL, _('URL Auto-shortening'));
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'othersettings',
+-                                                                                 'action' =>
+-                                                                                 common_local_url('othersettings')));
+-              common_hidden('token', common_session_token());
++        common_element('h2', NULL, _('URL Auto-shortening'));
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'othersettings',
++                                           'action' =>
++                                           common_local_url('othersettings')));
++        common_hidden('token', common_session_token());
+hunk ./actions/othersettings.php 42
+-              $services = array(
+-                      '' => 'None',
++        $services = array(
++            '' => 'None',
+hunk ./actions/othersettings.php 48
+-                      'tinyurl.com' => 'tinyurl.com',
+-                      'is.gd' => 'is.gd',
+-                      'snipr.com' => 'snipr.com',
+-                      'metamark.net' => 'metamark.net'
+-              );
++            'tinyurl.com' => 'tinyurl.com',
++            'is.gd' => 'is.gd',
++            'snipr.com' => 'snipr.com',
++            'metamark.net' => 'metamark.net'
++        );
+hunk ./actions/othersettings.php 54
+-              common_dropdown('urlshorteningservice', _('Service'), $services, _('Automatic shortening service to use.'), FALSE, $user->urlshorteningservice);
++        common_dropdown('urlshorteningservice', _('Service'), $services, _('Automatic shortening service to use.'), FALSE, $user->urlshorteningservice);
+hunk ./actions/othersettings.php 56
+-              common_submit('save', _('Save'));
++        common_submit('save', _('Save'));
+hunk ./actions/othersettings.php 58
+-              common_element_end('form');
++        common_element_end('form');
+hunk ./actions/othersettings.php 60
+-//            common_element('h2', NULL, _('Delete my account'));
+-//            $this->show_delete_form();
++//        common_element('h2', NULL, _('Delete my account'));
++//        $this->show_delete_form();
+hunk ./actions/othersettings.php 63
+-              common_show_footer();
+-      }
++        common_show_footer();
++    }
+hunk ./actions/othersettings.php 66
+-      function show_feeds_list($feeds) {
+-              common_element_start('div', array('class' => 'feedsdel'));
+-              common_element('p', null, 'Feeds:');
+-              common_element_start('ul', array('class' => 'xoxo'));
++    function show_feeds_list($feeds) {
++        common_element_start('div', array('class' => 'feedsdel'));
++        common_element('p', null, 'Feeds:');
++        common_element_start('ul', array('class' => 'xoxo'));
+hunk ./actions/othersettings.php 71
+-              foreach ($feeds as $key => $value) {
+-                      $this->common_feed_item($feeds[$key]);
+-              }
+-              common_element_end('ul');
+-              common_element_end('div');
+-      }
++        foreach ($feeds as $key => $value) {
++            $this->common_feed_item($feeds[$key]);
++        }
++        common_element_end('ul');
++        common_element_end('div');
++    }
+hunk ./actions/othersettings.php 79
+-      function common_feed_item($feed) {
++    function common_feed_item($feed) {
+hunk ./actions/othersettings.php 81
+-              $nickname = $user->nickname;
++        $nickname = $user->nickname;
+hunk ./actions/othersettings.php 83
+-              switch($feed['item']) {
+-                      case 'notices': default:
+-                              $feed_classname = $feed['type'];
+-                              $feed_mimetype = "application/".$feed['type']."+xml";
+-                              $feed_title = "$nickname's ".$feed['version']." notice feed";
+-                              $feed['textContent'] = "RSS";
+-                              break;
++        switch($feed['item']) {
++            case 'notices': default:
++                $feed_classname = $feed['type'];
++                $feed_mimetype = "application/".$feed['type']."+xml";
++                $feed_title = "$nickname's ".$feed['version']." notice feed";
++                $feed['textContent'] = "RSS";
++                break;
+hunk ./actions/othersettings.php 91
+-                      case 'foaf':
+-                              $feed_classname = "foaf";
+-                              $feed_mimetype = "application/".$feed['type']."+xml";
+-                              $feed_title = "$nickname's FOAF file";
+-                              $feed['textContent'] = "FOAF";
+-                              break;
+-              }
+-              common_element_start('li');
+-              common_element('a', array('href' => $feed['href'],
+-                                                                'class' => $feed_classname,
+-                                                                'type' => $feed_mimetype,
+-                                                                'title' => $feed_title),
+-                                                      $feed['textContent']);
+-              common_element_end('li');
+-      }
++            case 'foaf':
++                $feed_classname = "foaf";
++                $feed_mimetype = "application/".$feed['type']."+xml";
++                $feed_title = "$nickname's FOAF file";
++                $feed['textContent'] = "FOAF";
++                break;
++        }
++        common_element_start('li');
++        common_element('a', array('href' => $feed['href'],
++                                  'class' => $feed_classname,
++                                  'type' => $feed_mimetype,
++                                  'title' => $feed_title),
++                            $feed['textContent']);
++        common_element_end('li');
++    }
+hunk ./actions/othersettings.php 107
+-//    function show_delete_form() {
+-//            $user = common_current_user();
++//    function show_delete_form() {
++//        $user = common_current_user();
+hunk ./actions/othersettings.php 113
+-//            common_element_start('form', array('method' => 'POST',
+-//                                                                               'id' => 'delete',
+-//                                                                               'action' =>
+-//                                                                               common_local_url('deleteprofile')));
++//        common_element_start('form', array('method' => 'POST',
++//                                           'id' => 'delete',
++//                                           'action' =>
++//                                           common_local_url('deleteprofile')));
+hunk ./actions/othersettings.php 118
+-//            common_hidden('token', common_session_token());
++//        common_hidden('token', common_session_token());
+hunk ./actions/othersettings.php 121
+-//            $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('limit' => $notice_count, 'nickname' => $user->nickname)),
+-//                                                                                      'type' => 'rss',
+-//                                                                                      'version' => 'RSS 1.0',
+-//                                                                                      'item' => 'notices'),
+-//                                                                     1=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
+-//                                                                                      'type' => 'rdf',
+-//                                                                                      'version' => 'FOAF',
+-//                                                                                      'item' => 'foaf')));
++//        $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('limit' => $notice_count, 'nickname' => $user->nickname)),
++//                                              'type' => 'rss',
++//                                              'version' => 'RSS 1.0',
++//                                              'item' => 'notices'),
++//                                     1=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
++//                                              'type' => 'rdf',
++//                                              'version' => 'FOAF',
++//                                              'item' => 'foaf')));
+hunk ./actions/othersettings.php 130
+-//            common_submit('deleteaccount', _('Delete my account'));
+-//            common_element_end('form');
+-//    }
++//        common_submit('deleteaccount', _('Delete my account'));
++//        common_element_end('form');
++//    }
+hunk ./actions/othersettings.php 134
+-      function handle_post() {
++    function handle_post() {
+hunk ./actions/othersettings.php 136
+-              # CSRF protection
+-              $token = $this->trimmed('token');
+-              if (!$token || $token != common_session_token()) {
+-                      $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        # CSRF protection
++        $token = $this->trimmed('token');
++        if (!$token || $token != common_session_token()) {
++            $this->show_form(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/othersettings.php 143
+-              if ($this->arg('save')) {
+-                      $this->save_preferences();
+-              }else {
+-                      $this->show_form(_('Unexpected form submission.'));
+-              }
+-      }
++        if ($this->arg('save')) {
++            $this->save_preferences();
++        }else {
++            $this->show_form(_('Unexpected form submission.'));
++        }
++    }
+hunk ./actions/othersettings.php 150
+-      function save_preferences() {
++    function save_preferences() {
+hunk ./actions/othersettings.php 152
+-              $urlshorteningservice = $this->trimmed('urlshorteningservice');
++        $urlshorteningservice = $this->trimmed('urlshorteningservice');
+hunk ./actions/othersettings.php 154
+-              if (!is_null($urlshorteningservice) && strlen($urlshorteningservice) > 50) {
+-                      $this->show_form(_('URL shortening service is too long (max 50 chars).'));
+-                      return;
+-              }
++        if (!is_null($urlshorteningservice) && strlen($urlshorteningservice) > 50) {
++            $this->show_form(_('URL shortening service is too long (max 50 chars).'));
++            return;
++        }
+hunk ./actions/othersettings.php 159
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/othersettings.php 161
+-              assert(!is_null($user)); # should already be checked
++        assert(!is_null($user)); # should already be checked
+hunk ./actions/othersettings.php 163
+-              $user->query('BEGIN');
++        $user->query('BEGIN');
+hunk ./actions/othersettings.php 165
+-              $original = clone($user);
++        $original = clone($user);
+hunk ./actions/othersettings.php 167
+-              $user->urlshorteningservice = $urlshorteningservice;
++        $user->urlshorteningservice = $urlshorteningservice;
+hunk ./actions/othersettings.php 169
+-              $result = $user->update($original);
++        $result = $user->update($original);
+hunk ./actions/othersettings.php 171
+-              if ($result === FALSE) {
+-                      common_log_db_error($user, 'UPDATE', __FILE__);
+-                      common_server_error(_('Couldn\'t update user.'));
+-                      return;
+-              }
++        if ($result === FALSE) {
++            common_log_db_error($user, 'UPDATE', __FILE__);
++            common_server_error(_('Couldn\'t update user.'));
++            return;
++        }
+hunk ./actions/othersettings.php 177
+-              $user->query('COMMIT');
++        $user->query('COMMIT');
+hunk ./actions/othersettings.php 179
+-              $this->show_form(_('Preferences saved.'), true);
+-      }
++        $this->show_form(_('Preferences saved.'), true);
++    }
+hunk ./actions/peoplesearch.php 27
+-      function get_instructions() {
+-              return _('Search for people on %%site.name%% by their name, location, or interests. ' .
+-                                'Separate the terms by spaces; they must be 3 characters or more.');
+-      }
++    function get_instructions() {
++        return _('Search for people on %%site.name%% by their name, location, or interests. ' .
++                  'Separate the terms by spaces; they must be 3 characters or more.');
++    }
+hunk ./actions/peoplesearch.php 32
+-      function get_title() {
+-              return _('People search');
+-      }
++    function get_title() {
++        return _('People search');
++    }
+hunk ./actions/peoplesearch.php 36
+-      function show_results($q, $page) {
++    function show_results($q, $page) {
+hunk ./actions/peoplesearch.php 38
+-              $profile = new Profile();
++        $profile = new Profile();
+hunk ./actions/peoplesearch.php 40
+-              # lcase it for comparison
+-              $q = strtolower($q);
++        # lcase it for comparison
++        $q = strtolower($q);
+hunk ./actions/peoplesearch.php 46
+-              # Ask for an extra to see if there's more.
++        # Ask for an extra to see if there's more.
+hunk ./actions/peoplesearch.php 52
+-                  $cnt = $profile->find();
++            $cnt = $profile->find();
++        }
++        if ($cnt > 0) {
++            $terms = preg_split('/[\s,]+/', $q);
++            $results = new PeopleSearchResults($profile, $terms);
++            $results->show_list();
++        } else {
++            common_element('p', 'error', _('No results'));
+hunk ./actions/peoplesearch.php 61
+-              if ($cnt > 0) {
+-                      $terms = preg_split('/[\s,]+/', $q);
+-                      $results = new PeopleSearchResults($profile, $terms);
+-                      $results->show_list();
+-              } else {
+-                      common_element('p', 'error', _('No results'));
+-              }
+hunk ./actions/peoplesearch.php 62
+-              $profile->free();
+-              
+-              common_pagination($page > 1, $cnt > PROFILES_PER_PAGE,
+-                                                $page, 'peoplesearch', array('q' => $q));
+-      }
++        $profile->free();
++        
++        common_pagination($page > 1, $cnt > PROFILES_PER_PAGE,
++                          $page, 'peoplesearch', array('q' => $q));
++    }
+hunk ./actions/peoplesearch.php 71
+-      var $terms = NULL;
+-      var $pattern = NULL;
+-      
+-      function __construct($profile, $terms) {
+-              parent::__construct($profile);
+-              $this->terms = array_map('preg_quote', 
+-                                                               array_map('htmlspecialchars', $terms));
+-              $this->pattern = '/('.implode('|',$terms).')/i';
+-      }
+-      
+-      function highlight($text) {
+-              return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
+-      }
++    var $terms = NULL;
++    var $pattern = NULL;
++    
++    function __construct($profile, $terms) {
++        parent::__construct($profile);
++        $this->terms = array_map('preg_quote', 
++                                 array_map('htmlspecialchars', $terms));
++        $this->pattern = '/('.implode('|',$terms).')/i';
++    }
++    
++    function highlight($text) {
++        return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
++    }
+hunk ./actions/peopletag.php 25
+-      
+-      function handle($args) {
++    
++    function handle($args) {
+hunk ./actions/peopletag.php 28
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/peopletag.php 30
+-              $tag = $this->trimmed('tag');
+-              
+-              if (!common_valid_profile_tag($tag)) {
+-                      $this->client_error(sprintf(_('Not a valid people tag: %s'), $tag));
+-                      return;
+-              }
++        $tag = $this->trimmed('tag');
++        
++        if (!common_valid_profile_tag($tag)) {
++            $this->client_error(sprintf(_('Not a valid people tag: %s'), $tag));
++            return;
++        }
+hunk ./actions/peopletag.php 37
+-              $page = $this->trimmed('page');
+-              
+-              if (!$page) {
+-                      $page = 1;
+-              }
+-              
+-              # Looks like we're good; show the header
++        $page = $this->trimmed('page');
++        
++        if (!$page) {
++            $page = 1;
++        }
++        
++        # Looks like we're good; show the header
+hunk ./actions/peopletag.php 45
+-              common_show_header(sprintf(_('Users self-tagged with %s - page %d'), $tag, $page),
+-                                                 NULL, $tag, array($this, 'show_top'));
++        common_show_header(sprintf(_('Users self-tagged with %s - page %d'), $tag, $page),
++                           NULL, $tag, array($this, 'show_top'));
+hunk ./actions/peopletag.php 48
+-              $this->show_people($tag, $page);
++        $this->show_people($tag, $page);
+hunk ./actions/peopletag.php 50
+-              common_show_footer();
+-      }
++        common_show_footer();
++    }
+hunk ./actions/peopletag.php 53
+-      function show_people($tag, $page) {
+-              
+-              $profile = new Profile();
++    function show_people($tag, $page) {
++        
++        $profile = new Profile();
+hunk ./actions/peopletag.php 57
+-              $offset = ($page-1)*PROFILES_PER_PAGE;
+-              $limit = PROFILES_PER_PAGE + 1;
+-              
+-              if (common_config('db','type') == 'pgsql') {
+-                      $lim = ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+-              } else {
+-                      $lim = ' LIMIT ' . $offset . ', ' . $limit;
+-              }
++        $offset = ($page-1)*PROFILES_PER_PAGE;
++        $limit = PROFILES_PER_PAGE + 1;
++        
++        if (common_config('db','type') == 'pgsql') {
++            $lim = ' LIMIT ' . $limit . ' OFFSET ' . $offset;
++        } else {
++            $lim = ' LIMIT ' . $offset . ', ' . $limit;
++        }
+hunk ./actions/peopletag.php 66
+-              # XXX: memcached this
+-              
+-              $profile->query(sprintf('SELECT profile.* ' .
+-                                                              'FROM profile JOIN profile_tag ' .
+-                                                              'ON profile.id = profile_tag.tagger ' .
+-                                                              'WHERE profile_tag.tagger = profile_tag.tagged ' .
+-                                                              'AND tag = "%s" ' .
+-                                                              'ORDER BY profile_tag.modified DESC ' . 
+-                                                              $lim, $tag));
++        # XXX: memcached this
++        
++        $profile->query(sprintf('SELECT profile.* ' .
++                                'FROM profile JOIN profile_tag ' .
++                                'ON profile.id = profile_tag.tagger ' .
++                                'WHERE profile_tag.tagger = profile_tag.tagged ' .
++                                'AND tag = "%s" ' .
++                                'ORDER BY profile_tag.modified DESC ' . 
++                                $lim, $tag));
+hunk ./actions/peopletag.php 76
+-              $pl = new ProfileList($profile);
+-              $cnt = $pl->show_list();
+-              
+-              common_pagination($page > 1,
+-                                                $cnt > PROFILES_PER_PAGE,
+-                                                $page,
+-                                                $this->trimmed('action'),
+-                                                array('tag' => $tag));
+-      }
+-      
+-      function show_top($tag) {
+-              $instr = sprintf(_('These are users who have tagged themselves "%s" ' .
+-                                                 'to show a common interest, characteristic, hobby or job.'), $tag);
+-              common_element_start('div', 'instructions');
+-              common_element_start('p');
+-              common_text($instr);
+-              common_element_end('p');
+-              common_element_end('div');
+-      }
++        $pl = new ProfileList($profile);
++        $cnt = $pl->show_list();
++        
++        common_pagination($page > 1,
++                          $cnt > PROFILES_PER_PAGE,
++                          $page,
++                          $this->trimmed('action'),
++                          array('tag' => $tag));
++    }
++    
++    function show_top($tag) {
++        $instr = sprintf(_('These are users who have tagged themselves "%s" ' .
++                           'to show a common interest, characteristic, hobby or job.'), $tag);
++        common_element_start('div', 'instructions');
++        common_element_start('p');
++        common_text($instr);
++        common_element_end('p');
++        common_element_end('div');
++    }
+hunk ./actions/peopletag.php 96
+-      function get_title() {
+-              return NULL;
+-      }
++    function get_title() {
++        return NULL;
++    }
+hunk ./actions/peopletag.php 100
+-      function show_header($arr) {
+-              return;
+-      }
++    function show_header($arr) {
++        return;
++    }
+hunk ./actions/postnotice.php 25
+-      function handle($args) {
+-              parent::handle($args);
+-              try {
+-                      common_remove_magic_from_request();
+-                      $req = OAuthRequest::from_request();
+-                      # Note: server-to-server function!
+-                      $server = omb_oauth_server();
+-                      list($consumer, $token) = $server->verify_request($req);
+-                      if ($this->save_notice($req, $consumer, $token)) {
+-                              print "omb_version=".OMB_VERSION_01;
+-                      }
+-              } catch (OAuthException $e) {
+-                      common_server_error($e->getMessage());
+-                      return;
+-              }
+-      }
++    function handle($args) {
++        parent::handle($args);
++        try {
++            common_remove_magic_from_request();
++            $req = OAuthRequest::from_request();
++            # Note: server-to-server function!
++            $server = omb_oauth_server();
++            list($consumer, $token) = $server->verify_request($req);
++            if ($this->save_notice($req, $consumer, $token)) {
++                print "omb_version=".OMB_VERSION_01;
++            }
++        } catch (OAuthException $e) {
++            common_server_error($e->getMessage());
++            return;
++        }
++    }
+hunk ./actions/postnotice.php 42
+-      function save_notice(&$req, &$consumer, &$token) {
+-              $version = $req->get_parameter('omb_version');
+-              if ($version != OMB_VERSION_01) {
+-                      common_user_error(_('Unsupported OMB version'), 400);
+-                      return false;
+-              }
+-              # First, check to see
+-              $listenee =  $req->get_parameter('omb_listenee');
+-              $remote_profile = Remote_profile::staticGet('uri', $listenee);
+-              if (!$remote_profile) {
+-                      common_user_error(_('Profile unknown'), 403);
+-                      return false;
+-              }
+-              $sub = Subscription::staticGet('token', $token->key);
+-              if (!$sub) {
+-                      common_user_error(_('No such subscription'), 403);
+-                      return false;
+-              }
+-              $content = $req->get_parameter('omb_notice_content');
++    function save_notice(&$req, &$consumer, &$token) {
++        $version = $req->get_parameter('omb_version');
++        if ($version != OMB_VERSION_01) {
++            common_user_error(_('Unsupported OMB version'), 400);
++            return false;
++        }
++        # First, check to see
++        $listenee =  $req->get_parameter('omb_listenee');
++        $remote_profile = Remote_profile::staticGet('uri', $listenee);
++        if (!$remote_profile) {
++            common_user_error(_('Profile unknown'), 403);
++            return false;
++        }
++        $sub = Subscription::staticGet('token', $token->key);
++        if (!$sub) {
++            common_user_error(_('No such subscription'), 403);
++            return false;
++        }
++        $content = $req->get_parameter('omb_notice_content');
+hunk ./actions/postnotice.php 66
+-              $notice_uri = $req->get_parameter('omb_notice');
+-              if (!Validate::uri($notice_uri) &&
+-                      !common_valid_tag($notice_uri)) {
+-                      common_user_error(_('Invalid notice uri'), 400);
+-                      return false;
+-              }
+-              $notice_url = $req->get_parameter('omb_notice_url');
+-              if ($notice_url && !common_valid_http_url($notice_url)) {
+-                      common_user_error(_('Invalid notice url'), 400);
+-                      return false;
+-              }
+-              $notice = Notice::staticGet('uri', $notice_uri);
+-              if (!$notice) {
+-                      $notice = Notice::saveNew($remote_profile->id, $content, 'omb', false, 0, $notice_uri);
+-                      if (is_string($notice)) {
+-                              common_server_serror($notice, 500);
+-                              return false;
+-                      }
+-                      common_broadcast_notice($notice, true);
+-              }
+-              return true;
+-      }
++        $notice_uri = $req->get_parameter('omb_notice');
++        if (!Validate::uri($notice_uri) &&
++            !common_valid_tag($notice_uri)) {
++            common_user_error(_('Invalid notice uri'), 400);
++            return false;
++        }
++        $notice_url = $req->get_parameter('omb_notice_url');
++        if ($notice_url && !common_valid_http_url($notice_url)) {
++            common_user_error(_('Invalid notice url'), 400);
++            return false;
++        }
++        $notice = Notice::staticGet('uri', $notice_uri);
++        if (!$notice) {
++            $notice = Notice::saveNew($remote_profile->id, $content, 'omb', false, 0, $notice_uri);
++            if (is_string($notice)) {
++                common_server_serror($notice, 500);
++                return false;
++            }
++            common_broadcast_notice($notice, true);
++        }
++        return true;
++    }
+hunk ./actions/profilesettings.php 26
+-      function get_instructions() {
+-              return _('You can update your personal profile info here '.
+-                                'so people know more about you.');
+-      }
++    function get_instructions() {
++        return _('You can update your personal profile info here '.
++                  'so people know more about you.');
++    }
+hunk ./actions/profilesettings.php 31
+-      function show_form($msg=NULL, $success=false) {
+-              $this->form_header(_('Profile settings'), $msg, $success);
+-              $this->show_settings_form();
+-              common_element('h2', NULL, _('Avatar'));
+-              $this->show_avatar_form();
+-              common_element('h2', NULL, _('Change password'));
+-              $this->show_password_form();
+-//            common_element('h2', NULL, _('Delete my account'));
+-//            $this->show_delete_form();
+-              common_show_footer();
+-      }
++    function show_form($msg=NULL, $success=false) {
++        $this->form_header(_('Profile settings'), $msg, $success);
++        $this->show_settings_form();
++        common_element('h2', NULL, _('Avatar'));
++        $this->show_avatar_form();
++        common_element('h2', NULL, _('Change password'));
++        $this->show_password_form();
++//        common_element('h2', NULL, _('Delete my account'));
++//        $this->show_delete_form();
++        common_show_footer();
++    }
+hunk ./actions/profilesettings.php 43
+-      function handle_post() {
++    function handle_post() {
+hunk ./actions/profilesettings.php 45
+-              # CSRF protection
++        # CSRF protection
+hunk ./actions/profilesettings.php 47
+-              $token = $this->trimmed('token');
+-              if (!$token || $token != common_session_token()) {
+-                      $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        $token = $this->trimmed('token');
++        if (!$token || $token != common_session_token()) {
++            $this->show_form(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/profilesettings.php 53
+-              if ($this->arg('save')) {
+-                      $this->save_profile();
+-              } else if ($this->arg('upload')) {
+-                      $this->upload_avatar();
+-              } else if ($this->arg('changepass')) {
+-                      $this->change_password();
+-              }
++        if ($this->arg('save')) {
++            $this->save_profile();
++        } else if ($this->arg('upload')) {
++            $this->upload_avatar();
++        } else if ($this->arg('changepass')) {
++            $this->change_password();
++        }
+hunk ./actions/profilesettings.php 61
+-      }
++    }
+hunk ./actions/profilesettings.php 63
+-      function show_settings_form() {
++    function show_settings_form() {
+hunk ./actions/profilesettings.php 65
+-              $user = common_current_user();
+-              $profile = $user->getProfile();
++        $user = common_current_user();
++        $profile = $user->getProfile();
+hunk ./actions/profilesettings.php 68
+-              common_element_start('form', array('method' => 'POST',
+-                                                                                 'id' => 'profilesettings',
+-                                                                                 'action' =>
+-                                                                                 common_local_url('profilesettings')));
+-              common_hidden('token', common_session_token());
+-              
+-              # too much common patterns here... abstractable?
+-              
+-              common_input('nickname', _('Nickname'),
+-                                       ($this->arg('nickname')) ? $this->arg('nickname') : $profile->nickname,
+-                                       _('1-64 lowercase letters or numbers, no punctuation or spaces'));
+-              common_input('fullname', _('Full name'),
+-                                       ($this->arg('fullname')) ? $this->arg('fullname') : $profile->fullname);
+-              common_input('homepage', _('Homepage'),
+-                                       ($this->arg('homepage')) ? $this->arg('homepage') : $profile->homepage,
+-                                       _('URL of your homepage, blog, or profile on another site'));
+-              common_textarea('bio', _('Bio'),
+-                                              ($this->arg('bio')) ? $this->arg('bio') : $profile->bio,
+-                                              _('Describe yourself and your interests in 140 chars'));
+-              common_input('location', _('Location'),
+-                                       ($this->arg('location')) ? $this->arg('location') : $profile->location,
+-                                       _('Where you are, like "City, State (or Region), Country"'));
+-              common_input('tags', _('Tags'),
+-                                       ($this->arg('tags')) ? $this->arg('tags') : implode(' ', $user->getSelfTags()),
+-                                       _('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated'));
++        common_element_start('form', array('method' => 'POST',
++                                           'id' => 'profilesettings',
++                                           'action' =>
++                                           common_local_url('profilesettings')));
++        common_hidden('token', common_session_token());
++        
++        # too much common patterns here... abstractable?
++        
++        common_input('nickname', _('Nickname'),
++                     ($this->arg('nickname')) ? $this->arg('nickname') : $profile->nickname,
++                     _('1-64 lowercase letters or numbers, no punctuation or spaces'));
++        common_input('fullname', _('Full name'),
++                     ($this->arg('fullname')) ? $this->arg('fullname') : $profile->fullname);
++        common_input('homepage', _('Homepage'),
++                     ($this->arg('homepage')) ? $this->arg('homepage') : $profile->homepage,
++                     _('URL of your homepage, blog, or profile on another site'));
++        common_textarea('bio', _('Bio'),
++                        ($this->arg('bio')) ? $this->arg('bio') : $profile->bio,
++                        _('Describe yourself and your interests in 140 chars'));
++        common_input('location', _('Location'),
++                     ($this->arg('location')) ? $this->arg('location') : $profile->location,
++                     _('Where you are, like "City, State (or Region), Country"'));
++        common_input('tags', _('Tags'),
++                     ($this->arg('tags')) ? $this->arg('tags') : implode(' ', $user->getSelfTags()),
++                     _('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated'));
+hunk ./actions/profilesettings.php 94
+-              $language = common_language();
+-              common_dropdown('language', _('Language'), get_nice_language_list(), _('Preferred language'), TRUE, $language);
+-              $timezone = common_timezone();
+-              $timezones = array();
+-              foreach(DateTimeZone::listIdentifiers() as $k => $v) {
+-                      $timezones[$v] = $v;
+-              }
+-              common_dropdown('timezone', _('Timezone'), $timezones, _('What timezone are you normally in?'), TRUE, $timezone);
++        $language = common_language();
++        common_dropdown('language', _('Language'), get_nice_language_list(), _('Preferred language'), TRUE, $language);
++        $timezone = common_timezone();
++        $timezones = array();
++        foreach(DateTimeZone::listIdentifiers() as $k => $v) {
++            $timezones[$v] = $v;
++        }
++        common_dropdown('timezone', _('Timezone'), $timezones, _('What timezone are you normally in?'), TRUE, $timezone);
+hunk ./actions/profilesettings.php 103
+-              common_checkbox('autosubscribe', _('Automatically subscribe to whoever subscribes to me (best for non-humans)'),
+-                                              ($this->arg('autosubscribe')) ? $this->boolean('autosubscribe') : $user->autosubscribe);
++        common_checkbox('autosubscribe', _('Automatically subscribe to whoever subscribes to me (best for non-humans)'),
++                        ($this->arg('autosubscribe')) ? $this->boolean('autosubscribe') : $user->autosubscribe);
+hunk ./actions/profilesettings.php 106
+-              common_submit('save', _('Save'));
++        common_submit('save', _('Save'));
+hunk ./actions/profilesettings.php 108
+-              common_element_end('form');
++        common_element_end('form');
+hunk ./actions/profilesettings.php 111
+-      }
++    }
+hunk ./actions/profilesettings.php 113
+-      function show_avatar_form() {
++    function show_avatar_form() {
+hunk ./actions/profilesettings.php 115
+-              $user = common_current_user();
+-              $profile = $user->getProfile();
++        $user = common_current_user();
++        $profile = $user->getProfile();
+hunk ./actions/profilesettings.php 118
+-              if (!$profile) {
+-                      common_log_db_error($user, 'SELECT', __FILE__);
+-                      $this->server_error(_('User without matching profile'));
+-                      return;
+-              }
+-              
+-              $original = $profile->getOriginalAvatar();
++        if (!$profile) {
++            common_log_db_error($user, 'SELECT', __FILE__);
++            $this->server_error(_('User without matching profile'));
++            return;
++        }
++        
++        $original = $profile->getOriginalAvatar();
+hunk ./actions/profilesettings.php 127
+-              common_element_start('form', array('enctype' => 'multipart/form-data',
+-                                                                                 'method' => 'POST',
+-                                                                                 'id' => 'avatar',
+-                                                                                 'action' =>
+-                                                                                 common_local_url('profilesettings')));
+-              common_hidden('token', common_session_token());
++        common_element_start('form', array('enctype' => 'multipart/form-data',
++                                           'method' => 'POST',
++                                           'id' => 'avatar',
++                                           'action' =>
++                                           common_local_url('profilesettings')));
++        common_hidden('token', common_session_token());
+hunk ./actions/profilesettings.php 134
+-              if ($original) {
+-                      common_element('img', array('src' => $original->url,
+-                                                                              'class' => 'avatar original',
+-                                                                              'width' => $original->width,
+-                                                                              'height' => $original->height,
+-                                                                              'alt' => $user->nickname));
+-              }
++        if ($original) {
++            common_element('img', array('src' => $original->url,
++                                        'class' => 'avatar original',
++                                        'width' => $original->width,
++                                        'height' => $original->height,
++                                        'alt' => $user->nickname));
++        }
+hunk ./actions/profilesettings.php 142
+-              $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
++        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+hunk ./actions/profilesettings.php 144
+-              if ($avatar) {
+-                      common_element('img', array('src' => $avatar->url,
+-                                                                              'class' => 'avatar profile',
+-                                                                              'width' => AVATAR_PROFILE_SIZE,
+-                                                                              'height' => AVATAR_PROFILE_SIZE,
+-                                                                              'alt' => $user->nickname));
+-              }
++        if ($avatar) {
++            common_element('img', array('src' => $avatar->url,
++                                        'class' => 'avatar profile',
++                                        'width' => AVATAR_PROFILE_SIZE,
++                                        'height' => AVATAR_PROFILE_SIZE,
++                                        'alt' => $user->nickname));
++        }
+hunk ./actions/profilesettings.php 153
+-              common_element('input', array('name' => 'MAX_FILE_SIZE',
+-                                                                        'type' => 'hidden',
+-                                                                        'id' => 'MAX_FILE_SIZE',
+-                                                                        'value' => MAX_AVATAR_SIZE));
++        common_element('input', array('name' => 'MAX_FILE_SIZE',
++                                      'type' => 'hidden',
++                                      'id' => 'MAX_FILE_SIZE',
++                                      'value' => MAX_AVATAR_SIZE));
+hunk ./actions/profilesettings.php 158
+-              common_element_start('p');
++        common_element_start('p');
+hunk ./actions/profilesettings.php 161
+-              common_element('input', array('name' => 'avatarfile',
+-                                                                        'type' => 'file',
+-                                                                        'id' => 'avatarfile'));
+-              common_element_end('p');
++        common_element('input', array('name' => 'avatarfile',
++                                      'type' => 'file',
++                                      'id' => 'avatarfile'));
++        common_element_end('p');
+hunk ./actions/profilesettings.php 166
+-              common_submit('upload', _('Upload'));
+-              common_element_end('form');
++        common_submit('upload', _('Upload'));
++        common_element_end('form');
+hunk ./actions/profilesettings.php 169
+-      }
++    }
+hunk ./actions/profilesettings.php 171
+-      function show_password_form() {
++    function show_password_form() {
+hunk ./actions/profilesettings.php 173
+-              $user = common_current_user();
+-              common_element_start('form', array('method' => 'POST',
+-                                                                                 'id' => 'password',
+-                                                                                 'action' =>
+-                                                                                 common_local_url('profilesettings')));
++        $user = common_current_user();
++        common_element_start('form', array('method' => 'POST',
++                                           'id' => 'password',
++                                           'action' =>
++                                           common_local_url('profilesettings')));
+hunk ./actions/profilesettings.php 179
+-              common_hidden('token', common_session_token());
++        common_hidden('token', common_session_token());
+hunk ./actions/profilesettings.php 181
+-              # Users who logged in with OpenID won't have a pwd
+-              if ($user->password) {
+-                      common_password('oldpassword', _('Old password'));
+-              }
+-              common_password('newpassword', _('New password'),
+-                                              _('6 or more characters'));
+-              common_password('confirm', _('Confirm'),
+-                                              _('same as password above'));
+-              common_submit('changepass', _('Change'));
+-              common_element_end('form');
+-      }
++        # Users who logged in with OpenID won't have a pwd
++        if ($user->password) {
++            common_password('oldpassword', _('Old password'));
++        }
++        common_password('newpassword', _('New password'),
++                        _('6 or more characters'));
++        common_password('confirm', _('Confirm'),
++                        _('same as password above'));
++        common_submit('changepass', _('Change'));
++        common_element_end('form');
++    }
+hunk ./actions/profilesettings.php 193
+-      function save_profile() {
+-              $nickname = $this->trimmed('nickname');
+-              $fullname = $this->trimmed('fullname');
+-              $homepage = $this->trimmed('homepage');
+-              $bio = $this->trimmed('bio');
+-              $location = $this->trimmed('location');
+-              $autosubscribe = $this->boolean('autosubscribe');
+-              $language = $this->trimmed('language');
+-              $timezone = $this->trimmed('timezone');
+-              $tagstring = $this->trimmed('tags');
+-              
+-              # Some validation
++    function save_profile() {
++        $nickname = $this->trimmed('nickname');
++        $fullname = $this->trimmed('fullname');
++        $homepage = $this->trimmed('homepage');
++        $bio = $this->trimmed('bio');
++        $location = $this->trimmed('location');
++        $autosubscribe = $this->boolean('autosubscribe');
++        $language = $this->trimmed('language');
++        $timezone = $this->trimmed('timezone');
++        $tagstring = $this->trimmed('tags');
++        
++        # Some validation
+hunk ./actions/profilesettings.php 206
+-              if (!Validate::string($nickname, array('min_length' => 1,
+-                                                                                         'max_length' => 64,
+-                                                                                         'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+-                      $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
+-                      return;
+-              } else if (!User::allowed_nickname($nickname)) {
+-                      $this->show_form(_('Not a valid nickname.'));
+-                      return;
+-              } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
+-                                 !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) {
+-                      $this->show_form(_('Homepage is not a valid URL.'));
+-                      return;
+-              } else if (!is_null($fullname) && strlen($fullname) > 255) {
+-                      $this->show_form(_('Full name is too long (max 255 chars).'));
+-                      return;
+-              } else if (!is_null($bio) && strlen($bio) > 140) {
+-                      $this->show_form(_('Bio is too long (max 140 chars).'));
+-                      return;
+-              } else if (!is_null($location) && strlen($location) > 255) {
+-                      $this->show_form(_('Location is too long (max 255 chars).'));
+-                      return;
+-              }  else if (is_null($timezone) || !in_array($timezone, DateTimeZone::listIdentifiers())) {
+-                      $this->show_form(_('Timezone not selected.'));
+-                      return;
+-              } else if ($this->nickname_exists($nickname)) {
+-                      $this->show_form(_('Nickname already in use. Try another one.'));
+-                      return;
++        if (!Validate::string($nickname, array('min_length' => 1,
++                                               'max_length' => 64,
++                                               'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
++            $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
++            return;
++        } else if (!User::allowed_nickname($nickname)) {
++            $this->show_form(_('Not a valid nickname.'));
++            return;
++        } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
++                   !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) {
++            $this->show_form(_('Homepage is not a valid URL.'));
++            return;
++        } else if (!is_null($fullname) && strlen($fullname) > 255) {
++            $this->show_form(_('Full name is too long (max 255 chars).'));
++            return;
++        } else if (!is_null($bio) && strlen($bio) > 140) {
++            $this->show_form(_('Bio is too long (max 140 chars).'));
++            return;
++        } else if (!is_null($location) && strlen($location) > 255) {
++            $this->show_form(_('Location is too long (max 255 chars).'));
++            return;
++        }  else if (is_null($timezone) || !in_array($timezone, DateTimeZone::listIdentifiers())) {
++            $this->show_form(_('Timezone not selected.'));
++            return;
++        } else if ($this->nickname_exists($nickname)) {
++            $this->show_form(_('Nickname already in use. Try another one.'));
++            return;
+hunk ./actions/profilesettings.php 234
+-              $this->show_form(_('Language is too long (max 50 chars).'));
+-                      return;
+-              }
++            $this->show_form(_('Language is too long (max 50 chars).'));
++            return;
++        }
+hunk ./actions/profilesettings.php 238
+-              if ($tagstring) {
+-                      $tags = array_map('common_canonical_tag', preg_split('/[\s,]+/', $tagstring));
+-              } else {
+-                      $tags = array();
+-              }
+-                      
+-              foreach ($tags as $tag) {
+-                      if (!common_valid_profile_tag($tag)) {
+-                              $this->show_form(sprintf(_('Invalid tag: "%s"'), $tag));
+-                              return;
+-                      }
+-              }
+-              
+-              $user = common_current_user();
++        if ($tagstring) {
++            $tags = array_map('common_canonical_tag', preg_split('/[\s,]+/', $tagstring));
++        } else {
++            $tags = array();
++        }
++            
++        foreach ($tags as $tag) {
++            if (!common_valid_profile_tag($tag)) {
++                $this->show_form(sprintf(_('Invalid tag: "%s"'), $tag));
++                return;
++            }
++        }
++        
++        $user = common_current_user();
+hunk ./actions/profilesettings.php 253
+-              $user->query('BEGIN');
++        $user->query('BEGIN');
+hunk ./actions/profilesettings.php 255
+-              if ($user->nickname != $nickname ||
+-                      $user->language != $language ||
+-                      $user->timezone != $timezone) {
++        if ($user->nickname != $nickname ||
++            $user->language != $language ||
++            $user->timezone != $timezone) {
+hunk ./actions/profilesettings.php 259
+-                      common_debug('Updating user nickname from ' . $user->nickname . ' to ' . $nickname,
+-                                               __FILE__);
+-                      common_debug('Updating user language from ' . $user->language . ' to ' . $language,
+-                                               __FILE__);
+-                      common_debug('Updating user timezone from ' . $user->timezone . ' to ' . $timezone,
+-                                               __FILE__);
++            common_debug('Updating user nickname from ' . $user->nickname . ' to ' . $nickname,
++                         __FILE__);
++            common_debug('Updating user language from ' . $user->language . ' to ' . $language,
++                         __FILE__);
++            common_debug('Updating user timezone from ' . $user->timezone . ' to ' . $timezone,
++                         __FILE__);
+hunk ./actions/profilesettings.php 266
+-                      $original = clone($user);
++            $original = clone($user);
+hunk ./actions/profilesettings.php 268
+-                      $user->nickname = $nickname;
+-                      $user->language = $language;
+-                      $user->timezone = $timezone;
++            $user->nickname = $nickname;
++            $user->language = $language;
++            $user->timezone = $timezone;
+hunk ./actions/profilesettings.php 272
+-                      $result = $user->updateKeys($original);
++            $result = $user->updateKeys($original);
+hunk ./actions/profilesettings.php 274
+-                      if ($result === FALSE) {
+-                              common_log_db_error($user, 'UPDATE', __FILE__);
+-                              common_server_error(_('Couldn\'t update user.'));
+-                              return;
+-                      } else {
+-                              # Re-initialize language environment if it changed
+-                              common_init_language();
+-                      }
+-              }
++            if ($result === FALSE) {
++                common_log_db_error($user, 'UPDATE', __FILE__);
++                common_server_error(_('Couldn\'t update user.'));
++                return;
++            } else {
++                # Re-initialize language environment if it changed
++                common_init_language();
++            }
++        }
+hunk ./actions/profilesettings.php 284
+-              # XXX: XOR
++        # XXX: XOR
+hunk ./actions/profilesettings.php 286
+-              if ($user->autosubscribe ^ $autosubscribe) {
++        if ($user->autosubscribe ^ $autosubscribe) {
+hunk ./actions/profilesettings.php 288
+-                      $original = clone($user);
++            $original = clone($user);
+hunk ./actions/profilesettings.php 290
+-                      $user->autosubscribe = $autosubscribe;
++            $user->autosubscribe = $autosubscribe;
+hunk ./actions/profilesettings.php 292
+-                      $result = $user->update($original);
++            $result = $user->update($original);
+hunk ./actions/profilesettings.php 294
+-                      if ($result === FALSE) {
+-                              common_log_db_error($user, 'UPDATE', __FILE__);
+-                              common_server_error(_('Couldn\'t update user for autosubscribe.'));
+-                              return;
+-                      }
+-              }
++            if ($result === FALSE) {
++                common_log_db_error($user, 'UPDATE', __FILE__);
++                common_server_error(_('Couldn\'t update user for autosubscribe.'));
++                return;
++            }
++        }
+hunk ./actions/profilesettings.php 301
+-              $profile = $user->getProfile();
++        $profile = $user->getProfile();
+hunk ./actions/profilesettings.php 303
+-              $orig_profile = clone($profile);
++        $orig_profile = clone($profile);
+hunk ./actions/profilesettings.php 305
+-              $profile->nickname = $user->nickname;
+-              $profile->fullname = $fullname;
+-              $profile->homepage = $homepage;
+-              $profile->bio = $bio;
+-              $profile->location = $location;
+-              $profile->profileurl = common_profile_url($nickname);
++        $profile->nickname = $user->nickname;
++        $profile->fullname = $fullname;
++        $profile->homepage = $homepage;
++        $profile->bio = $bio;
++        $profile->location = $location;
++        $profile->profileurl = common_profile_url($nickname);
+hunk ./actions/profilesettings.php 312
+-              common_debug('Old profile: ' . common_log_objstring($orig_profile), __FILE__);
+-              common_debug('New profile: ' . common_log_objstring($profile), __FILE__);
++        common_debug('Old profile: ' . common_log_objstring($orig_profile), __FILE__);
++        common_debug('New profile: ' . common_log_objstring($profile), __FILE__);
+hunk ./actions/profilesettings.php 315
+-              $result = $profile->update($orig_profile);
++        $result = $profile->update($orig_profile);
+hunk ./actions/profilesettings.php 317
+-              if (!$result) {
+-                      common_log_db_error($profile, 'UPDATE', __FILE__);
+-                      common_server_error(_('Couldn\'t save profile.'));
+-                      return;
+-              }
++        if (!$result) {
++            common_log_db_error($profile, 'UPDATE', __FILE__);
++            common_server_error(_('Couldn\'t save profile.'));
++            return;
++        }
+hunk ./actions/profilesettings.php 323
+-              # Set the user tags
+-              
+-              $result = $user->setSelfTags($tags);
++        # Set the user tags
++        
++        $result = $user->setSelfTags($tags);
+hunk ./actions/profilesettings.php 327
+-              if (!$result) {
+-                      common_server_error(_('Couldn\'t save tags.'));
+-                      return;
+-              }
+-              
+-              $user->query('COMMIT');
++        if (!$result) {
++            common_server_error(_('Couldn\'t save tags.'));
++            return;
++        }
++        
++        $user->query('COMMIT');
+hunk ./actions/profilesettings.php 334
+-              common_broadcast_profile($profile);
++        common_broadcast_profile($profile);
+hunk ./actions/profilesettings.php 336
+-              $this->show_form(_('Settings saved.'), TRUE);
+-      }
++        $this->show_form(_('Settings saved.'), TRUE);
++    }
+hunk ./actions/profilesettings.php 340
+-      function upload_avatar() {
+-              switch ($_FILES['avatarfile']['error']) {
+-               case UPLOAD_ERR_OK: # success, jump out
+-                      break;
+-               case UPLOAD_ERR_INI_SIZE:
+-               case UPLOAD_ERR_FORM_SIZE:
+-                      $this->show_form(_('That file is too big.'));
+-                      return;
+-               case UPLOAD_ERR_PARTIAL:
+-                      @unlink($_FILES['avatarfile']['tmp_name']);
+-                      $this->show_form(_('Partial upload.'));
+-                      return;
+-               default:
+-                      $this->show_form(_('System error uploading file.'));
+-                      return;
+-              }
++    function upload_avatar() {
++        switch ($_FILES['avatarfile']['error']) {
++         case UPLOAD_ERR_OK: # success, jump out
++            break;
++         case UPLOAD_ERR_INI_SIZE:
++         case UPLOAD_ERR_FORM_SIZE:
++            $this->show_form(_('That file is too big.'));
++            return;
++         case UPLOAD_ERR_PARTIAL:
++            @unlink($_FILES['avatarfile']['tmp_name']);
++            $this->show_form(_('Partial upload.'));
++            return;
++         default:
++            $this->show_form(_('System error uploading file.'));
++            return;
++        }
+hunk ./actions/profilesettings.php 357
+-              $info = @getimagesize($_FILES['avatarfile']['tmp_name']);
++        $info = @getimagesize($_FILES['avatarfile']['tmp_name']);
+hunk ./actions/profilesettings.php 359
+-              if (!$info) {
+-                      @unlink($_FILES['avatarfile']['tmp_name']);
+-                      $this->show_form(_('Not an image or corrupt file.'));
+-                      return;
+-              }
++        if (!$info) {
++            @unlink($_FILES['avatarfile']['tmp_name']);
++            $this->show_form(_('Not an image or corrupt file.'));
++            return;
++        }
+hunk ./actions/profilesettings.php 365
+-              switch ($info[2]) {
+-               case IMAGETYPE_GIF:
+-               case IMAGETYPE_JPEG:
+-               case IMAGETYPE_PNG:
+-                      break;
+-               default:
+-                      $this->show_form(_('Unsupported image file format.'));
+-                      return;
+-              }
++        switch ($info[2]) {
++         case IMAGETYPE_GIF:
++         case IMAGETYPE_JPEG:
++         case IMAGETYPE_PNG:
++            break;
++         default:
++            $this->show_form(_('Unsupported image file format.'));
++            return;
++        }
+hunk ./actions/profilesettings.php 375
+-              $user = common_current_user();
+-              $profile = $user->getProfile();
++        $user = common_current_user();
++        $profile = $user->getProfile();
+hunk ./actions/profilesettings.php 378
+-              if ($profile->setOriginal($_FILES['avatarfile']['tmp_name'])) {
+-                      $this->show_form(_('Avatar updated.'), true);
+-              } else {
+-                      $this->show_form(_('Failed updating avatar.'));
+-              }
++        if ($profile->setOriginal($_FILES['avatarfile']['tmp_name'])) {
++            $this->show_form(_('Avatar updated.'), true);
++        } else {
++            $this->show_form(_('Failed updating avatar.'));
++        }
+hunk ./actions/profilesettings.php 384
+-              @unlink($_FILES['avatarfile']['tmp_name']);
+-      }
++        @unlink($_FILES['avatarfile']['tmp_name']);
++    }
+hunk ./actions/profilesettings.php 387
+-      function nickname_exists($nickname) {
+-              $user = common_current_user();
+-              $other = User::staticGet('nickname', $nickname);
+-              if (!$other) {
+-                      return false;
+-              } else {
+-                      return $other->id != $user->id;
+-              }
+-      }
++    function nickname_exists($nickname) {
++        $user = common_current_user();
++        $other = User::staticGet('nickname', $nickname);
++        if (!$other) {
++            return false;
++        } else {
++            return $other->id != $user->id;
++        }
++    }
+hunk ./actions/profilesettings.php 397
+-      function change_password() {
++    function change_password() {
+hunk ./actions/profilesettings.php 399
+-              $user = common_current_user();
+-              assert(!is_null($user)); # should already be checked
++        $user = common_current_user();
++        assert(!is_null($user)); # should already be checked
+hunk ./actions/profilesettings.php 402
+-              # FIXME: scrub input
++        # FIXME: scrub input
+hunk ./actions/profilesettings.php 404
+-              $newpassword = $this->arg('newpassword');
+-              $confirm = $this->arg('confirm');
+-              $token = $this->arg('token');
++        $newpassword = $this->arg('newpassword');
++        $confirm = $this->arg('confirm');
++        $token = $this->arg('token');
+hunk ./actions/profilesettings.php 408
+-              if (0 != strcmp($newpassword, $confirm)) {
+-                      $this->show_form(_('Passwords don\'t match.'));
+-                      return;
+-              }
++        if (0 != strcmp($newpassword, $confirm)) {
++            $this->show_form(_('Passwords don\'t match.'));
++            return;
++        }
+hunk ./actions/profilesettings.php 413
+-              if ($user->password) {
+-                      $oldpassword = $this->arg('oldpassword');
++        if ($user->password) {
++            $oldpassword = $this->arg('oldpassword');
+hunk ./actions/profilesettings.php 416
+-                      if (!common_check_user($user->nickname, $oldpassword)) {
+-                              $this->show_form(_('Incorrect old password'));
+-                              return;
+-                      }
+-              }
++            if (!common_check_user($user->nickname, $oldpassword)) {
++                $this->show_form(_('Incorrect old password'));
++                return;
++            }
++        }
+hunk ./actions/profilesettings.php 422
+-              $original = clone($user);
++        $original = clone($user);
+hunk ./actions/profilesettings.php 424
+-              $user->password = common_munge_password($newpassword, $user->id);
++        $user->password = common_munge_password($newpassword, $user->id);
+hunk ./actions/profilesettings.php 426
+-              $val = $user->validate();
+-              if ($val !== TRUE) {
+-                      $this->show_form(_('Error saving user; invalid.'));
+-                      return;
+-              }
++        $val = $user->validate();
++        if ($val !== TRUE) {
++            $this->show_form(_('Error saving user; invalid.'));
++            return;
++        }
+hunk ./actions/profilesettings.php 432
+-              if (!$user->update($original)) {
+-                      common_server_error(_('Can\'t save new password.'));
+-                      return;
+-              }
++        if (!$user->update($original)) {
++            common_server_error(_('Can\'t save new password.'));
++            return;
++        }
+hunk ./actions/profilesettings.php 437
+-              $this->show_form(_('Password saved.'), true);
+-      }
++        $this->show_form(_('Password saved.'), true);
++    }
+hunk ./actions/public.php 26
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/public.php 29
+-              $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
++        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+hunk ./actions/public.php 31
+-              header('X-XRDS-Location: '. common_local_url('publicxrds'));
++        header('X-XRDS-Location: '. common_local_url('publicxrds'));
+hunk ./actions/public.php 33
+-              common_show_header(_('Public timeline'),
+-                                                 array($this, 'show_header'), NULL,
+-                                                 array($this, 'show_top'));
++        common_show_header(_('Public timeline'),
++                           array($this, 'show_header'), NULL,
++                           array($this, 'show_top'));
+hunk ./actions/public.php 37
+-              # XXX: Public sidebar here?
++        # XXX: Public sidebar here?
+hunk ./actions/public.php 39
+-              $this->show_notices($page);
++        $this->show_notices($page);
+hunk ./actions/public.php 41
+-              common_show_footer();
+-      }
++        common_show_footer();
++    }
+hunk ./actions/public.php 44
+-      function show_top() {
+-              if (common_logged_in()) {
+-                      common_notice_form('public');
+-              } else {
+-                      $instr = $this->get_instructions();
+-                      $output = common_markup_to_html($instr);
+-                      common_element_start('div', 'instructions');
+-                      common_raw($output);
+-                      common_element_end('div');
+-              }
++    function show_top() {
++        if (common_logged_in()) {
++            common_notice_form('public');
++        } else {
++            $instr = $this->get_instructions();
++            $output = common_markup_to_html($instr);
++            common_element_start('div', 'instructions');
++            common_raw($output);
++            common_element_end('div');
++        }
+hunk ./actions/public.php 55
+-              $this->public_views_menu();
++        $this->public_views_menu();
+hunk ./actions/public.php 57
+-              $this->show_feeds_list(array(0=>array('href'=>common_local_url('publicrss'),
+-                                                                                        'type' => 'rss',
+-                                                                                        'version' => 'RSS 1.0',
+-                                                                                        'item' => 'publicrss'),
+-                                                                       1=>array('href'=>common_local_url('publicatom'),
+-                                                                                        'type' => 'atom',
+-                                                                                        'version' => 'Atom 1.0',
+-                                                                                        'item' => 'publicatom')));
+-      }
++        $this->show_feeds_list(array(0=>array('href'=>common_local_url('publicrss'),
++                                              'type' => 'rss',
++                                              'version' => 'RSS 1.0',
++                                              'item' => 'publicrss'),
++                                     1=>array('href'=>common_local_url('publicatom'),
++                                              'type' => 'atom',
++                                              'version' => 'Atom 1.0',
++                                              'item' => 'publicatom')));
++    }
+hunk ./actions/public.php 67
+-      function get_instructions() {
+-              return _('This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
+-                               'based on the Free Software [Laconica](http://laconi.ca/) tool. ' .
+-                               '[Join now](%%action.register%%) to share notices about yourself with friends, family, and colleagues! ([Read more](%%doc.help%%))');
+-      }
++    function get_instructions() {
++        return _('This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
++                 'based on the Free Software [Laconica](http://laconi.ca/) tool. ' .
++                 '[Join now](%%action.register%%) to share notices about yourself with friends, family, and colleagues! ([Read more](%%doc.help%%))');
++    }
+hunk ./actions/public.php 73
+-      function show_header() {
+-              common_element('link', array('rel' => 'alternate',
+-                                                                       'href' => common_local_url('publicrss'),
+-                                                                       'type' => 'application/rss+xml',
+-                                                                       'title' => _('Public Stream Feed')));
+-              # for client side of OpenID authentication
+-              common_element('meta', array('http-equiv' => 'X-XRDS-Location',
+-                                                                       'content' => common_local_url('publicxrds')));
+-      }
++    function show_header() {
++        common_element('link', array('rel' => 'alternate',
++                                     'href' => common_local_url('publicrss'),
++                                     'type' => 'application/rss+xml',
++                                     'title' => _('Public Stream Feed')));
++        # for client side of OpenID authentication
++        common_element('meta', array('http-equiv' => 'X-XRDS-Location',
++                                     'content' => common_local_url('publicxrds')));
++    }
+hunk ./actions/public.php 83
+-      function show_notices($page) {
++    function show_notices($page) {
+hunk ./actions/public.php 85
+-              $cnt = 0;
+-              $notice = Notice::publicStream(($page-1)*NOTICES_PER_PAGE,
+-                                                                         NOTICES_PER_PAGE + 1);
++        $cnt = 0;
++        $notice = Notice::publicStream(($page-1)*NOTICES_PER_PAGE,
++                                       NOTICES_PER_PAGE + 1);
+hunk ./actions/public.php 89
+-              if (!$notice) {
++        if (!$notice) {
+hunk ./actions/public.php 92
+-              }
++        }
+hunk ./actions/public.php 96
+-              common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+-                                                $page, 'public');
+-      }
++        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
++                          $page, 'public');
++    }
+hunk ./actions/publicrss.php 28
+-      function init() {
+-              return true;
+-      }
++    function init() {
++        return true;
++    }
+hunk ./actions/publicrss.php 32
+-      function get_notices($limit=0) {
+-              
+-              $notices = array();
+-              
+-              $notice = Notice::publicStream(0, ($limit == 0) ? 48 : $limit);
+-              
+-              while ($notice->fetch()) {
+-                      $notices[] = clone($notice);
+-              }
+-              
+-              return $notices;
+-      }
++    function get_notices($limit=0) {
++        
++        $notices = array();
++        
++        $notice = Notice::publicStream(0, ($limit == 0) ? 48 : $limit);
++        
++        while ($notice->fetch()) {
++            $notices[] = clone($notice);
++        }
++        
++        return $notices;
++    }
+hunk ./actions/publicrss.php 45
+-      function get_channel() {
+-              global $config;
+-              $c = array('url' => common_local_url('publicrss'),
+-                                 'title' => sprintf(_('%s Public Stream'), $config['site']['name']),
+-                                 'link' => common_local_url('public'),
+-                                 'description' => sprintf(_('All updates for %s'), $config['site']['name']));
+-              return $c;
+-      }
++    function get_channel() {
++        global $config;
++        $c = array('url' => common_local_url('publicrss'),
++                   'title' => sprintf(_('%s Public Stream'), $config['site']['name']),
++                   'link' => common_local_url('public'),
++                   'description' => sprintf(_('All updates for %s'), $config['site']['name']));
++        return $c;
++    }
+hunk ./actions/publicrss.php 54
+-      function get_image() {
+-              return NULL;
+-      }
++    function get_image() {
++        return NULL;
++    }
+hunk ./actions/publicxrds.php 28
+-      function is_readonly() {
+-              return true;
+-      }
++    function is_readonly() {
++        return true;
++    }
+hunk ./actions/publicxrds.php 32
+-      function handle($args) {
++    function handle($args) {
+hunk ./actions/publicxrds.php 34
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/publicxrds.php 36
+-              header('Content-Type: application/xrds+xml');
++        header('Content-Type: application/xrds+xml');
+hunk ./actions/publicxrds.php 38
+-              common_start_xml();
+-              common_element_start('XRDS', array('xmlns' => 'xri://$xrds'));
++        common_start_xml();
++        common_element_start('XRDS', array('xmlns' => 'xri://$xrds'));
+hunk ./actions/publicxrds.php 41
+-              common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
+-                                                                                'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
+-                                                                                'version' => '2.0'));
++        common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
++                                          'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
++                                          'version' => '2.0'));
+hunk ./actions/publicxrds.php 45
+-              common_element('Type', NULL, 'xri://$xrds*simple');
++        common_element('Type', NULL, 'xri://$xrds*simple');
+hunk ./actions/publicxrds.php 47
+-              foreach (array('finishopenidlogin', 'finishaddopenid', 'finishimmediate') as $finish) {
+-                      $this->show_service(Auth_OpenID_RP_RETURN_TO_URL_TYPE,
+-                                                              common_local_url($finish));
+-              }
++        foreach (array('finishopenidlogin', 'finishaddopenid', 'finishimmediate') as $finish) {
++            $this->show_service(Auth_OpenID_RP_RETURN_TO_URL_TYPE,
++                                common_local_url($finish));
++        }
+hunk ./actions/publicxrds.php 52
+-              common_element_end('XRD');
++        common_element_end('XRD');
+hunk ./actions/publicxrds.php 54
+-              common_element_end('XRDS');
+-              common_end_xml();
+-      }
++        common_element_end('XRDS');
++        common_end_xml();
++    }
+hunk ./actions/publicxrds.php 58
+-      function show_service($type, $uri, $params=NULL, $sigs=NULL, $localId=NULL) {
+-              common_element_start('Service');
+-              if ($uri) {
+-                      common_element('URI', NULL, $uri);
+-              }
+-              common_element('Type', NULL, $type);
+-              if ($params) {
+-                      foreach ($params as $param) {
+-                              common_element('Type', NULL, $param);
+-                      }
+-              }
+-              if ($sigs) {
+-                      foreach ($sigs as $sig) {
+-                              common_element('Type', NULL, $sig);
+-                      }
+-              }
+-              if ($localId) {
+-                      common_element('LocalID', NULL, $localId);
+-              }
+-              common_element_end('Service');
+-      }
++    function show_service($type, $uri, $params=NULL, $sigs=NULL, $localId=NULL) {
++        common_element_start('Service');
++        if ($uri) {
++            common_element('URI', NULL, $uri);
++        }
++        common_element('Type', NULL, $type);
++        if ($params) {
++            foreach ($params as $param) {
++                common_element('Type', NULL, $param);
++            }
++        }
++        if ($sigs) {
++            foreach ($sigs as $sig) {
++                common_element('Type', NULL, $sig);
++            }
++        }
++        if ($localId) {
++            common_element('LocalID', NULL, $localId);
++        }
++        common_element_end('Service');
++    }
+hunk ./actions/recoverpassword.php 31
+-                      $this->client_error(_('You are already logged in!'));
++            $this->client_error(_('You are already logged in!'));
+hunk ./actions/recoverpassword.php 34
+-              if ($this->arg('recover')) {
+-              $this->recover_password();
++            if ($this->arg('recover')) {
++                $this->recover_password();
+hunk ./actions/recoverpassword.php 37
+-              $this->reset_password();
+-                      } else {
+-                              $this->client_error(_('Unexpected form submission.'));
+-                      }
+-              } else {
+-                      if ($this->trimmed('code')) {
+-                      $this->check_code();
+-              } else {
+-                      $this->show_form();
+-                      }
+-              }
+-      }
++                $this->reset_password();
++            } else {
++                $this->client_error(_('Unexpected form submission.'));
++            }
++        } else {
++            if ($this->trimmed('code')) {
++                $this->check_code();
++            } else {
++                $this->show_form();
++            }
++        }
++    }
+hunk ./actions/recoverpassword.php 50
+-      function check_code() {
++    function check_code() {
+hunk ./actions/recoverpassword.php 52
+-              $code = $this->trimmed('code');
+-              $confirm = Confirm_address::staticGet('code', $code);
++        $code = $this->trimmed('code');
++        $confirm = Confirm_address::staticGet('code', $code);
+hunk ./actions/recoverpassword.php 55
+-              if (!$confirm) {
+-                      $this->client_error(_('No such recovery code.'));
+-                      return;
+-              }
+-              if ($confirm->address_type != 'recover') {
+-                      $this->client_error(_('Not a recovery code.'));
+-                      return;
+-              }
++        if (!$confirm) {
++            $this->client_error(_('No such recovery code.'));
++            return;
++        }
++        if ($confirm->address_type != 'recover') {
++            $this->client_error(_('Not a recovery code.'));
++            return;
++        }
+hunk ./actions/recoverpassword.php 64
+-              $user = User::staticGet($confirm->user_id);
++        $user = User::staticGet($confirm->user_id);
+hunk ./actions/recoverpassword.php 66
+-              if (!$user) {
+-                      $this->server_error(_('Recovery code for unknown user.'));
+-                      return;
+-              }
++        if (!$user) {
++            $this->server_error(_('Recovery code for unknown user.'));
++            return;
++        }
+hunk ./actions/recoverpassword.php 71
+-              $touched = strtotime($confirm->modified);
+-              $email = $confirm->address;
++        $touched = strtotime($confirm->modified);
++        $email = $confirm->address;
+hunk ./actions/recoverpassword.php 74
+-              # Burn this code
++        # Burn this code
+hunk ./actions/recoverpassword.php 76
+-              $result = $confirm->delete();
++        $result = $confirm->delete();
+hunk ./actions/recoverpassword.php 78
+-              if (!$result) {
+-                      common_log_db_error($confirm, 'DELETE', __FILE__);
+-                      common_server_error(_('Error with confirmation code.'));
+-                      return;
+-              }
++        if (!$result) {
++            common_log_db_error($confirm, 'DELETE', __FILE__);
++            common_server_error(_('Error with confirmation code.'));
++            return;
++        }
+hunk ./actions/recoverpassword.php 84
+-              # These should be reaped, but for now we just check mod time
+-              # Note: it's still deleted; let's avoid a second attempt!
++        # These should be reaped, but for now we just check mod time
++        # Note: it's still deleted; let's avoid a second attempt!
+hunk ./actions/recoverpassword.php 87
+-              if ((time() - $touched) > MAX_RECOVERY_TIME) {
+-                      common_log(LOG_WARNING, 
+-                                         'Attempted redemption on recovery code ' .
+-                                         'that is ' . $touched . ' seconds old. ');
+-                      $this->client_error(_('This confirmation code is too old. ' .
+-                                             'Please start again.'));
+-                      return;
+-              }
++        if ((time() - $touched) > MAX_RECOVERY_TIME) {
++            common_log(LOG_WARNING, 
++                       'Attempted redemption on recovery code ' .
++                       'that is ' . $touched . ' seconds old. ');
++            $this->client_error(_('This confirmation code is too old. ' .
++                                   'Please start again.'));
++            return;
++        }
+hunk ./actions/recoverpassword.php 96
+-              # If we used an outstanding confirmation to send the email,
+-              # it's been confirmed at this point.
++        # If we used an outstanding confirmation to send the email,
++        # it's been confirmed at this point.
+hunk ./actions/recoverpassword.php 99
+-              if (!$user->email) {
+-                      $orig = clone($user);
+-                      $user->email = $email;
+-                      $result = $user->updateKeys($orig);
+-                      if (!$result) {
+-                              common_log_db_error($user, 'UPDATE', __FILE__);
+-                              $this->server_error(_('Could not update user with confirmed email address.'));
+-                              return;
+-                      }
+-              }
++        if (!$user->email) {
++            $orig = clone($user);
++            $user->email = $email;
++            $result = $user->updateKeys($orig);
++            if (!$result) {
++                common_log_db_error($user, 'UPDATE', __FILE__);
++                $this->server_error(_('Could not update user with confirmed email address.'));
++                return;
++            }
++        }
+hunk ./actions/recoverpassword.php 110
+-              # Success!
++        # Success!
+hunk ./actions/recoverpassword.php 112
+-              $this->set_temp_user($user);
+-              $this->show_password_form();
+-      }
++        $this->set_temp_user($user);
++        $this->show_password_form();
++    }
+hunk ./actions/recoverpassword.php 116
+-      function set_temp_user(&$user) {
+-              common_ensure_session();
+-              $_SESSION['tempuser'] = $user->id;
+-      }
++    function set_temp_user(&$user) {
++        common_ensure_session();
++        $_SESSION['tempuser'] = $user->id;
++    }
+hunk ./actions/recoverpassword.php 121
+-      function get_temp_user() {
+-              common_ensure_session();
+-              $user_id = $_SESSION['tempuser'];
+-              if ($user_id) {
+-                      $user = User::staticGet($user_id);
+-              }
+-              return $user;
+-      }
++    function get_temp_user() {
++        common_ensure_session();
++        $user_id = $_SESSION['tempuser'];
++        if ($user_id) {
++            $user = User::staticGet($user_id);
++        }
++        return $user;
++    }
+hunk ./actions/recoverpassword.php 130
+-      function clear_temp_user() {
+-              common_ensure_session();
+-              unset($_SESSION['tempuser']);
+-      }
++    function clear_temp_user() {
++        common_ensure_session();
++        unset($_SESSION['tempuser']);
++    }
+hunk ./actions/recoverpassword.php 135
+-      function show_top($msg=NULL) {
+-              if ($msg) {
++    function show_top($msg=NULL) {
++        if ($msg) {
+hunk ./actions/recoverpassword.php 138
+-              } else {
+-                      common_element_start('div', 'instructions');
+-                      common_element('p', NULL, 
+-                                                 _('If you\'ve forgotten or lost your' .
+-                                                    ' password, you can get a new one sent to' .
+-                                                    ' the email address you have stored ' .
+-                                                    ' in your account.'));
+-                      common_element_end('div');
+-              }
+-      }
++        } else {
++            common_element_start('div', 'instructions');
++            common_element('p', NULL, 
++                           _('If you\'ve forgotten or lost your' .
++                              ' password, you can get a new one sent to' .
++                              ' the email address you have stored ' .
++                              ' in your account.'));
++            common_element_end('div');
++        }
++    }
+hunk ./actions/recoverpassword.php 149
+-      function show_password_top($msg=NULL) {
+-              if ($msg) {
++    function show_password_top($msg=NULL) {
++        if ($msg) {
+hunk ./actions/recoverpassword.php 152
+-              } else {
+-                      common_element('div', 'instructions',
+-                                                 _('You\'ve been identified. Enter a ' .
+-                                                    ' new password below. '));
+-              }
+-      }
++        } else {
++            common_element('div', 'instructions',
++                           _('You\'ve been identified. Enter a ' .
++                              ' new password below. '));
++        }
++    }
+hunk ./actions/recoverpassword.php 159
+-      function show_form($msg=NULL) {
++    function show_form($msg=NULL) {
+hunk ./actions/recoverpassword.php 161
+-              common_show_header(_('Recover password'), NULL,
+-              $msg, array($this, 'show_top'));
++        common_show_header(_('Recover password'), NULL,
++        $msg, array($this, 'show_top'));
+hunk ./actions/recoverpassword.php 164
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'recoverpassword',
+-                                                                                 'action' => common_local_url('recoverpassword')));
+-              common_input('nicknameoremail', _('Nickname or email'),
+-                                       $this->trimmed('nicknameoremail'),
+-                           _('Your nickname on this server, ' .
+-                              'or your registered email address.'));
+-              common_submit('recover', _('Recover'));
+-              common_element_end('form');
+-              common_show_footer();
+-      }
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'recoverpassword',
++                                           'action' => common_local_url('recoverpassword')));
++        common_input('nicknameoremail', _('Nickname or email'),
++                     $this->trimmed('nicknameoremail'),
++                     _('Your nickname on this server, ' .
++                        'or your registered email address.'));
++        common_submit('recover', _('Recover'));
++        common_element_end('form');
++        common_show_footer();
++    }
+hunk ./actions/recoverpassword.php 176
+-      function show_password_form($msg=NULL) {
++    function show_password_form($msg=NULL) {
+hunk ./actions/recoverpassword.php 178
+-              common_show_header(_('Reset password'), NULL,
+-              $msg, array($this, 'show_password_top'));
++        common_show_header(_('Reset password'), NULL,
++        $msg, array($this, 'show_password_top'));
+hunk ./actions/recoverpassword.php 181
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'recoverpassword',
+-                                                                                 'action' => common_local_url('recoverpassword')));
+-              common_hidden('token', common_session_token());
+-              common_password('newpassword', _('New password'),
+-                                              _('6 or more characters, and don\'t forget it!'));
+-              common_password('confirm', _('Confirm'),
+-                                              _('Same as password above'));
+-              common_submit('reset', _('Reset'));
+-              common_element_end('form');
+-              common_show_footer();
+-      }
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'recoverpassword',
++                                           'action' => common_local_url('recoverpassword')));
++        common_hidden('token', common_session_token());
++        common_password('newpassword', _('New password'),
++                        _('6 or more characters, and don\'t forget it!'));
++        common_password('confirm', _('Confirm'),
++                        _('Same as password above'));
++        common_submit('reset', _('Reset'));
++        common_element_end('form');
++        common_show_footer();
++    }
+hunk ./actions/recoverpassword.php 194
+-      function recover_password() {
+-              $nore = $this->trimmed('nicknameoremail');
+-              if (!$nore) {
+-                      $this->show_form(_('Enter a nickname or email address.'));
+-                      return;
+-              }
++    function recover_password() {
++        $nore = $this->trimmed('nicknameoremail');
++        if (!$nore) {
++            $this->show_form(_('Enter a nickname or email address.'));
++            return;
++        }
+hunk ./actions/recoverpassword.php 201
+-              $user = User::staticGet('email', common_canonical_email($nore));
++        $user = User::staticGet('email', common_canonical_email($nore));
+hunk ./actions/recoverpassword.php 203
+-              if (!$user) {
+-                      $user = User::staticGet('nickname', common_canonical_nickname($nore));
+-              }
++        if (!$user) {
++            $user = User::staticGet('nickname', common_canonical_nickname($nore));
++        }
+hunk ./actions/recoverpassword.php 207
+-              # See if it's an unconfirmed email address
++        # See if it's an unconfirmed email address
+hunk ./actions/recoverpassword.php 209
+-              if (!$user) {
+-                      $confirm_email = Confirm_address::staticGet('address', common_canonical_email($nore));
+-                      if ($confirm_email && $confirm_email->address_type == 'email') {
+-                              $user = User::staticGet($confirm_email->user_id);
+-                      }
+-              }
++        if (!$user) {
++            $confirm_email = Confirm_address::staticGet('address', common_canonical_email($nore));
++            if ($confirm_email && $confirm_email->address_type == 'email') {
++                $user = User::staticGet($confirm_email->user_id);
++            }
++        }
+hunk ./actions/recoverpassword.php 216
+-              if (!$user) {
+-                      $this->show_form(_('No user with that email address or username.'));
+-                      return;
+-              }
++        if (!$user) {
++            $this->show_form(_('No user with that email address or username.'));
++            return;
++        }
+hunk ./actions/recoverpassword.php 221
+-              # Try to get an unconfirmed email address if they used a user name
++        # Try to get an unconfirmed email address if they used a user name
+hunk ./actions/recoverpassword.php 223
+-              if (!$user->email && !$confirm_email) {
+-                      $confirm_email = Confirm_address::staticGet('user_id', $user->id);
+-                      if ($confirm_email && $confirm_email->address_type != 'email') {
+-                              # Skip non-email confirmations
+-                              $confirm_email = NULL;
+-                      }
+-              }
++        if (!$user->email && !$confirm_email) {
++            $confirm_email = Confirm_address::staticGet('user_id', $user->id);
++            if ($confirm_email && $confirm_email->address_type != 'email') {
++                # Skip non-email confirmations
++                $confirm_email = NULL;
++            }
++        }
+hunk ./actions/recoverpassword.php 231
+-              if (!$user->email && !$confirm_email) {
+-                      $this->client_error(_('No registered email address for that user.'));
+-                      return;
+-              }
++        if (!$user->email && !$confirm_email) {
++            $this->client_error(_('No registered email address for that user.'));
++            return;
++        }
+hunk ./actions/recoverpassword.php 236
+-              # Success! We have a valid user and a confirmed or unconfirmed email address
++        # Success! We have a valid user and a confirmed or unconfirmed email address
+hunk ./actions/recoverpassword.php 238
+-              $confirm = new Confirm_address();
+-              $confirm->code = common_confirmation_code(128);
+-              $confirm->address_type = 'recover';
+-              $confirm->user_id = $user->id;
+-              $confirm->address = (isset($user->email)) ? $user->email : $confirm_email->address;
++        $confirm = new Confirm_address();
++        $confirm->code = common_confirmation_code(128);
++        $confirm->address_type = 'recover';
++        $confirm->user_id = $user->id;
++        $confirm->address = (isset($user->email)) ? $user->email : $confirm_email->address;
+hunk ./actions/recoverpassword.php 244
+-              if (!$confirm->insert()) {
+-                      common_log_db_error($confirm, 'INSERT', __FILE__);
+-                      $this->server_error(_('Error saving address confirmation.'));
+-                      return;
+-              }
++        if (!$confirm->insert()) {
++            common_log_db_error($confirm, 'INSERT', __FILE__);
++            $this->server_error(_('Error saving address confirmation.'));
++            return;
++        }
+hunk ./actions/recoverpassword.php 250
+-              $body = "Hey, $user->nickname.";
+-              $body .= "\n\n";
+-              $body .= 'Someone just asked for a new password ' .
+-                       'for this account on ' . common_config('site', 'name') . '.';
+-              $body .= "\n\n";
+-              $body .= 'If it was you, and you want to confirm, use the URL below:';
+-              $body .= "\n\n";
+-              $body .= "\t".common_local_url('recoverpassword',
+-                                                                 array('code' => $confirm->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";
++        $body = "Hey, $user->nickname.";
++        $body .= "\n\n";
++        $body .= 'Someone just asked for a new password ' .
++                 'for this account on ' . common_config('site', 'name') . '.';
++        $body .= "\n\n";
++        $body .= 'If it was you, and you want to confirm, use the URL below:';
++        $body .= "\n\n";
++        $body .= "\t".common_local_url('recoverpassword',
++                                   array('code' => $confirm->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";
+hunk ./actions/recoverpassword.php 267
+-              mail_to_user($user, _('Password recovery requested'), $body, $confirm->address);
++        mail_to_user($user, _('Password recovery requested'), $body, $confirm->address);
+hunk ./actions/recoverpassword.php 269
+-              common_show_header(_('Password recovery requested'));
+-              common_element('p', NULL,
+-                             _('Instructions for recovering your password ' .
+-                                'have been sent to the email address registered to your ' .
+-                                'account.'));
+-              common_show_footer();
+-      }
++        common_show_header(_('Password recovery requested'));
++        common_element('p', NULL,
++                       _('Instructions for recovering your password ' .
++                          'have been sent to the email address registered to your ' .
++                          'account.'));
++        common_show_footer();
++    }
+hunk ./actions/recoverpassword.php 277
+-      function reset_password() {
++    function reset_password() {
+hunk ./actions/recoverpassword.php 279
+-              # CSRF protection
+-              $token = $this->trimmed('token');
+-              if (!$token || $token != common_session_token()) {
+-                      $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        # CSRF protection
++        $token = $this->trimmed('token');
++        if (!$token || $token != common_session_token()) {
++            $this->show_form(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/recoverpassword.php 286
+-              $user = $this->get_temp_user();
++        $user = $this->get_temp_user();
+hunk ./actions/recoverpassword.php 288
+-              if (!$user) {
+-                      $this->client_error(_('Unexpected password reset.'));
+-                      return;
+-              }
++        if (!$user) {
++            $this->client_error(_('Unexpected password reset.'));
++            return;
++        }
+hunk ./actions/recoverpassword.php 293
+-              $newpassword = $this->trimmed('newpassword');
+-              $confirm = $this->trimmed('confirm');
++        $newpassword = $this->trimmed('newpassword');
++        $confirm = $this->trimmed('confirm');
+hunk ./actions/recoverpassword.php 296
+-              if (!$newpassword || strlen($newpassword) < 6) {
+-                      $this->show_password_form(_('Password must be 6 chars or more.'));
+-                      return;
+-              }
+-              if ($newpassword != $confirm) {
+-                      $this->show_password_form(_('Password and confirmation do not match.'));
+-                      return;
+-              }
++        if (!$newpassword || strlen($newpassword) < 6) {
++            $this->show_password_form(_('Password must be 6 chars or more.'));
++            return;
++        }
++        if ($newpassword != $confirm) {
++            $this->show_password_form(_('Password and confirmation do not match.'));
++            return;
++        }
+hunk ./actions/recoverpassword.php 305
+-              # OK, we're ready to go
++        # OK, we're ready to go
+hunk ./actions/recoverpassword.php 307
+-              $original = clone($user);
++        $original = clone($user);
+hunk ./actions/recoverpassword.php 309
+-              $user->password = common_munge_password($newpassword, $user->id);
++        $user->password = common_munge_password($newpassword, $user->id);
+hunk ./actions/recoverpassword.php 311
+-              if (!$user->update($original)) {
+-                      common_log_db_error($user, 'UPDATE', __FILE__);
+-                      common_server_error(_('Can\'t save new password.'));
+-                      return;
+-              }
++        if (!$user->update($original)) {
++            common_log_db_error($user, 'UPDATE', __FILE__);
++            common_server_error(_('Can\'t save new password.'));
++            return;
++        }
+hunk ./actions/recoverpassword.php 317
+-              $this->clear_temp_user();
++        $this->clear_temp_user();
+hunk ./actions/recoverpassword.php 319
+-              if (!common_set_user($user->nickname)) {
+-                      common_server_error(_('Error setting user.'));
+-                      return;
+-              }
++        if (!common_set_user($user->nickname)) {
++            common_server_error(_('Error setting user.'));
++            return;
++        }
+hunk ./actions/recoverpassword.php 324
+-              common_real_login(true);
++        common_real_login(true);
+hunk ./actions/recoverpassword.php 326
+-              common_show_header(_('Password saved.'));
+-              common_element('p', NULL, _('New password successfully saved. ' .
+-                                           'You are now logged in.'));
+-              common_show_footer();
+-      }
++        common_show_header(_('Password saved.'));
++        common_element('p', NULL, _('New password successfully saved. ' .
++                                     'You are now logged in.'));
++        common_show_footer();
++    }
+hunk ./actions/register.php 24
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/register.php 27
+-              if (common_config('site', 'closed')) {
+-                      common_user_error(_('Registration not allowed.'));
+-              } else if (common_logged_in()) {
+-                      common_user_error(_('Already logged in.'));
+-              } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+-                      $this->try_register();
+-              } else {
+-                      $this->show_form();
+-              }
+-      }
++        if (common_config('site', 'closed')) {
++            common_user_error(_('Registration not allowed.'));
++        } else if (common_logged_in()) {
++            common_user_error(_('Already logged in.'));
++        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
++            $this->try_register();
++        } else {
++            $this->show_form();
++        }
++    }
+hunk ./actions/register.php 38
+-      function try_register() {
++    function try_register() {
+hunk ./actions/register.php 40
+-              $token = $this->trimmed('token');
+-              if (!$token || $token != common_session_token()) {
+-                      $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        $token = $this->trimmed('token');
++        if (!$token || $token != common_session_token()) {
++            $this->show_form(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/register.php 46
+-              $nickname = $this->trimmed('nickname');
+-              $email = $this->trimmed('email');
+-              $fullname = $this->trimmed('fullname');
+-              $homepage = $this->trimmed('homepage');
+-              $bio = $this->trimmed('bio');
+-              $location = $this->trimmed('location');
++        $nickname = $this->trimmed('nickname');
++        $email = $this->trimmed('email');
++        $fullname = $this->trimmed('fullname');
++        $homepage = $this->trimmed('homepage');
++        $bio = $this->trimmed('bio');
++        $location = $this->trimmed('location');
+hunk ./actions/register.php 53
+-              # We don't trim these... whitespace is OK in a password!
++        # We don't trim these... whitespace is OK in a password!
+hunk ./actions/register.php 55
+-              $password = $this->arg('password');
+-              $confirm = $this->arg('confirm');
++        $password = $this->arg('password');
++        $confirm = $this->arg('confirm');
+hunk ./actions/register.php 58
+-              # invitation code, if any
++        # invitation code, if any
+hunk ./actions/register.php 60
+-              $code = $this->trimmed('code');
++        $code = $this->trimmed('code');
+hunk ./actions/register.php 62
+-              if ($code) {
+-                      $invite = Invitation::staticGet($code);
+-              }
++        if ($code) {
++            $invite = Invitation::staticGet($code);
++        }
+hunk ./actions/register.php 66
+-              if (common_config('site', 'inviteonly') && !($code && $invite)) {
+-                      $this->client_error(_('Sorry, only invited people can register.'));
+-                      return;
+-              }
++        if (common_config('site', 'inviteonly') && !($code && $invite)) {
++            $this->client_error(_('Sorry, only invited people can register.'));
++            return;
++        }
+hunk ./actions/register.php 71
+-              # Input scrubbing
++        # Input scrubbing
+hunk ./actions/register.php 73
+-              $nickname = common_canonical_nickname($nickname);
+-              $email = common_canonical_email($email);
++        $nickname = common_canonical_nickname($nickname);
++        $email = common_canonical_email($email);
+hunk ./actions/register.php 76
+-              if (!$this->boolean('license')) {
+-                      $this->show_form(_('You can\'t register if you don\'t agree to the license.'));
+-              } else if ($email && !Validate::email($email, true)) {
+-                      $this->show_form(_('Not a valid email address.'));
+-              } else if (!Validate::string($nickname, array('min_length' => 1,
+-                                                                                                        'max_length' => 64,
+-                                                                                                        'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+-                      $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
+-              } else if ($this->nickname_exists($nickname)) {
+-                      $this->show_form(_('Nickname already in use. Try another one.'));
+-              } else if (!User::allowed_nickname($nickname)) {
+-                      $this->show_form(_('Not a valid nickname.'));
+-              } else if ($this->email_exists($email)) {
+-                      $this->show_form(_('Email address already exists.'));
+-              } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
+-                                 !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) {
+-                      $this->show_form(_('Homepage is not a valid URL.'));
+-                      return;
+-              } else if (!is_null($fullname) && strlen($fullname) > 255) {
+-                      $this->show_form(_('Full name is too long (max 255 chars).'));
+-                      return;
+-              } else if (!is_null($bio) && strlen($bio) > 140) {
+-                      $this->show_form(_('Bio is too long (max 140 chars).'));
+-                      return;
+-              } else if (!is_null($location) && strlen($location) > 255) {
+-                      $this->show_form(_('Location is too long (max 255 chars).'));
+-                      return;
+-              } else if (strlen($password) < 6) {
+-                      $this->show_form(_('Password must be 6 or more characters.'));
+-                      return;
+-              } else if ($password != $confirm) {
+-                      $this->show_form(_('Passwords don\'t match.'));
+-              } else if ($user = User::register(array('nickname' => $nickname, 'password' => $password, 'email' => $email,
+-                                                                                              'fullname' => $fullname, 'homepage' => $homepage, 'bio' => $bio,
+-                                                                                              'location' => $location, 'code' => $code))) {
+-                      if (!$user) {
+-                              $this->show_form(_('Invalid username or password.'));
+-                              return;
+-                      }
+-                      # success!
+-                      if (!common_set_user($user)) {
+-                              common_server_error(_('Error setting user.'));
+-                              return;
+-                      }
+-                      # this is a real login
+-                      common_real_login(true);
+-                      if ($this->boolean('rememberme')) {
+-                              common_debug('Adding rememberme cookie for ' . $nickname);
+-                              common_rememberme($user);
+-                      }
+-                      # Re-init language env in case it changed (not yet, but soon)
+-                      common_init_language();
+-                      $this->show_success();
+-              } else {
+-                      $this->show_form(_('Invalid username or password.'));
+-              }
+-      }
++        if (!$this->boolean('license')) {
++            $this->show_form(_('You can\'t register if you don\'t agree to the license.'));
++        } else if ($email && !Validate::email($email, true)) {
++            $this->show_form(_('Not a valid email address.'));
++        } else if (!Validate::string($nickname, array('min_length' => 1,
++                                                      'max_length' => 64,
++                                                      'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
++            $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
++        } else if ($this->nickname_exists($nickname)) {
++            $this->show_form(_('Nickname already in use. Try another one.'));
++        } else if (!User::allowed_nickname($nickname)) {
++            $this->show_form(_('Not a valid nickname.'));
++        } else if ($this->email_exists($email)) {
++            $this->show_form(_('Email address already exists.'));
++        } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
++                   !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) {
++            $this->show_form(_('Homepage is not a valid URL.'));
++            return;
++        } else if (!is_null($fullname) && strlen($fullname) > 255) {
++            $this->show_form(_('Full name is too long (max 255 chars).'));
++            return;
++        } else if (!is_null($bio) && strlen($bio) > 140) {
++            $this->show_form(_('Bio is too long (max 140 chars).'));
++            return;
++        } else if (!is_null($location) && strlen($location) > 255) {
++            $this->show_form(_('Location is too long (max 255 chars).'));
++            return;
++        } else if (strlen($password) < 6) {
++            $this->show_form(_('Password must be 6 or more characters.'));
++            return;
++        } else if ($password != $confirm) {
++            $this->show_form(_('Passwords don\'t match.'));
++        } else if ($user = User::register(array('nickname' => $nickname, 'password' => $password, 'email' => $email,
++                                                'fullname' => $fullname, 'homepage' => $homepage, 'bio' => $bio,
++                                                'location' => $location, 'code' => $code))) {
++            if (!$user) {
++                $this->show_form(_('Invalid username or password.'));
++                return;
++            }
++            # success!
++            if (!common_set_user($user)) {
++                common_server_error(_('Error setting user.'));
++                return;
++            }
++            # this is a real login
++            common_real_login(true);
++            if ($this->boolean('rememberme')) {
++                common_debug('Adding rememberme cookie for ' . $nickname);
++                common_rememberme($user);
++            }
++            # Re-init language env in case it changed (not yet, but soon)
++            common_init_language();
++            $this->show_success();
++        } else {
++            $this->show_form(_('Invalid username or password.'));
++        }
++    }
+hunk ./actions/register.php 134
+-      # checks if *CANONICAL* nickname exists
++    # checks if *CANONICAL* nickname exists
+hunk ./actions/register.php 136
+-      function nickname_exists($nickname) {
+-              $user = User::staticGet('nickname', $nickname);
+-              return ($user !== false);
+-      }
++    function nickname_exists($nickname) {
++        $user = User::staticGet('nickname', $nickname);
++        return ($user !== false);
++    }
+hunk ./actions/register.php 141
+-      # checks if *CANONICAL* email exists
++    # checks if *CANONICAL* email exists
+hunk ./actions/register.php 143
+-      function email_exists($email) {
+-              $email = common_canonical_email($email);
+-              if (!$email || strlen($email) == 0) {
+-                      return false;
+-              }
+-              $user = User::staticGet('email', $email);
+-              return ($user !== false);
+-      }
++    function email_exists($email) {
++        $email = common_canonical_email($email);
++        if (!$email || strlen($email) == 0) {
++            return false;
++        }
++        $user = User::staticGet('email', $email);
++        return ($user !== false);
++    }
+hunk ./actions/register.php 152
+-      function show_top($error=NULL) {
+-              if ($error) {
+-                      common_element('p', 'error', $error);
+-              } else {
+-                      $instr = common_markup_to_html(_('With this form you can create a new account. ' .
+-                                                                                       'You can then post notices and link up to friends and colleagues. '.
+-                                                                                       '(Have an [OpenID](http://openid.net/)? ' .
+-                                                                                       'Try our [OpenID registration](%%action.openidlogin%%)!)'));
++    function show_top($error=NULL) {
++        if ($error) {
++            common_element('p', 'error', $error);
++        } else {
++            $instr = common_markup_to_html(_('With this form you can create a new account. ' .
++                                             'You can then post notices and link up to friends and colleagues. '.
++                                             '(Have an [OpenID](http://openid.net/)? ' .
++                                             'Try our [OpenID registration](%%action.openidlogin%%)!)'));
+hunk ./actions/register.php 161
+-                      common_element_start('div', 'instructions');
+-                      common_raw($instr);
+-                      common_element_end('div');
+-              }
+-      }
++            common_element_start('div', 'instructions');
++            common_raw($instr);
++            common_element_end('div');
++        }
++    }
+hunk ./actions/register.php 167
+-      function show_form($error=NULL) {
+-              global $config;
++    function show_form($error=NULL) {
++        global $config;
+hunk ./actions/register.php 170
+-              $code = $this->trimmed('code');
++        $code = $this->trimmed('code');
+hunk ./actions/register.php 172
+-              if ($code) {
+-                      $invite = Invitation::staticGet($code);
+-              }
++        if ($code) {
++            $invite = Invitation::staticGet($code);
++        }
+hunk ./actions/register.php 176
+-              if (common_config('site', 'inviteonly') && !($code && $invite)) {
+-                      $this->client_error(_('Sorry, only invited people can register.'));
+-                      return;
+-              }
++        if (common_config('site', 'inviteonly') && !($code && $invite)) {
++            $this->client_error(_('Sorry, only invited people can register.'));
++            return;
++        }
+hunk ./actions/register.php 181
+-              common_show_header(_('Register'), NULL, $error, array($this, 'show_top'));
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'login',
+-                                                                                 'action' => common_local_url('register')));
++        common_show_header(_('Register'), NULL, $error, array($this, 'show_top'));
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'login',
++                                           'action' => common_local_url('register')));
+hunk ./actions/register.php 186
+-              common_hidden('token', common_session_token());
++        common_hidden('token', common_session_token());
+hunk ./actions/register.php 188
+-              if ($code) {
+-                      common_hidden('code', $code);
+-              }
++        if ($code) {
++            common_hidden('code', $code);
++        }
+hunk ./actions/register.php 192
+-              common_input('nickname', _('Nickname'), $this->trimmed('nickname'),
+-                                       _('1-64 lowercase letters or numbers, no punctuation or spaces. Required.'));
+-              common_password('password', _('Password'),
+-                                              _('6 or more characters. Required.'));
+-              common_password('confirm', _('Confirm'),
+-                                              _('Same as password above. Required.'));
+-              if ($invite && $invite->address_type == 'email') {
+-                      common_input('email', _('Email'), $invite->address,
+-                                       _('Used only for updates, announcements, and password recovery'));
+-              } else {
+-                      common_input('email', _('Email'), $this->trimmed('email'),
+-                                               _('Used only for updates, announcements, and password recovery'));
+-              }
+-              common_input('fullname', _('Full name'),
+-                                       $this->trimmed('fullname'),
+-                                        _('Longer name, preferably your "real" name'));
+-              common_input('homepage', _('Homepage'),
+-                                       $this->trimmed('homepage'),
+-                                       _('URL of your homepage, blog, or profile on another site'));
+-              common_textarea('bio', _('Bio'),
+-                                              $this->trimmed('bio'),
+-                                               _('Describe yourself and your interests in 140 chars'));
+-              common_input('location', _('Location'),
+-                                       $this->trimmed('location'),
+-                                       _('Where you are, like "City, State (or Region), Country"'));
+-              common_checkbox('rememberme', _('Remember me'),
+-                                              $this->boolean('rememberme'),
+-                              _('Automatically login in the future; not for shared computers!'));
+-              common_element_start('p');
+-              $attrs = array('type' => 'checkbox',
+-                                         'id' => 'license',
+-                                         'name' => 'license',
+-                                         'value' => 'true');
+-              if ($this->boolean('license')) {
+-                      $attrs['checked'] = 'checked';
+-              }
+-              common_element('input', $attrs);
+-          common_text(_('My text and files are available under '));
+-              common_element('a', array('href' => $config['license']['url']),
+-                                         $config['license']['title']);
+-              common_text(_(' except this private data: password, email address, IM address, phone number.'));
+-              common_element_end('p');
+-              common_submit('submit', _('Register'));
+-              common_element_end('form');
+-              common_show_footer();
+-      }
++        common_input('nickname', _('Nickname'), $this->trimmed('nickname'),
++                     _('1-64 lowercase letters or numbers, no punctuation or spaces. Required.'));
++        common_password('password', _('Password'),
++                        _('6 or more characters. Required.'));
++        common_password('confirm', _('Confirm'),
++                        _('Same as password above. Required.'));
++        if ($invite && $invite->address_type == 'email') {
++            common_input('email', _('Email'), $invite->address,
++                     _('Used only for updates, announcements, and password recovery'));
++        } else {
++            common_input('email', _('Email'), $this->trimmed('email'),
++                         _('Used only for updates, announcements, and password recovery'));
++        }
++        common_input('fullname', _('Full name'),
++                     $this->trimmed('fullname'),
++                      _('Longer name, preferably your "real" name'));
++        common_input('homepage', _('Homepage'),
++                     $this->trimmed('homepage'),
++                     _('URL of your homepage, blog, or profile on another site'));
++        common_textarea('bio', _('Bio'),
++                        $this->trimmed('bio'),
++                         _('Describe yourself and your interests in 140 chars'));
++        common_input('location', _('Location'),
++                     $this->trimmed('location'),
++                     _('Where you are, like "City, State (or Region), Country"'));
++        common_checkbox('rememberme', _('Remember me'),
++                        $this->boolean('rememberme'),
++                        _('Automatically login in the future; not for shared computers!'));
++        common_element_start('p');
++        $attrs = array('type' => 'checkbox',
++                       'id' => 'license',
++                       'name' => 'license',
++                       'value' => 'true');
++        if ($this->boolean('license')) {
++            $attrs['checked'] = 'checked';
++        }
++        common_element('input', $attrs);
++        common_text(_('My text and files are available under '));
++        common_element('a', array('href' => $config['license']['url']),
++                       $config['license']['title']);
++        common_text(_(' except this private data: password, email address, IM address, phone number.'));
++        common_element_end('p');
++        common_submit('submit', _('Register'));
++        common_element_end('form');
++        common_show_footer();
++    }
+hunk ./actions/register.php 239
+-      function show_success() {
+-              $nickname = $this->arg('nickname');
+-              common_show_header(_('Registration successful'));
+-              common_element_start('div', 'success');
+-              $instr = sprintf(_('Congratulations, %s! And welcome to %%%%site.name%%%%. From here, you may want to...'. "\n\n" .
+-                                                 '* Go to [your profile](%s) and post your first message.' .  "\n" .
+-                                                 '* Add a [Jabber/GTalk address](%%%%action.imsettings%%%%) so you can send notices through instant messages.' . "\n" .
+-                                                 '* [Search for people](%%%%action.peoplesearch%%%%) that you may know or that share your interests. ' . "\n" .
+-                                                 '* Update your [profile settings](%%%%action.profilesettings%%%%) to tell others more about you. ' . "\n" .
+-                                                 '* Read over the [online docs](%%%%doc.help%%%%) for features you may have missed. ' . "\n\n" .
+-                                                 'Thanks for signing up and we hope you enjoy using this service.'),
+-                                               $nickname, common_local_url('showstream', array('nickname' => $nickname)));
+-              common_raw(common_markup_to_html($instr));
+-              $have_email = $this->trimmed('email');
+-              if ($have_email) {
+-                      $emailinstr = _('(You should receive a message by email momentarily, with ' .
+-                                                      'instructions on how to confirm your email address.)');
+-                      common_raw(common_markup_to_html($emailinstr));
+-              }
+-              common_element_end('div');
+-              common_show_footer();
+-      }
++    function show_success() {
++        $nickname = $this->arg('nickname');
++        common_show_header(_('Registration successful'));
++        common_element_start('div', 'success');
++        $instr = sprintf(_('Congratulations, %s! And welcome to %%%%site.name%%%%. From here, you may want to...'. "\n\n" .
++                           '* Go to [your profile](%s) and post your first message.' .  "\n" .
++                           '* Add a [Jabber/GTalk address](%%%%action.imsettings%%%%) so you can send notices through instant messages.' . "\n" .
++                           '* [Search for people](%%%%action.peoplesearch%%%%) that you may know or that share your interests. ' . "\n" .
++                           '* Update your [profile settings](%%%%action.profilesettings%%%%) to tell others more about you. ' . "\n" .
++                           '* Read over the [online docs](%%%%doc.help%%%%) for features you may have missed. ' . "\n\n" .
++                           'Thanks for signing up and we hope you enjoy using this service.'),
++                         $nickname, common_local_url('showstream', array('nickname' => $nickname)));
++        common_raw(common_markup_to_html($instr));
++        $have_email = $this->trimmed('email');
++        if ($have_email) {
++            $emailinstr = _('(You should receive a message by email momentarily, with ' .
++                            'instructions on how to confirm your email address.)');
++            common_raw(common_markup_to_html($emailinstr));
++        }
++        common_element_end('div');
++        common_show_footer();
++    }
+hunk ./actions/remotesubscribe.php 26
+-      function handle($args) {
++    function handle($args) {
+hunk ./actions/remotesubscribe.php 28
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/remotesubscribe.php 30
+-              if (common_logged_in()) {
+-                      common_user_error(_('You can use the local subscription!'));
+-                  return;
+-              }
++        if (common_logged_in()) {
++            common_user_error(_('You can use the local subscription!'));
++            return;
++        }
+hunk ./actions/remotesubscribe.php 35
+-              if ($_SERVER['REQUEST_METHOD'] == 'POST') {
++        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+hunk ./actions/remotesubscribe.php 37
+-                      # CSRF protection
+-                      $token = $this->trimmed('token');
+-                      if (!$token || $token != common_session_token()) {
+-                              $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                              return;
+-                      }
++            # CSRF protection
++            $token = $this->trimmed('token');
++            if (!$token || $token != common_session_token()) {
++                $this->show_form(_('There was a problem with your session token. Try again, please.'));
++                return;
++            }
+hunk ./actions/remotesubscribe.php 44
+-                      $this->remote_subscription();
+-              } else {
+-                      $this->show_form();
+-              }
+-      }
++            $this->remote_subscription();
++        } else {
++            $this->show_form();
++        }
++    }
+hunk ./actions/remotesubscribe.php 50
+-      function get_instructions() {
+-              return _('To subscribe, you can [login](%%action.login%%),' .
+-                        ' or [register](%%action.register%%) a new ' .
+-                        ' account. If you already have an account ' .
+-                        ' on a [compatible microblogging site](%%doc.openmublog%%), ' .
+-                        ' enter your profile URL below.');
+-      }
++    function get_instructions() {
++        return _('To subscribe, you can [login](%%action.login%%),' .
++                  ' or [register](%%action.register%%) a new ' .
++                  ' account. If you already have an account ' .
++                  ' on a [compatible microblogging site](%%doc.openmublog%%), ' .
++                  ' enter your profile URL below.');
++    }
+hunk ./actions/remotesubscribe.php 58
+-      function show_top($err=NULL) {
+-              if ($err) {
+-                      common_element('div', 'error', $err);
+-              } else {
+-                      $instructions = $this->get_instructions();
+-                      $output = common_markup_to_html($instructions);
+-                      common_element_start('div', 'instructions');
+-                      common_raw($output);
+-                      common_element_end('p');
+-              }
+-      }
++    function show_top($err=NULL) {
++        if ($err) {
++            common_element('div', 'error', $err);
++        } else {
++            $instructions = $this->get_instructions();
++            $output = common_markup_to_html($instructions);
++            common_element_start('div', 'instructions');
++            common_raw($output);
++            common_element_end('p');
++        }
++    }
+hunk ./actions/remotesubscribe.php 70
+-      function show_form($err=NULL) {
+-              $nickname = $this->trimmed('nickname');
+-              $profile = $this->trimmed('profile_url');
+-              common_show_header(_('Remote subscribe'), NULL, $err,
+-                                                 array($this, 'show_top'));
+-              # id = remotesubscribe conflicts with the
+-              # button on profile page
+-              common_element_start('form', array('id' => 'remsub', 'method' => 'post',
+-                                                                                 'action' => common_local_url('remotesubscribe')));
+-              common_hidden('token', common_session_token());
+-              common_input('nickname', _('User nickname'), $nickname,
+-                                       _('Nickname of the user you want to follow'));
+-              common_input('profile_url', _('Profile URL'), $profile,
+-                                       _('URL of your profile on another compatible microblogging service'));
+-              common_submit('submit', _('Subscribe'));
+-              common_element_end('form');
+-              common_show_footer();
+-      }
++    function show_form($err=NULL) {
++        $nickname = $this->trimmed('nickname');
++        $profile = $this->trimmed('profile_url');
++        common_show_header(_('Remote subscribe'), NULL, $err,
++                           array($this, 'show_top'));
++        # id = remotesubscribe conflicts with the
++        # button on profile page
++        common_element_start('form', array('id' => 'remsub', 'method' => 'post',
++                                           'action' => common_local_url('remotesubscribe')));
++        common_hidden('token', common_session_token());
++        common_input('nickname', _('User nickname'), $nickname,
++                     _('Nickname of the user you want to follow'));
++        common_input('profile_url', _('Profile URL'), $profile,
++                     _('URL of your profile on another compatible microblogging service'));
++        common_submit('submit', _('Subscribe'));
++        common_element_end('form');
++        common_show_footer();
++    }
+hunk ./actions/remotesubscribe.php 89
+-      function remote_subscription() {
+-              $user = $this->get_user();
++    function remote_subscription() {
++        $user = $this->get_user();
+hunk ./actions/remotesubscribe.php 92
+-              if (!$user) {
+-                      $this->show_form(_('No such user.'));
+-                      return;
+-              }
++        if (!$user) {
++            $this->show_form(_('No such user.'));
++            return;
++        }
+hunk ./actions/remotesubscribe.php 97
+-              $profile = $this->trimmed('profile_url');
++        $profile = $this->trimmed('profile_url');
+hunk ./actions/remotesubscribe.php 99
+-              if (!$profile) {
+-                      $this->show_form(_('No such user.'));
+-                      return;
+-              }
++        if (!$profile) {
++            $this->show_form(_('No such user.'));
++            return;
++        }
+hunk ./actions/remotesubscribe.php 104
+-              if (!Validate::uri($profile, array('allowed_schemes' => array('http', 'https')))) {
+-                      $this->show_form(_('Invalid profile URL (bad format)'));
+-                      return;
+-              }
++        if (!Validate::uri($profile, array('allowed_schemes' => array('http', 'https')))) {
++            $this->show_form(_('Invalid profile URL (bad format)'));
++            return;
++        }
+hunk ./actions/remotesubscribe.php 109
+-              $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+-              $yadis = Auth_Yadis_Yadis::discover($profile, $fetcher);
++        $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
++        $yadis = Auth_Yadis_Yadis::discover($profile, $fetcher);
+hunk ./actions/remotesubscribe.php 112
+-              if (!$yadis || $yadis->failed) {
+-                      $this->show_form(_('Not a valid profile URL (no YADIS document).'));
+-                      return;
+-              }
++        if (!$yadis || $yadis->failed) {
++            $this->show_form(_('Not a valid profile URL (no YADIS document).'));
++            return;
++        }
+hunk ./actions/remotesubscribe.php 117
+-              # XXX: a little liberal for sites that accidentally put whitespace before the xml declaration
++        # XXX: a little liberal for sites that accidentally put whitespace before the xml declaration
+hunk ./actions/remotesubscribe.php 121
+-              if (!$xrds) {
+-                      $this->show_form(_('Not a valid profile URL (no XRDS defined).'));
+-                      return;
+-              }
++        if (!$xrds) {
++            $this->show_form(_('Not a valid profile URL (no XRDS defined).'));
++            return;
++        }
+hunk ./actions/remotesubscribe.php 126
+-              $omb = $this->getOmb($xrds);
++        $omb = $this->getOmb($xrds);
+hunk ./actions/remotesubscribe.php 128
+-              if (!$omb) {
+-                      $this->show_form(_('Not a valid profile URL (incorrect services).'));
+-                      return;
+-              }
++        if (!$omb) {
++            $this->show_form(_('Not a valid profile URL (incorrect services).'));
++            return;
++        }
+hunk ./actions/remotesubscribe.php 133
+-              if (omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]) ==
+-                      common_local_url('requesttoken'))
+-              {
+-                      $this->show_form(_('That\'s a local profile! Login to subscribe.'));
+-                      return;
+-              }
++        if (omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]) ==
++            common_local_url('requesttoken'))
++        {
++            $this->show_form(_('That\'s a local profile! Login to subscribe.'));
++            return;
++        }
+hunk ./actions/remotesubscribe.php 140
+-              if (User::staticGet('uri', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]))) {
+-                      $this->show_form(_('That\'s a local profile! Login to subscribe.'));
+-                      return;
+-              }
++        if (User::staticGet('uri', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]))) {
++            $this->show_form(_('That\'s a local profile! Login to subscribe.'));
++            return;
++        }
+hunk ./actions/remotesubscribe.php 145
+-              list($token, $secret) = $this->request_token($omb);
++        list($token, $secret) = $this->request_token($omb);
+hunk ./actions/remotesubscribe.php 147
+-              if (!$token || !$secret) {
+-                      $this->show_form(_('Couldn\'t get a request token.'));
+-                      return;
+-              }
++        if (!$token || !$secret) {
++            $this->show_form(_('Couldn\'t get a request token.'));
++            return;
++        }
+hunk ./actions/remotesubscribe.php 152
+-              $this->request_authorization($user, $omb, $token, $secret);
+-      }
++        $this->request_authorization($user, $omb, $token, $secret);
++    }
+hunk ./actions/remotesubscribe.php 155
+-      function get_user() {
+-              $user = NULL;
+-              $nickname = $this->trimmed('nickname');
+-              if ($nickname) {
+-                      $user = User::staticGet('nickname', $nickname);
+-              }
+-              return $user;
+-      }
++    function get_user() {
++        $user = NULL;
++        $nickname = $this->trimmed('nickname');
++        if ($nickname) {
++            $user = User::staticGet('nickname', $nickname);
++        }
++        return $user;
++    }
+hunk ./actions/remotesubscribe.php 164
+-      function getOmb($xrds) {
++    function getOmb($xrds) {
+hunk ./actions/remotesubscribe.php 166
+-          static $omb_endpoints = array(OMB_ENDPOINT_UPDATEPROFILE, OMB_ENDPOINT_POSTNOTICE);
+-              static $oauth_endpoints = array(OAUTH_ENDPOINT_REQUEST, OAUTH_ENDPOINT_AUTHORIZE,
+-                                                                              OAUTH_ENDPOINT_ACCESS);
+-              $omb = array();
++        static $omb_endpoints = array(OMB_ENDPOINT_UPDATEPROFILE, OMB_ENDPOINT_POSTNOTICE);
++        static $oauth_endpoints = array(OAUTH_ENDPOINT_REQUEST, OAUTH_ENDPOINT_AUTHORIZE,
++                                        OAUTH_ENDPOINT_ACCESS);
++        $omb = array();
+hunk ./actions/remotesubscribe.php 171
+-              # XXX: the following code could probably be refactored to eliminate dupes
++        # XXX: the following code could probably be refactored to eliminate dupes
+hunk ./actions/remotesubscribe.php 173
+-              $oauth_services = omb_get_services($xrds, OAUTH_DISCOVERY);
++        $oauth_services = omb_get_services($xrds, OAUTH_DISCOVERY);
+hunk ./actions/remotesubscribe.php 175
+-              if (!$oauth_services) {
+-                      return NULL;
+-              }
++        if (!$oauth_services) {
++            return NULL;
++        }
+hunk ./actions/remotesubscribe.php 179
+-              $oauth_service = $oauth_services[0];
++        $oauth_service = $oauth_services[0];
+hunk ./actions/remotesubscribe.php 181
+-              $oauth_xrd = $this->getXRD($oauth_service, $xrds);
++        $oauth_xrd = $this->getXRD($oauth_service, $xrds);
+hunk ./actions/remotesubscribe.php 183
+-              if (!$oauth_xrd) {
+-                      return NULL;
+-              }
++        if (!$oauth_xrd) {
++            return NULL;
++        }
+hunk ./actions/remotesubscribe.php 187
+-              if (!$this->addServices($oauth_xrd, $oauth_endpoints, $omb)) {
+-                      return NULL;
+-              }
++        if (!$this->addServices($oauth_xrd, $oauth_endpoints, $omb)) {
++            return NULL;
++        }
+hunk ./actions/remotesubscribe.php 191
+-              $omb_services = omb_get_services($xrds, OMB_NAMESPACE);
++        $omb_services = omb_get_services($xrds, OMB_NAMESPACE);
+hunk ./actions/remotesubscribe.php 193
+-              if (!$omb_services) {
+-                      return NULL;
+-              }
++        if (!$omb_services) {
++            return NULL;
++        }
+hunk ./actions/remotesubscribe.php 197
+-              $omb_service = $omb_services[0];
++        $omb_service = $omb_services[0];
+hunk ./actions/remotesubscribe.php 199
+-              $omb_xrd = $this->getXRD($omb_service, $xrds);
++        $omb_xrd = $this->getXRD($omb_service, $xrds);
+hunk ./actions/remotesubscribe.php 201
+-              if (!$omb_xrd) {
+-                      return NULL;
+-              }
++        if (!$omb_xrd) {
++            return NULL;
++        }
+hunk ./actions/remotesubscribe.php 205
+-              if (!$this->addServices($omb_xrd, $omb_endpoints, $omb)) {
+-                      return NULL;
+-              }
++        if (!$this->addServices($omb_xrd, $omb_endpoints, $omb)) {
++            return NULL;
++        }
+hunk ./actions/remotesubscribe.php 209
+-              # XXX: check that we got all the services we needed
++        # XXX: check that we got all the services we needed
+hunk ./actions/remotesubscribe.php 211
+-              foreach (array_merge($omb_endpoints, $oauth_endpoints) as $type) {
+-                      if (!array_key_exists($type, $omb) || !$omb[$type]) {
+-                              return NULL;
+-                      }
+-              }
++        foreach (array_merge($omb_endpoints, $oauth_endpoints) as $type) {
++            if (!array_key_exists($type, $omb) || !$omb[$type]) {
++                return NULL;
++            }
++        }
+hunk ./actions/remotesubscribe.php 217
+-              if (!omb_local_id($omb[OAUTH_ENDPOINT_REQUEST])) {
+-                      return NULL;
+-              }
++        if (!omb_local_id($omb[OAUTH_ENDPOINT_REQUEST])) {
++            return NULL;
++        }
+hunk ./actions/remotesubscribe.php 221
+-              return $omb;
+-      }
++        return $omb;
++    }
+hunk ./actions/remotesubscribe.php 224
+-      function getXRD($main_service, $main_xrds) {
+-              $uri = omb_service_uri($main_service);
+-              if (strpos($uri, "#") !== 0) {
+-                      # FIXME: more rigorous handling of external service definitions
+-                      return NULL;
+-              }
+-              $id = substr($uri, 1);
+-              $nodes = $main_xrds->allXrdNodes;
+-              $parser = $main_xrds->parser;
+-              foreach ($nodes as $node) {
+-                      $attrs = $parser->attributes($node);
+-                      if (array_key_exists('xml:id', $attrs) &&
+-                              $attrs['xml:id'] == $id) {
+-                              # XXX: trick the constructor into thinking this is the only node
+-                              $bogus_nodes = array($node);
+-                              return new Auth_Yadis_XRDS($parser, $bogus_nodes);
+-                      }
+-              }
+-              return NULL;
+-      }
++    function getXRD($main_service, $main_xrds) {
++        $uri = omb_service_uri($main_service);
++        if (strpos($uri, "#") !== 0) {
++            # FIXME: more rigorous handling of external service definitions
++            return NULL;
++        }
++        $id = substr($uri, 1);
++        $nodes = $main_xrds->allXrdNodes;
++        $parser = $main_xrds->parser;
++        foreach ($nodes as $node) {
++            $attrs = $parser->attributes($node);
++            if (array_key_exists('xml:id', $attrs) &&
++                $attrs['xml:id'] == $id) {
++                # XXX: trick the constructor into thinking this is the only node
++                $bogus_nodes = array($node);
++                return new Auth_Yadis_XRDS($parser, $bogus_nodes);
++            }
++        }
++        return NULL;
++    }
+hunk ./actions/remotesubscribe.php 245
+-      function addServices($xrd, $types, &$omb) {
+-              foreach ($types as $type) {
+-                      $matches = omb_get_services($xrd, $type);
+-                      if ($matches) {
+-                              $omb[$type] = $matches[0];
+-                      } else {
+-                              # no match for type
+-                              return false;
+-                      }
+-              }
+-              return true;
+-      }
++    function addServices($xrd, $types, &$omb) {
++        foreach ($types as $type) {
++            $matches = omb_get_services($xrd, $type);
++            if ($matches) {
++                $omb[$type] = $matches[0];
++            } else {
++                # no match for type
++                return false;
++            }
++        }
++        return true;
++    }
+hunk ./actions/remotesubscribe.php 258
+-      function request_token($omb) {
+-              $con = omb_oauth_consumer();
++    function request_token($omb) {
++        $con = omb_oauth_consumer();
+hunk ./actions/remotesubscribe.php 261
+-              $url = omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]);
++        $url = omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]);
+hunk ./actions/remotesubscribe.php 263
+-              # XXX: Is this the right thing to do? Strip off GET params and make them
+-              # POST params? Seems wrong to me.
++        # XXX: Is this the right thing to do? Strip off GET params and make them
++        # POST params? Seems wrong to me.
+hunk ./actions/remotesubscribe.php 266
+-              $parsed = parse_url($url);
+-              $params = array();
+-              parse_str($parsed['query'], $params);
++        $parsed = parse_url($url);
++        $params = array();
++        parse_str($parsed['query'], $params);
+hunk ./actions/remotesubscribe.php 270
+-              $req = OAuthRequest::from_consumer_and_token($con, NULL, "POST", $url, $params);
++        $req = OAuthRequest::from_consumer_and_token($con, NULL, "POST", $url, $params);
+hunk ./actions/remotesubscribe.php 272
+-              $listener = omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]);
++        $listener = omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]);
+hunk ./actions/remotesubscribe.php 274
+-              if (!$listener) {
+-                      return NULL;
+-              }
++        if (!$listener) {
++            return NULL;
++        }
+hunk ./actions/remotesubscribe.php 278
+-              $req->set_parameter('omb_listener', $listener);
+-              $req->set_parameter('omb_version', OMB_VERSION_01);
++        $req->set_parameter('omb_listener', $listener);
++        $req->set_parameter('omb_version', OMB_VERSION_01);
+hunk ./actions/remotesubscribe.php 281
+-              # XXX: test to see if endpoint accepts this signature method
++        # XXX: test to see if endpoint accepts this signature method
+hunk ./actions/remotesubscribe.php 283
+-              $req->sign_request(omb_hmac_sha1(), $con, NULL);
++        $req->sign_request(omb_hmac_sha1(), $con, NULL);
+hunk ./actions/remotesubscribe.php 285
+-              # We re-use this tool's fetcher, since it's pretty good
++        # We re-use this tool's fetcher, since it's pretty good
+hunk ./actions/remotesubscribe.php 287
+-              $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
++        $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+hunk ./actions/remotesubscribe.php 289
+-              $result = $fetcher->post($req->get_normalized_http_url(),
+-                                                               $req->to_postdata(),
++        $result = $fetcher->post($req->get_normalized_http_url(),
++                                 $req->to_postdata(),
+hunk ./actions/remotesubscribe.php 293
+-              if ($result->status != 200) {
+-                      return NULL;
+-              }
++        if ($result->status != 200) {
++            return NULL;
++        }
+hunk ./actions/remotesubscribe.php 297
+-              parse_str($result->body, $return);
++        parse_str($result->body, $return);
+hunk ./actions/remotesubscribe.php 299
+-              return array($return['oauth_token'], $return['oauth_token_secret']);
+-      }
++        return array($return['oauth_token'], $return['oauth_token_secret']);
++    }
+hunk ./actions/remotesubscribe.php 302
+-      function request_authorization($user, $omb, $token, $secret) {
+-              global $config; # for license URL
++    function request_authorization($user, $omb, $token, $secret) {
++        global $config; # for license URL
+hunk ./actions/remotesubscribe.php 305
+-              $con = omb_oauth_consumer();
+-              $tok = new OAuthToken($token, $secret);
++        $con = omb_oauth_consumer();
++        $tok = new OAuthToken($token, $secret);
+hunk ./actions/remotesubscribe.php 308
+-              $url = omb_service_uri($omb[OAUTH_ENDPOINT_AUTHORIZE]);
++        $url = omb_service_uri($omb[OAUTH_ENDPOINT_AUTHORIZE]);
+hunk ./actions/remotesubscribe.php 310
+-              # XXX: Is this the right thing to do? Strip off GET params and make them
+-              # POST params? Seems wrong to me.
++        # XXX: Is this the right thing to do? Strip off GET params and make them
++        # POST params? Seems wrong to me.
+hunk ./actions/remotesubscribe.php 313
+-              $parsed = parse_url($url);
+-              $params = array();
+-              parse_str($parsed['query'], $params);
++        $parsed = parse_url($url);
++        $params = array();
++        parse_str($parsed['query'], $params);
+hunk ./actions/remotesubscribe.php 317
+-              $req = OAuthRequest::from_consumer_and_token($con, $tok, 'GET', $url, $params);
++        $req = OAuthRequest::from_consumer_and_token($con, $tok, 'GET', $url, $params);
+hunk ./actions/remotesubscribe.php 319
+-              # We send over a ton of information. This lets the other
+-              # server store info about our user, and it lets the current
+-              # user decide if they really want to authorize the subscription.
++        # We send over a ton of information. This lets the other
++        # server store info about our user, and it lets the current
++        # user decide if they really want to authorize the subscription.
+hunk ./actions/remotesubscribe.php 323
+-              $req->set_parameter('omb_version', OMB_VERSION_01);
+-              $req->set_parameter('omb_listener', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]));
+-              $req->set_parameter('omb_listenee', $user->uri);
+-              $req->set_parameter('omb_listenee_profile', common_profile_url($user->nickname));
+-              $req->set_parameter('omb_listenee_nickname', $user->nickname);
+-              $req->set_parameter('omb_listenee_license', $config['license']['url']);
++        $req->set_parameter('omb_version', OMB_VERSION_01);
++        $req->set_parameter('omb_listener', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]));
++        $req->set_parameter('omb_listenee', $user->uri);
++        $req->set_parameter('omb_listenee_profile', common_profile_url($user->nickname));
++        $req->set_parameter('omb_listenee_nickname', $user->nickname);
++        $req->set_parameter('omb_listenee_license', $config['license']['url']);
+hunk ./actions/remotesubscribe.php 330
+-              $profile = $user->getProfile();
+-              if (!$profile) {
+-                      common_log_db_error($user, 'SELECT', __FILE__);
+-                      $this->server_error(_('User without matching profile'));
+-                      return;
+-              }
++        $profile = $user->getProfile();
++        if (!$profile) {
++            common_log_db_error($user, 'SELECT', __FILE__);
++            $this->server_error(_('User without matching profile'));
++            return;
++        }
+hunk ./actions/remotesubscribe.php 337
+-              if ($profile->fullname) {
+-                      $req->set_parameter('omb_listenee_fullname', $profile->fullname);
+-              }
+-              if ($profile->homepage) {
+-                      $req->set_parameter('omb_listenee_homepage', $profile->homepage);
+-              }
+-              if ($profile->bio) {
+-                      $req->set_parameter('omb_listenee_bio', $profile->bio);
+-              }
+-              if ($profile->location) {
+-                      $req->set_parameter('omb_listenee_location', $profile->location);
+-              }
+-              $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+-              if ($avatar) {
+-                      $req->set_parameter('omb_listenee_avatar', $avatar->url);
+-              }
++        if ($profile->fullname) {
++            $req->set_parameter('omb_listenee_fullname', $profile->fullname);
++        }
++        if ($profile->homepage) {
++            $req->set_parameter('omb_listenee_homepage', $profile->homepage);
++        }
++        if ($profile->bio) {
++            $req->set_parameter('omb_listenee_bio', $profile->bio);
++        }
++        if ($profile->location) {
++            $req->set_parameter('omb_listenee_location', $profile->location);
++        }
++        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
++        if ($avatar) {
++            $req->set_parameter('omb_listenee_avatar', $avatar->url);
++        }
+hunk ./actions/remotesubscribe.php 354
+-              # XXX: add a nonce to prevent replay attacks
++        # XXX: add a nonce to prevent replay attacks
+hunk ./actions/remotesubscribe.php 356
+-              $req->set_parameter('oauth_callback', common_local_url('finishremotesubscribe'));
++        $req->set_parameter('oauth_callback', common_local_url('finishremotesubscribe'));
+hunk ./actions/remotesubscribe.php 358
+-              # XXX: test to see if endpoint accepts this signature method
++        # XXX: test to see if endpoint accepts this signature method
+hunk ./actions/remotesubscribe.php 360
+-              $req->sign_request(omb_hmac_sha1(), $con, $tok);
++        $req->sign_request(omb_hmac_sha1(), $con, $tok);
+hunk ./actions/remotesubscribe.php 362
+-              # store all our info here
++        # store all our info here
+hunk ./actions/remotesubscribe.php 364
+-              $omb['listenee'] = $user->nickname;
+-              $omb['listener'] = omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]);
+-              $omb['token'] = $token;
+-              $omb['secret'] = $secret;
+-              # call doesn't work after bounce back so we cache; maybe serialization issue...?
+-              $omb['access_token_url'] = omb_service_uri($omb[OAUTH_ENDPOINT_ACCESS]);
+-              $omb['post_notice_url'] = omb_service_uri($omb[OMB_ENDPOINT_POSTNOTICE]);
+-              $omb['update_profile_url'] = omb_service_uri($omb[OMB_ENDPOINT_UPDATEPROFILE]);
++        $omb['listenee'] = $user->nickname;
++        $omb['listener'] = omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]);
++        $omb['token'] = $token;
++        $omb['secret'] = $secret;
++        # call doesn't work after bounce back so we cache; maybe serialization issue...?
++        $omb['access_token_url'] = omb_service_uri($omb[OAUTH_ENDPOINT_ACCESS]);
++        $omb['post_notice_url'] = omb_service_uri($omb[OMB_ENDPOINT_POSTNOTICE]);
++        $omb['update_profile_url'] = omb_service_uri($omb[OMB_ENDPOINT_UPDATEPROFILE]);
+hunk ./actions/remotesubscribe.php 373
+-              common_ensure_session();
++        common_ensure_session();
+hunk ./actions/remotesubscribe.php 375
+-              $_SESSION['oauth_authorization_request'] = $omb;
++        $_SESSION['oauth_authorization_request'] = $omb;
+hunk ./actions/remotesubscribe.php 377
+-              # Redirect to authorization service
++        # Redirect to authorization service
+hunk ./actions/remotesubscribe.php 379
+-              common_redirect($req->to_url());
+-              return;
+-      }
++        common_redirect($req->to_url());
++        return;
++    }
+hunk ./actions/remotesubscribe.php 383
+-      function make_nonce() {
+-              return common_good_rand(16);
+-      }
++    function make_nonce() {
++        return common_good_rand(16);
++    }
+hunk ./actions/replies.php 26
+-      function handle($args) {
++    function handle($args) {
+hunk ./actions/replies.php 28
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/replies.php 30
+-              $nickname = common_canonical_nickname($this->arg('nickname'));
+-              $user = User::staticGet('nickname', $nickname);
++        $nickname = common_canonical_nickname($this->arg('nickname'));
++        $user = User::staticGet('nickname', $nickname);
+hunk ./actions/replies.php 33
+-              if (!$user) {
+-                      $this->no_such_user();
+-                      return;
+-              }
++        if (!$user) {
++            $this->no_such_user();
++            return;
++        }
+hunk ./actions/replies.php 38
+-              $profile = $user->getProfile();
++        $profile = $user->getProfile();
+hunk ./actions/replies.php 40
+-              if (!$profile) {
+-                      common_server_error(_('User has no profile.'));
+-                      return;
+-              }
++        if (!$profile) {
++            common_server_error(_('User has no profile.'));
++            return;
++        }
+hunk ./actions/replies.php 45
+-              # Looks like we're good; show the header
++        # Looks like we're good; show the header
+hunk ./actions/replies.php 47
+-              common_show_header(sprintf(_("Replies to %s"), $profile->nickname),
+-                                                 array($this, 'show_header'), $user,
+-                                                 array($this, 'show_top'));
++        common_show_header(sprintf(_("Replies to %s"), $profile->nickname),
++                           array($this, 'show_header'), $user,
++                           array($this, 'show_top'));
+hunk ./actions/replies.php 51
+-              $this->show_replies($user);
++        $this->show_replies($user);
+hunk ./actions/replies.php 53
+-              common_show_footer();
+-      }
++        common_show_footer();
++    }
+hunk ./actions/replies.php 56
+-      function no_such_user() {
+-              common_user_error(_('No such user.'));
+-      }
++    function no_such_user() {
++        common_user_error(_('No such user.'));
++    }
+hunk ./actions/replies.php 60
+-      function show_header($user) {
+-              common_element('link', array('rel' => 'alternate',
+-                                                                       'href' => common_local_url('repliesrss', array('nickname' =>
+-                                                                                                                                                                      $user->nickname)),
+-                                                                       'type' => 'application/rss+xml',
+-                                                                       'title' => sprintf(_('Feed for replies to %s'), $user->nickname)));
+-      }
++    function show_header($user) {
++        common_element('link', array('rel' => 'alternate',
++                                     'href' => common_local_url('repliesrss', array('nickname' =>
++                                                                                    $user->nickname)),
++                                     'type' => 'application/rss+xml',
++                                     'title' => sprintf(_('Feed for replies to %s'), $user->nickname)));
++    }
+hunk ./actions/replies.php 68
+-      function show_top($user) {
+-              $cur = common_current_user();
++    function show_top($user) {
++        $cur = common_current_user();
+hunk ./actions/replies.php 71
+-              if ($cur && $cur->id == $user->id) {
+-                      common_notice_form('replies');
+-              }
++        if ($cur && $cur->id == $user->id) {
++            common_notice_form('replies');
++        }
+hunk ./actions/replies.php 75
+-              $this->views_menu();
++        $this->views_menu();
+hunk ./actions/replies.php 77
+-              $this->show_feeds_list(array(0=>array('href'=>common_local_url('repliesrss', array('nickname' => $user->nickname)),
+-                                                                                        'type' => 'rss',
+-                                                                                        'version' => 'RSS 1.0',
+-                                                                                        'item' => 'repliesrss')));
+-      }
++        $this->show_feeds_list(array(0=>array('href'=>common_local_url('repliesrss', array('nickname' => $user->nickname)),
++                                              'type' => 'rss',
++                                              'version' => 'RSS 1.0',
++                                              'item' => 'repliesrss')));
++    }
+hunk ./actions/replies.php 83
+-      function show_replies($user) {
++    function show_replies($user) {
+hunk ./actions/replies.php 85
+-              $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
++        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+hunk ./actions/replies.php 87
+-              $notice = $user->getReplies(($page-1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
++        $notice = $user->getReplies(($page-1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+hunk ./actions/replies.php 89
+-              $cnt = $this->show_notice_list($notice);
++        $cnt = $this->show_notice_list($notice);
+hunk ./actions/replies.php 91
+-              common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+-                                                $page, 'replies', array('nickname' => $user->nickname));
+-      }
++        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
++                          $page, 'replies', array('nickname' => $user->nickname));
++    }
+hunk ./actions/repliesrss.php 28
+-      var $user = NULL;
++    var $user = NULL;
+hunk ./actions/repliesrss.php 30
+-      function init() {
+-              $nickname = $this->trimmed('nickname');
+-              $this->user = User::staticGet('nickname', $nickname);
++    function init() {
++        $nickname = $this->trimmed('nickname');
++        $this->user = User::staticGet('nickname', $nickname);
+hunk ./actions/repliesrss.php 34
+-              if (!$this->user) {
+-                      common_user_error(_('No such user.'));
+-                      return false;
+-              } else {
+-                      return true;
+-              }
+-      }
++        if (!$this->user) {
++            common_user_error(_('No such user.'));
++            return false;
++        } else {
++            return true;
++        }
++    }
+hunk ./actions/repliesrss.php 42
+-      function get_notices($limit=0) {
++    function get_notices($limit=0) {
+hunk ./actions/repliesrss.php 44
+-              $user = $this->user;
++        $user = $this->user;
+hunk ./actions/repliesrss.php 46
+-              $notice = $user->getReplies(0, ($limit == 0) ? 48 : $limit);
++        $notice = $user->getReplies(0, ($limit == 0) ? 48 : $limit);
+hunk ./actions/repliesrss.php 48
+-              $notices = array();
+-              
+-              while ($notice->fetch()) {
+-                      $notices[] = clone($notice);
+-              }
++        $notices = array();
++        
++        while ($notice->fetch()) {
++            $notices[] = clone($notice);
++        }
+hunk ./actions/repliesrss.php 54
+-              return $notices;
+-      }
++        return $notices;
++    }
+hunk ./actions/repliesrss.php 57
+-      function get_channel() {
+-              $user = $this->user;
+-              $c = array('url' => common_local_url('repliesrss',
+-                                                                                       array('nickname' =>
+-                                                                                                 $user->nickname)),
+-                                 'title' => sprintf(_("Replies to %s"), $user->nickname),
+-                                 'link' => common_local_url('replies',
+-                                                                                        array('nickname' =>
+-                                                                                                      $user->nickname)),
+-                                 'description' => sprintf(_('Feed for replies to %s'), $user->nickname));
+-              return $c;
+-      }
++    function get_channel() {
++        $user = $this->user;
++        $c = array('url' => common_local_url('repliesrss',
++                                             array('nickname' =>
++                                                   $user->nickname)),
++                   'title' => sprintf(_("Replies to %s"), $user->nickname),
++                   'link' => common_local_url('replies',
++                                              array('nickname' =>
++                                                    $user->nickname)),
++                   'description' => sprintf(_('Feed for replies to %s'), $user->nickname));
++        return $c;
++    }
+hunk ./actions/repliesrss.php 70
+-      function get_image() {
+-              $user = $this->user;
+-              $profile = $user->getProfile();
+-              if (!$profile) {
+-                      return NULL;
+-              }
+-              $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+-              return ($avatar) ? $avatar->url : NULL;
+-      }
++    function get_image() {
++        $user = $this->user;
++        $profile = $user->getProfile();
++        if (!$profile) {
++            return NULL;
++        }
++        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
++        return ($avatar) ? $avatar->url : NULL;
++    }
+hunk ./actions/requesttoken.php 25
+-      
+-      function is_readonly() {
+-              return false;
+-      }
+-      
+-      function handle($args) {
+-              parent::handle($args);
+-              try {
+-                      common_remove_magic_from_request();
+-                      $req = OAuthRequest::from_request();
+-                      $server = omb_oauth_server();
+-                      $token = $server->fetch_request_token($req);
+-                      print $token;
+-              } catch (OAuthException $e) {
+-                      common_server_error($e->getMessage());
+-              }
+-      }
++    
++    function is_readonly() {
++        return false;
++    }
++    
++    function handle($args) {
++        parent::handle($args);
++        try {
++            common_remove_magic_from_request();
++            $req = OAuthRequest::from_request();
++            $server = omb_oauth_server();
++            $token = $server->fetch_request_token($req);
++            print $token;
++        } catch (OAuthException $e) {
++            common_server_error($e->getMessage());
++        }
++    }
+hunk ./actions/showfavorites.php 26
+-      function handle($args) {
++    function handle($args) {
+hunk ./actions/showfavorites.php 28
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/showfavorites.php 30
+-              $nickname = common_canonical_nickname($this->arg('nickname'));
+-              $user = User::staticGet('nickname', $nickname);
++        $nickname = common_canonical_nickname($this->arg('nickname'));
++        $user = User::staticGet('nickname', $nickname);
+hunk ./actions/showfavorites.php 33
+-              if (!$user) {
+-                      $this->client_error(_('No such user.'));
+-                      return;
+-              }
++        if (!$user) {
++            $this->client_error(_('No such user.'));
++            return;
++        }
+hunk ./actions/showfavorites.php 38
+-              $profile = $user->getProfile();
++        $profile = $user->getProfile();
+hunk ./actions/showfavorites.php 40
+-              if (!$profile) {
+-                      common_server_error(_('User has no profile.'));
+-                      return;
+-              }
++        if (!$profile) {
++            common_server_error(_('User has no profile.'));
++            return;
++        }
+hunk ./actions/showfavorites.php 45
+-              # Looks like we're good; show the header
++        # Looks like we're good; show the header
+hunk ./actions/showfavorites.php 47
+-              common_show_header(sprintf(_("%s favorite notices"), $profile->nickname),
+-                                                 array($this, 'show_header'), $user,
+-                                                 array($this, 'show_top'));
++        common_show_header(sprintf(_("%s favorite notices"), $profile->nickname),
++                           array($this, 'show_header'), $user,
++                           array($this, 'show_top'));
+hunk ./actions/showfavorites.php 51
+-              $this->show_notices($user);
++        $this->show_notices($user);
+hunk ./actions/showfavorites.php 53
+-              common_show_footer();
+-      }
++        common_show_footer();
++    }
+hunk ./actions/showfavorites.php 56
+-      function show_header($user) {
+-              common_element('link', array('rel' => 'alternate',
+-                                                                       'href' => common_local_url('favoritesrss', array('nickname' =>
+-                                                                                                                                                                        $user->nickname)),
+-                                                                       'type' => 'application/rss+xml',
+-                                                                       'title' => sprintf(_('Feed for favorites of %s'), $user->nickname)));
+-      }
++    function show_header($user) {
++        common_element('link', array('rel' => 'alternate',
++                                     'href' => common_local_url('favoritesrss', array('nickname' =>
++                                                                                      $user->nickname)),
++                                     'type' => 'application/rss+xml',
++                                     'title' => sprintf(_('Feed for favorites of %s'), $user->nickname)));
++    }
+hunk ./actions/showfavorites.php 64
+-      function show_top($user) {
+-              $cur = common_current_user();
++    function show_top($user) {
++        $cur = common_current_user();
+hunk ./actions/showfavorites.php 67
+-              if ($cur && $cur->id == $user->id) {
+-                      common_notice_form('all');
+-              }
++        if ($cur && $cur->id == $user->id) {
++            common_notice_form('all');
++        }
+hunk ./actions/showfavorites.php 71
+-              $this->show_feeds_list(array(0=>array('href'=>common_local_url('favoritesrss', array('nickname' => $user->nickname)),
+-                                                                                        'type' => 'rss',
+-                                                                                        'version' => 'RSS 1.0',
+-                                                                                        'item' => 'Favorites')));
+-              $this->views_menu();
+-      }
++        $this->show_feeds_list(array(0=>array('href'=>common_local_url('favoritesrss', array('nickname' => $user->nickname)),
++                                              'type' => 'rss',
++                                              'version' => 'RSS 1.0',
++                                              'item' => 'Favorites')));
++        $this->views_menu();
++    }
+hunk ./actions/showfavorites.php 78
+-      function show_notices($user) {
++    function show_notices($user) {
+hunk ./actions/showfavorites.php 80
+-              $page = $this->trimmed('page');
+-              if (!$page) {
+-                      $page = 1;
+-              }
++        $page = $this->trimmed('page');
++        if (!$page) {
++            $page = 1;
++        }
+hunk ./actions/showfavorites.php 85
+-              $notice = $user->favoriteNotices(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
++        $notice = $user->favoriteNotices(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+hunk ./actions/showfavorites.php 87
+-              if (!$notice) {
+-                      $this->server_error(_('Could not retrieve favorite notices.'));
+-                      return;
+-              }
++        if (!$notice) {
++            $this->server_error(_('Could not retrieve favorite notices.'));
++            return;
++        }
+hunk ./actions/showfavorites.php 94
+-              common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+-                                                $page, 'showfavorites', array('nickname' => $user->nickname));
+-      }
++        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
++                          $page, 'showfavorites', array('nickname' => $user->nickname));
++    }
+hunk ./actions/showmessage.php 26
+-      function handle($args) {
++    function handle($args) {
+hunk ./actions/showmessage.php 28
+-              Action::handle($args);
++        Action::handle($args);
+hunk ./actions/showmessage.php 30
+-              $message = $this->get_message();
++        $message = $this->get_message();
+hunk ./actions/showmessage.php 32
+-              if (!$message) {
+-                      $this->client_error(_('No such message.'), 404);
+-                      return;
+-              }
+-              
+-              $cur = common_current_user();
+-              
+-              if ($cur && ($cur->id == $message->from_profile || $cur->id == $message->to_profile)) {
+-                      $this->show_page($cur, 1);
+-              } else {
+-                      $this->client_error(_('Only the sender and recipient may read this message.'), 403);
+-                      return;
+-              }
+-      }
+-      
+-      function get_message() {
+-              $id = $this->trimmed('message');
+-              $message = Message::staticGet('id', $id);
+-              return $message;
+-      }
+-      
+-      function get_title($user, $page) {
+-              $message = $this->get_message();
+-              if (!$message) {
+-                      return NULL;
+-              }
+-              
+-              if ($user->id == $message->from_profile) {
+-                      $to = $message->getTo();
+-                      $title = sprintf(_("Message to %1\$s on %2\$s"),
+-                                                       $to->nickname,
+-                                                       common_exact_date($message->created));
+-              } else if ($user->id == $message->to_profile) {
+-                      $from = $message->getFrom();
+-                      $title = sprintf(_("Message from %1\$s on %2\$s"),
+-                                                       $from->nickname,
+-                                                       common_exact_date($message->created));
+-              }
+-              return $title;
+-      }
++        if (!$message) {
++            $this->client_error(_('No such message.'), 404);
++            return;
++        }
++        
++        $cur = common_current_user();
++        
++        if ($cur && ($cur->id == $message->from_profile || $cur->id == $message->to_profile)) {
++            $this->show_page($cur, 1);
++        } else {
++            $this->client_error(_('Only the sender and recipient may read this message.'), 403);
++            return;
++        }
++    }
++    
++    function get_message() {
++        $id = $this->trimmed('message');
++        $message = Message::staticGet('id', $id);
++        return $message;
++    }
++    
++    function get_title($user, $page) {
++        $message = $this->get_message();
++        if (!$message) {
++            return NULL;
++        }
++        
++        if ($user->id == $message->from_profile) {
++            $to = $message->getTo();
++            $title = sprintf(_("Message to %1\$s on %2\$s"),
++                             $to->nickname,
++                             common_exact_date($message->created));
++        } else if ($user->id == $message->to_profile) {
++            $from = $message->getFrom();
++            $title = sprintf(_("Message from %1\$s on %2\$s"),
++                             $from->nickname,
++                             common_exact_date($message->created));
++        }
++        return $title;
++    }
+hunk ./actions/showmessage.php 73
+-      function get_messages($user, $page) {
+-              $message = new Message();
+-              $message->id = $this->trimmed('message');
+-              $message->find();
+-              return $message;
+-      }
+-      
+-      function get_message_profile($message) {
+-              $user = common_current_user();
+-              if ($user->id == $message->from_profile) {
+-                      return $message->getTo();
+-              } else if ($user->id == $message->to_profile) {
+-                      return $message->getFrom();
+-              } else {
+-                      # This shouldn't happen
+-                      return NULL;
+-              }
+-      }
+-      
+-      function get_instructions() {
+-              return '';
+-      }
+-      
+-      function views_menu() {
+-              return;
+-      }
++    function get_messages($user, $page) {
++        $message = new Message();
++        $message->id = $this->trimmed('message');
++        $message->find();
++        return $message;
++    }
++    
++    function get_message_profile($message) {
++        $user = common_current_user();
++        if ($user->id == $message->from_profile) {
++            return $message->getTo();
++        } else if ($user->id == $message->to_profile) {
++            return $message->getFrom();
++        } else {
++            # This shouldn't happen
++            return NULL;
++        }
++    }
++    
++    function get_instructions() {
++        return '';
++    }
++    
++    function views_menu() {
++        return;
++    }
+hunk ./actions/showmessage.php 100
+-      
++    
+hunk ./actions/shownotice.php 26
+-      var $notice = NULL;
+-      var $profile = NULL;
+-      var $avatar = NULL;
++    var $notice = NULL;
++    var $profile = NULL;
++    var $avatar = NULL;
+hunk ./actions/shownotice.php 30
+-      function prepare($args) {
++    function prepare($args) {
+hunk ./actions/shownotice.php 32
+-              parent::prepare($args);
++        parent::prepare($args);
+hunk ./actions/shownotice.php 34
+-              $id = $this->arg('notice');
+-              $this->notice = Notice::staticGet($id);
++        $id = $this->arg('notice');
++        $this->notice = Notice::staticGet($id);
+hunk ./actions/shownotice.php 37
+-              if (!$this->notice) {
+-                      $this->client_error(_('No such notice.'), 404);
+-                      return false;
+-              }
++        if (!$this->notice) {
++            $this->client_error(_('No such notice.'), 404);
++            return false;
++        }
+hunk ./actions/shownotice.php 42
+-              $this->profile = $this->notice->getProfile();
++        $this->profile = $this->notice->getProfile();
+hunk ./actions/shownotice.php 44
+-              if (!$this->profile) {
+-                      $this->server_error(_('Notice has no profile'), 500);
+-                      return false;
+-              }
++        if (!$this->profile) {
++            $this->server_error(_('Notice has no profile'), 500);
++            return false;
++        }
+hunk ./actions/shownotice.php 49
+-              $this->avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
++        $this->avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
+hunk ./actions/shownotice.php 51
+-              return true;
+-      }
++        return true;
++    }
+hunk ./actions/shownotice.php 54
+-      function last_modified() {
+-              return max(strtotime($this->notice->created),
+-                                 strtotime($this->profile->modified),
+-                                 ($this->avatar) ? strtotime($this->avatar->modified) : 0);
+-      }
++    function last_modified() {
++        return max(strtotime($this->notice->created),
++                   strtotime($this->profile->modified),
++                   ($this->avatar) ? strtotime($this->avatar->modified) : 0);
++    }
+hunk ./actions/shownotice.php 60
+-      function etag() {
+-              return 'W/"' . implode(':', array($this->arg('action'),
+-                                                                                common_language(),
+-                                                                                $this->notice->id,
+-                                                                                strtotime($this->notice->created),
+-                                                                                strtotime($this->profile->modified),
+-                                                                                ($this->avatar) ? strtotime($this->avatar->modified) : 0)) . '"';
+-      }
++    function etag() {
++        return 'W/"' . implode(':', array($this->arg('action'),
++                                          common_language(),
++                                          $this->notice->id,
++                                          strtotime($this->notice->created),
++                                          strtotime($this->profile->modified),
++                                          ($this->avatar) ? strtotime($this->avatar->modified) : 0)) . '"';
++    }
+hunk ./actions/shownotice.php 69
+-      function handle($args) {
++    function handle($args) {
+hunk ./actions/shownotice.php 71
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/shownotice.php 73
+-              common_show_header(sprintf(_('%1$s\'s status on %2$s'),
+-                                                                 $this->profile->nickname,
+-                                                                 common_exact_date($this->notice->created)),
+-                                                 array($this, 'show_header'), NULL,
+-                                                 array($this, 'show_top'));
++        common_show_header(sprintf(_('%1$s\'s status on %2$s'),
++                                   $this->profile->nickname,
++                                   common_exact_date($this->notice->created)),
++                           array($this, 'show_header'), NULL,
++                           array($this, 'show_top'));
+hunk ./actions/shownotice.php 79
+-              common_element_start('ul', array('id' => 'notices'));
++        common_element_start('ul', array('id' => 'notices'));
+hunk ./actions/shownotice.php 82
+-              common_element_end('ul');
++        common_element_end('ul');
+hunk ./actions/shownotice.php 84
+-              common_show_footer();
+-      }
++        common_show_footer();
++    }
+hunk ./actions/shownotice.php 87
+-      function show_header() {
++    function show_header() {
+hunk ./actions/shownotice.php 89
+-              $user = User::staticGet($this->profile->id);
++        $user = User::staticGet($this->profile->id);
+hunk ./actions/shownotice.php 91
+-              if (!$user) {
+-                      return;
+-              }
++        if (!$user) {
++            return;
++        }
+hunk ./actions/shownotice.php 95
+-              if ($user->emailmicroid && $user->email && $this->notice->uri) {
+-                      common_element('meta', array('name' => 'microid',
+-                                                                               'content' => "mailto+http:sha1:" . sha1(sha1('mailto:' . $user->email) . sha1($this->notice->uri))));
+-              }
++        if ($user->emailmicroid && $user->email && $this->notice->uri) {
++            common_element('meta', array('name' => 'microid',
++                                         'content' => "mailto+http:sha1:" . sha1(sha1('mailto:' . $user->email) . sha1($this->notice->uri))));
++        }
+hunk ./actions/shownotice.php 100
+-              if ($user->jabbermicroid && $user->jabber && $this->notice->uri) {
+-                      common_element('meta', array('name' => 'microid',
+-                                                                               'content' => "xmpp+http:sha1:" . sha1(sha1('xmpp:' . $user->jabber) . sha1($this->notice->uri))));
+-              }
+-      }
++        if ($user->jabbermicroid && $user->jabber && $this->notice->uri) {
++            common_element('meta', array('name' => 'microid',
++                                         'content' => "xmpp+http:sha1:" . sha1(sha1('xmpp:' . $user->jabber) . sha1($this->notice->uri))));
++        }
++    }
+hunk ./actions/shownotice.php 106
+-      function show_top() {
+-              $cur = common_current_user();
+-              if ($cur && $cur->id == $this->profile->id) {
+-                      common_notice_form();
+-              }
+-      }
++    function show_top() {
++        $cur = common_current_user();
++        if ($cur && $cur->id == $this->profile->id) {
++            common_notice_form();
++        }
++    }
+hunk ./actions/shownotice.php 113
+-      function no_such_notice() {
+-              common_user_error(_('No such notice.'));
+-      }
++    function no_such_notice() {
++        common_user_error(_('No such notice.'));
++    }
+hunk ./actions/showstream.php 29
+-      function handle($args) {
++    function handle($args) {
+hunk ./actions/showstream.php 31
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/showstream.php 34
+-              $nickname = common_canonical_nickname($nickname_arg);
++        $nickname = common_canonical_nickname($nickname_arg);
+hunk ./actions/showstream.php 47
+-              $user = User::staticGet('nickname', $nickname);
++        $user = User::staticGet('nickname', $nickname);
+hunk ./actions/showstream.php 49
+-              if (!$user) {
+-                      $this->no_such_user();
+-                      return;
+-              }
++        if (!$user) {
++            $this->no_such_user();
++            return;
++        }
+hunk ./actions/showstream.php 54
+-              $profile = $user->getProfile();
++        $profile = $user->getProfile();
+hunk ./actions/showstream.php 56
+-              if (!$profile) {
+-                      common_server_error(_('User has no profile.'));
+-                      return;
+-              }
++        if (!$profile) {
++            common_server_error(_('User has no profile.'));
++            return;
++        }
+hunk ./actions/showstream.php 61
+-              # Looks like we're good; start output
++        # Looks like we're good; start output
+hunk ./actions/showstream.php 63
+-              # For YADIS discovery, we also have a <meta> tag
++        # For YADIS discovery, we also have a <meta> tag
+hunk ./actions/showstream.php 65
+-              header('X-XRDS-Location: '. common_local_url('xrds', array('nickname' =>
+-                                                                                                                                 $user->nickname)));
++        header('X-XRDS-Location: '. common_local_url('xrds', array('nickname' =>
++                                                                   $user->nickname)));
+hunk ./actions/showstream.php 68
+-              common_show_header($profile->nickname,
+-                                                 array($this, 'show_header'), $user,
+-                                                 array($this, 'show_top'));
++        common_show_header($profile->nickname,
++                           array($this, 'show_header'), $user,
++                           array($this, 'show_top'));
+hunk ./actions/showstream.php 72
+-              $this->show_profile($profile);
++        $this->show_profile($profile);
+hunk ./actions/showstream.php 74
+-              $this->show_notices($user);
++        $this->show_notices($user);
+hunk ./actions/showstream.php 76
+-              common_show_footer();
+-      }
++        common_show_footer();
++    }
+hunk ./actions/showstream.php 79
+-      function show_top($user) {
+-              $cur = common_current_user();
++    function show_top($user) {
++        $cur = common_current_user();
+hunk ./actions/showstream.php 82
+-              if ($cur && $cur->id == $user->id) {
+-                      common_notice_form('showstream');
+-              }
++        if ($cur && $cur->id == $user->id) {
++            common_notice_form('showstream');
++        }
+hunk ./actions/showstream.php 86
+-              $this->views_menu();
++        $this->views_menu();
+hunk ./actions/showstream.php 88
+-              $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('nickname' => $user->nickname)),
+-                                                                                        'type' => 'rss',
+-                                                                                        'version' => 'RSS 1.0',
+-                                                                                        'item' => 'notices'),
+-                                                                       1=>array('href'=>common_local_url('usertimeline', array('nickname' => $user->nickname)),
+-                                                                                        'type' => 'atom',
+-                                                                                        'version' => 'Atom 1.0',
+-                                                                                        'item' => 'usertimeline'),
++        $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('nickname' => $user->nickname)),
++                                              'type' => 'rss',
++                                              'version' => 'RSS 1.0',
++                                              'item' => 'notices'),
++                                     1=>array('href'=>common_local_url('usertimeline', array('nickname' => $user->nickname)),
++                                              'type' => 'atom',
++                                              'version' => 'Atom 1.0',
++                                              'item' => 'usertimeline'),
+hunk ./actions/showstream.php 97
+-                                                                       2=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
+-                                                                                        'type' => 'rdf',
+-                                                                                        'version' => 'FOAF',
+-                                                                                        'item' => 'foaf')));
+-      }
++                                     2=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
++                                              'type' => 'rdf',
++                                              'version' => 'FOAF',
++                                              'item' => 'foaf')));
++    }
+hunk ./actions/showstream.php 103
+-      function show_header($user) {
+-              # Feeds
+-              common_element('link', array('rel' => 'alternate',
+-                                                                       'href' => common_local_url('api',
+-                                                                                                                              array('apiaction' => 'statuses',
+-                                                                                                                                        'method' => 'user_timeline.rss',
+-                                                                                                                                        'argument' => $user->nickname)),
+-                                                                       'type' => 'application/rss+xml',
+-                                                                       'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
+-              common_element('link', array('rel' => 'alternate feed',
+-                                                                       'href' => common_local_url('api',
+-                                                                                                                              array('apiaction' => 'statuses',
+-                                                                                                                                        'method' => 'user_timeline.atom',
+-                                                                                                                                        'argument' => $user->nickname)),
+-                                                                       'type' => 'application/atom+xml',
+-                                                                       'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
+-              common_element('link', array('rel' => 'alternate',
+-                                                                       'href' => common_local_url('userrss', array('nickname' =>
+-                                                                                                                                                         $user->nickname)),
+-                                                                       'type' => 'application/rdf+xml',
+-                                                                       'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
+-              # FOAF
+-              common_element('link', array('rel' => 'meta',
+-                                                                       'href' => common_local_url('foaf', array('nickname' =>
+-                                                                                                                                                        $user->nickname)),
+-                                                                       'type' => 'application/rdf+xml',
+-                                                                       'title' => 'FOAF'));
+-              # for remote subscriptions etc.
+-              common_element('meta', array('http-equiv' => 'X-XRDS-Location',
+-                                                                       'content' => common_local_url('xrds', array('nickname' =>
+-                                                                                                                                                         $user->nickname))));
+-              $profile = $user->getProfile();
+-              if ($profile->bio) {
+-                      common_element('meta', array('name' => 'description',
+-                                                                               'content' => $profile->bio));
+-              }
++    function show_header($user) {
++        # Feeds
++        common_element('link', array('rel' => 'alternate',
++                                     'href' => common_local_url('api',
++                                                                array('apiaction' => 'statuses',
++                                                                      'method' => 'user_timeline.rss',
++                                                                      'argument' => $user->nickname)),
++                                     'type' => 'application/rss+xml',
++                                     'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
++        common_element('link', array('rel' => 'alternate feed',
++                                     'href' => common_local_url('api',
++                                                                array('apiaction' => 'statuses',
++                                                                      'method' => 'user_timeline.atom',
++                                                                      'argument' => $user->nickname)),
++                                     'type' => 'application/atom+xml',
++                                     'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
++        common_element('link', array('rel' => 'alternate',
++                                     'href' => common_local_url('userrss', array('nickname' =>
++                                                                               $user->nickname)),
++                                     'type' => 'application/rdf+xml',
++                                     'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
++        # FOAF
++        common_element('link', array('rel' => 'meta',
++                                     'href' => common_local_url('foaf', array('nickname' =>
++                                                                              $user->nickname)),
++                                     'type' => 'application/rdf+xml',
++                                     'title' => 'FOAF'));
++        # for remote subscriptions etc.
++        common_element('meta', array('http-equiv' => 'X-XRDS-Location',
++                                     'content' => common_local_url('xrds', array('nickname' =>
++                                                                               $user->nickname))));
++        $profile = $user->getProfile();
++        if ($profile->bio) {
++            common_element('meta', array('name' => 'description',
++                                         'content' => $profile->bio));
++        }
+hunk ./actions/showstream.php 140
+-              if ($user->emailmicroid && $user->email && $profile->profileurl) {
+-                      common_element('meta', array('name' => 'microid',
+-                                                                               'content' => "mailto+http:sha1:" . sha1(sha1('mailto:' . $user->email) . sha1($profile->profileurl))));
+-              }
+-              if ($user->jabbermicroid && $user->jabber && $profile->profileurl) {
+-                      common_element('meta', array('name' => 'microid',
+-                                                                               'content' => "xmpp+http:sha1:" . sha1(sha1('xmpp:' . $user->jabber) . sha1($profile->profileurl))));
+-              }
++        if ($user->emailmicroid && $user->email && $profile->profileurl) {
++            common_element('meta', array('name' => 'microid',
++                                         'content' => "mailto+http:sha1:" . sha1(sha1('mailto:' . $user->email) . sha1($profile->profileurl))));
++        }
++        if ($user->jabbermicroid && $user->jabber && $profile->profileurl) {
++            common_element('meta', array('name' => 'microid',
++                                         'content' => "xmpp+http:sha1:" . sha1(sha1('xmpp:' . $user->jabber) . sha1($profile->profileurl))));
++        }
+hunk ./actions/showstream.php 149
+-              # See https://wiki.mozilla.org/Microsummaries
++        # See https://wiki.mozilla.org/Microsummaries
+hunk ./actions/showstream.php 151
+-              common_element('link', array('rel' => 'microsummary',
+-                                                                       'href' => common_local_url('microsummary',
+-                                                                                                                              array('nickname' => $profile->nickname))));
+-      }
++        common_element('link', array('rel' => 'microsummary',
++                                     'href' => common_local_url('microsummary',
++                                                                array('nickname' => $profile->nickname))));
++    }
+hunk ./actions/showstream.php 156
+-      function no_such_user() {
+-              $this->client_error(_('No such user.'), 404);
+-      }
++    function no_such_user() {
++        $this->client_error(_('No such user.'), 404);
++    }
+hunk ./actions/showstream.php 160
+-      function show_profile($profile) {
++    function show_profile($profile) {
+hunk ./actions/showstream.php 162
+-              common_element_start('div', array('id' => 'profile', 'class' => 'vcard'));
++        common_element_start('div', array('id' => 'profile', 'class' => 'vcard'));
+hunk ./actions/showstream.php 164
+-              $this->show_personal($profile);
++        $this->show_personal($profile);
+hunk ./actions/showstream.php 166
+-              $this->show_last_notice($profile);
++        $this->show_last_notice($profile);
+hunk ./actions/showstream.php 168
+-              $cur = common_current_user();
++        $cur = common_current_user();
+hunk ./actions/showstream.php 170
+-              $this->show_subscriptions($profile);
++        $this->show_subscriptions($profile);
+hunk ./actions/showstream.php 172
+-              common_element_end('div');
+-      }
++        common_element_end('div');
++    }
+hunk ./actions/showstream.php 175
+-      function show_personal($profile) {
++    function show_personal($profile) {
+hunk ./actions/showstream.php 177
+-              $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+-              common_element_start('div', array('id' => 'profile_avatar'));
+-              common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
+-                                                                      'class' => 'avatar profile photo',
+-                                                                      'width' => AVATAR_PROFILE_SIZE,
+-                                                                      'height' => AVATAR_PROFILE_SIZE,
+-                                                                      'alt' => $profile->nickname));
++        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
++        common_element_start('div', array('id' => 'profile_avatar'));
++        common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
++                                    'class' => 'avatar profile photo',
++                                    'width' => AVATAR_PROFILE_SIZE,
++                                    'height' => AVATAR_PROFILE_SIZE,
++                                    'alt' => $profile->nickname));
+hunk ./actions/showstream.php 188
+-              $cur = common_current_user();
+-              if ($cur) {
+-                      if ($cur->id != $profile->id) {
+-                              if ($cur->isSubscribed($profile)) {
+-                                      common_unsubscribe_form($profile);
+-                              } else {
+-                                      common_subscribe_form($profile);
+-                              }
+-                      }
+-              } else {
+-                      $this->show_remote_subscribe_link($profile);
+-              }
++        $cur = common_current_user();
++        if ($cur) {
++            if ($cur->id != $profile->id) {
++                if ($cur->isSubscribed($profile)) {
++                    common_unsubscribe_form($profile);
++                } else {
++                    common_subscribe_form($profile);
++                }
++            }
++        } else {
++            $this->show_remote_subscribe_link($profile);
++        }
+hunk ./actions/showstream.php 202
+-              $user = User::staticGet('id', $profile->id);
+-              common_profile_new_message_nudge($cur, $user, $profile);
++        $user = User::staticGet('id', $profile->id);
++        common_profile_new_message_nudge($cur, $user, $profile);
+hunk ./actions/showstream.php 218
+-              common_element_end('ul');
++        common_element_end('ul');
+hunk ./actions/showstream.php 220
+-              common_element_end('div');
++        common_element_end('div');
+hunk ./actions/showstream.php 222
+-              common_element_start('div', array('id' => 'profile_information'));
++        common_element_start('div', array('id' => 'profile_information'));
+hunk ./actions/showstream.php 224
+-              if ($profile->fullname) {
+-                      common_element('h1', array('class' => 'fn'), $profile->fullname . ' (' . $profile->nickname . ')');
+-              } else {
+-                      common_element('h1', array('class' => 'fn nickname'), $profile->nickname);
+-              }
++        if ($profile->fullname) {
++            common_element('h1', array('class' => 'fn'), $profile->fullname . ' (' . $profile->nickname . ')');
++        } else {
++            common_element('h1', array('class' => 'fn nickname'), $profile->nickname);
++        }
+hunk ./actions/showstream.php 230
+-              if ($profile->location) {
+-                      common_element('p', 'location', $profile->location);
+-              }
+-              if ($profile->bio) {
+-                      common_element('p', 'description note', $profile->bio);
+-              }
+-              if ($profile->homepage) {
+-                      common_element_start('p', 'website');
+-                      common_element('a', array('href' => $profile->homepage,
+-                                                                        'rel' => 'me', 'class' => 'url'),
+-                                                 $profile->homepage);
+-                      common_element_end('p');
+-              }
++        if ($profile->location) {
++            common_element('p', 'location', $profile->location);
++        }
++        if ($profile->bio) {
++            common_element('p', 'description note', $profile->bio);
++        }
++        if ($profile->homepage) {
++            common_element_start('p', 'website');
++            common_element('a', array('href' => $profile->homepage,
++                                      'rel' => 'me', 'class' => 'url'),
++                           $profile->homepage);
++            common_element_end('p');
++        }
+hunk ./actions/showstream.php 244
+-              $this->show_statistics($profile);
++        $this->show_statistics($profile);
+hunk ./actions/showstream.php 246
+-              common_element_end('div');
+-      }
++        common_element_end('div');
++    }
+hunk ./actions/showstream.php 249
+-      function show_remote_subscribe_link($profile) {
+-              $url = common_local_url('remotesubscribe',
+-                                      array('nickname' => $profile->nickname));
+-              common_element('a', array('href' => $url,
+-                                                                'id' => 'remotesubscribe'),
+-                                         _('Subscribe'));
+-      }
++    function show_remote_subscribe_link($profile) {
++        $url = common_local_url('remotesubscribe',
++                                array('nickname' => $profile->nickname));
++        common_element('a', array('href' => $url,
++                                  'id' => 'remotesubscribe'),
++                       _('Subscribe'));
++    }
+hunk ./actions/showstream.php 257
+-      function show_unsubscribe_form($profile) {
+-              common_element_start('form', array('id' => 'unsubscribe', 'method' => 'post',
+-                                                                                 'action' => common_local_url('unsubscribe')));
+-              common_hidden('token', common_session_token());
+-              common_element('input', array('id' => 'unsubscribeto',
+-                                                                        'name' => 'unsubscribeto',
+-                                                                        'type' => 'hidden',
+-                                                                        'value' => $profile->nickname));
+-              common_element('input', array('type' => 'submit',
+-                                                                        'class' => 'submit',
+-                                                                        'value' => _('Unsubscribe')));
+-              common_element_end('form');
+-      }
++    function show_unsubscribe_form($profile) {
++        common_element_start('form', array('id' => 'unsubscribe', 'method' => 'post',
++                                           'action' => common_local_url('unsubscribe')));
++        common_hidden('token', common_session_token());
++        common_element('input', array('id' => 'unsubscribeto',
++                                      'name' => 'unsubscribeto',
++                                      'type' => 'hidden',
++                                      'value' => $profile->nickname));
++        common_element('input', array('type' => 'submit',
++                                      'class' => 'submit',
++                                      'value' => _('Unsubscribe')));
++        common_element_end('form');
++    }
+hunk ./actions/showstream.php 271
+-      function show_subscriptions($profile) {
+-              global $config;
++    function show_subscriptions($profile) {
++        global $config;
+hunk ./actions/showstream.php 274
+-              $subs = DB_DataObject::factory('subscription');
+-              $subs->subscriber = $profile->id;
+-              $subs->whereAdd('subscribed != ' . $profile->id);
++        $subs = DB_DataObject::factory('subscription');
++        $subs->subscriber = $profile->id;
++        $subs->whereAdd('subscribed != ' . $profile->id);
+hunk ./actions/showstream.php 278
+-              $subs->orderBy('created DESC');
++        $subs->orderBy('created DESC');
+hunk ./actions/showstream.php 280
+-              # We ask for an extra one to know if we need to do another page
++        # We ask for an extra one to know if we need to do another page
+hunk ./actions/showstream.php 282
+-              $subs->limit(0, SUBSCRIPTIONS + 1);
++        $subs->limit(0, SUBSCRIPTIONS + 1);
+hunk ./actions/showstream.php 284
+-              $subs_count = $subs->find();
++        $subs_count = $subs->find();
+hunk ./actions/showstream.php 286
+-              common_element_start('div', array('id' => 'subscriptions'));
++        common_element_start('div', array('id' => 'subscriptions'));
+hunk ./actions/showstream.php 288
+-              common_element('h2', NULL, _('Subscriptions'));
++        common_element('h2', NULL, _('Subscriptions'));
+hunk ./actions/showstream.php 290
+-              if ($subs_count > 0) {
++        if ($subs_count > 0) {
+hunk ./actions/showstream.php 292
+-                      common_element_start('ul', array('id' => 'subscriptions_avatars'));
++            common_element_start('ul', array('id' => 'subscriptions_avatars'));
+hunk ./actions/showstream.php 294
+-                      for ($i = 0; $i < min($subs_count, SUBSCRIPTIONS); $i++) {
++            for ($i = 0; $i < min($subs_count, SUBSCRIPTIONS); $i++) {
+hunk ./actions/showstream.php 296
+-                              if (!$subs->fetch()) {
+-                                      common_debug('Weirdly, broke out of subscriptions loop early', __FILE__);
+-                                      break;
+-                              }
++                if (!$subs->fetch()) {
++                    common_debug('Weirdly, broke out of subscriptions loop early', __FILE__);
++                    break;
++                }
+hunk ./actions/showstream.php 301
+-                              $other = Profile::staticGet($subs->subscribed);
++                $other = Profile::staticGet($subs->subscribed);
+hunk ./actions/showstream.php 303
+-                              if (!$other) {
+-                                      common_log_db_error($subs, 'SELECT', __FILE__);
+-                                      continue;
+-                              }
++                if (!$other) {
++                    common_log_db_error($subs, 'SELECT', __FILE__);
++                    continue;
++                }
+hunk ./actions/showstream.php 308
+-                              common_element_start('li', 'vcard');
+-                              common_element_start('a', array('title' => ($other->fullname) ?
+-                                                                                              $other->fullname :
+-                                                                                              $other->nickname,
+-                                                                                              'href' => $other->profileurl,
+-                                                                                              'rel' => 'contact',
+-                                                                                              'class' => 'subscription fn url'));
+-                              $avatar = $other->getAvatar(AVATAR_MINI_SIZE);
+-                              common_element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
+-                                                                                      'width' => AVATAR_MINI_SIZE,
+-                                                                                      'height' => AVATAR_MINI_SIZE,
+-                                                                                      'class' => 'avatar mini photo',
+-                                                                                      'alt' =>  ($other->fullname) ?
+-                                                                                      $other->fullname :
+-                                                                                      $other->nickname));
+-                              common_element_end('a');
+-                              common_element_end('li');
+-                      }
++                common_element_start('li', 'vcard');
++                common_element_start('a', array('title' => ($other->fullname) ?
++                                                $other->fullname :
++                                                $other->nickname,
++                                                'href' => $other->profileurl,
++                                                'rel' => 'contact',
++                                                 'class' => 'subscription fn url'));
++                $avatar = $other->getAvatar(AVATAR_MINI_SIZE);
++                common_element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
++                                            'width' => AVATAR_MINI_SIZE,
++                                            'height' => AVATAR_MINI_SIZE,
++                                            'class' => 'avatar mini photo',
++                                            'alt' =>  ($other->fullname) ?
++                                            $other->fullname :
++                                            $other->nickname));
++                common_element_end('a');
++                common_element_end('li');
++            }
+hunk ./actions/showstream.php 327
+-                      common_element_end('ul');
+-              }
++            common_element_end('ul');
++        }
+hunk ./actions/showstream.php 330
+-              if ($subs_count > SUBSCRIPTIONS) {
+-                      common_element_start('p', array('id' => 'subscriptions_viewall'));
++        if ($subs_count > SUBSCRIPTIONS) {
++            common_element_start('p', array('id' => 'subscriptions_viewall'));
+hunk ./actions/showstream.php 333
+-                      common_element('a', array('href' => common_local_url('subscriptions',
+-                                                                                                                               array('nickname' => $profile->nickname)),
+-                                                                        'class' => 'moresubscriptions'),
+-                                                 _('All subscriptions'));
+-                      common_element_end('p');
+-              }
++            common_element('a', array('href' => common_local_url('subscriptions',
++                                                                 array('nickname' => $profile->nickname)),
++                                      'class' => 'moresubscriptions'),
++                           _('All subscriptions'));
++            common_element_end('p');
++        }
+hunk ./actions/showstream.php 340
+-              common_element_end('div');
+-      }
++        common_element_end('div');
++    }
+hunk ./actions/showstream.php 343
+-      function show_statistics($profile) {
++    function show_statistics($profile) {
+hunk ./actions/showstream.php 345
+-              // XXX: WORM cache this
+-              $subs = DB_DataObject::factory('subscription');
+-              $subs->subscriber = $profile->id;
+-              $subs_count = (int) $subs->count() - 1;
++        // XXX: WORM cache this
++        $subs = DB_DataObject::factory('subscription');
++        $subs->subscriber = $profile->id;
++        $subs_count = (int) $subs->count() - 1;
+hunk ./actions/showstream.php 350
+-              $subbed = DB_DataObject::factory('subscription');
+-              $subbed->subscribed = $profile->id;
+-              $subbed_count = (int) $subbed->count() - 1;
++        $subbed = DB_DataObject::factory('subscription');
++        $subbed->subscribed = $profile->id;
++        $subbed_count = (int) $subbed->count() - 1;
+hunk ./actions/showstream.php 354
+-              $notices = DB_DataObject::factory('notice');
+-              $notices->profile_id = $profile->id;
+-              $notice_count = (int) $notices->count();
++        $notices = DB_DataObject::factory('notice');
++        $notices->profile_id = $profile->id;
++        $notice_count = (int) $notices->count();
+hunk ./actions/showstream.php 358
+-              common_element_start('div', 'statistics');
+-              common_element('h2', 'statistics', _('Statistics'));
++        common_element_start('div', 'statistics');
++        common_element('h2', 'statistics', _('Statistics'));
+hunk ./actions/showstream.php 361
+-              # Other stats...?
+-              common_element_start('dl', 'statistics');
+-              common_element('dt', 'membersince', _('Member since'));
+-              common_element('dd', 'membersince', date('j M Y',
+-                                                                                               strtotime($profile->created)));
++        # Other stats...?
++        common_element_start('dl', 'statistics');
++        common_element('dt', 'membersince', _('Member since'));
++        common_element('dd', 'membersince', date('j M Y',
++                                                 strtotime($profile->created)));
+hunk ./actions/showstream.php 367
+-              common_element_start('dt', 'subscriptions');
+-              common_element('a', array('href' => common_local_url('subscriptions',
+-                                                                                                                       array('nickname' => $profile->nickname))),
+-                                         _('Subscriptions'));
+-              common_element_end('dt');
+-              common_element('dd', 'subscriptions', (is_int($subs_count)) ? $subs_count : '0');
+-              common_element_start('dt', 'subscribers');
+-              common_element('a', array('href' => common_local_url('subscribers',
+-                                                                                                                       array('nickname' => $profile->nickname))),
+-                                         _('Subscribers'));
+-              common_element_end('dt');
+-              common_element('dd', 'subscribers', (is_int($subbed_count)) ? $subbed_count : '0');
+-              common_element('dt', 'notices', _('Notices'));
+-              common_element('dd', 'notices', (is_int($notice_count)) ? $notice_count : '0');
+-              # XXX: link these to something
+-              common_element('dt', 'tags', _('Tags'));
+-              common_element_start('dd', 'tags');
+-              $tags = Profile_tag::getTags($profile->id, $profile->id);
++        common_element_start('dt', 'subscriptions');
++        common_element('a', array('href' => common_local_url('subscriptions',
++                                                             array('nickname' => $profile->nickname))),
++                       _('Subscriptions'));
++        common_element_end('dt');
++        common_element('dd', 'subscriptions', (is_int($subs_count)) ? $subs_count : '0');
++        common_element_start('dt', 'subscribers');
++        common_element('a', array('href' => common_local_url('subscribers',
++                                                             array('nickname' => $profile->nickname))),
++                       _('Subscribers'));
++        common_element_end('dt');
++        common_element('dd', 'subscribers', (is_int($subbed_count)) ? $subbed_count : '0');
++        common_element('dt', 'notices', _('Notices'));
++        common_element('dd', 'notices', (is_int($notice_count)) ? $notice_count : '0');
++        # XXX: link these to something
++        common_element('dt', 'tags', _('Tags'));
++        common_element_start('dd', 'tags');
++        $tags = Profile_tag::getTags($profile->id, $profile->id);
+hunk ./actions/showstream.php 386
+-              common_element_start('ul', 'tags xoxo');
+-              foreach ($tags as $tag) {
+-                      common_element_start('li');
+-                      common_element('a', array('rel' => 'bookmark tag',
+-                                                                        'href' => common_local_url('peopletag',
+-                                                                                                                               array('tag' => $tag))),
+-                                                 $tag);
+-                      common_element_end('li');
+-              }
+-              common_element_end('ul');
+-          common_element_end('dd');
++        common_element_start('ul', 'tags xoxo');
++        foreach ($tags as $tag) {
++            common_element_start('li');
++            common_element('a', array('rel' => 'bookmark tag',
++                                      'href' => common_local_url('peopletag',
++                                                                 array('tag' => $tag))),
++                           $tag);
++            common_element_end('li');
++        }
++        common_element_end('ul');
++        common_element_end('dd');
+hunk ./actions/showstream.php 398
+-              common_element_end('dl');
++        common_element_end('dl');
+hunk ./actions/showstream.php 400
+-              common_element_end('div');
+-      }
++        common_element_end('div');
++    }
+hunk ./actions/showstream.php 403
+-      function show_notices($user) {
++    function show_notices($user) {
+hunk ./actions/showstream.php 405
+-              $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
++        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+hunk ./actions/showstream.php 407
+-              $notice = $user->getNotices(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
++        $notice = $user->getNotices(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+hunk ./actions/showstream.php 412
+-              common_pagination($page>1, $cnt>NOTICES_PER_PAGE, $page,
+-                                                'showstream', array('nickname' => $user->nickname));
+-      }
++        common_pagination($page>1, $cnt>NOTICES_PER_PAGE, $page,
++                          'showstream', array('nickname' => $user->nickname));
++    }
+hunk ./actions/showstream.php 416
+-      function show_last_notice($profile) {
++    function show_last_notice($profile) {
+hunk ./actions/showstream.php 418
+-              common_element('h2', NULL, _('Currently'));
++        common_element('h2', NULL, _('Currently'));
+hunk ./actions/showstream.php 420
+-              $notice = $profile->getCurrentNotice();
++        $notice = $profile->getCurrentNotice();
+hunk ./actions/showstream.php 422
+-              if ($notice) {
+-                      # FIXME: URL, image, video, audio
+-                      common_element_start('p', array('class' => 'notice_current'));
+-                      if ($notice->rendered) {
+-                              common_raw($notice->rendered);
+-                      } else {
+-                              # XXX: may be some uncooked notices in the DB,
+-                              # we cook them right now. This can probably disappear in future
+-                              # versions (>> 0.4.x)
+-                              common_raw(common_render_content($notice->content, $notice));
+-                      }
+-                      common_element_end('p');
+-              }
+-      }
++        if ($notice) {
++            # FIXME: URL, image, video, audio
++            common_element_start('p', array('class' => 'notice_current'));
++            if ($notice->rendered) {
++                common_raw($notice->rendered);
++            } else {
++                # XXX: may be some uncooked notices in the DB,
++                # we cook them right now. This can probably disappear in future
++                # versions (>> 0.4.x)
++                common_raw(common_render_content($notice->content, $notice));
++            }
++            common_element_end('p');
++        }
++    }
+hunk ./actions/smssettings.php 27
+-      function get_instructions() {
+-              return _('You can receive SMS messages through email from %%site.name%%.');
+-      }
++    function get_instructions() {
++        return _('You can receive SMS messages through email from %%site.name%%.');
++    }
+hunk ./actions/smssettings.php 31
+-      function show_form($msg=NULL, $success=false) {
+-              $user = common_current_user();
+-              $this->form_header(_('SMS Settings'), $msg, $success);
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'smssettings',
+-                                                                                 'action' =>
+-                                                                                 common_local_url('smssettings')));
+-              common_hidden('token', common_session_token());
+-              common_element('h2', NULL, _('Address'));
++    function show_form($msg=NULL, $success=false) {
++        $user = common_current_user();
++        $this->form_header(_('SMS Settings'), $msg, $success);
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'smssettings',
++                                           'action' =>
++                                           common_local_url('smssettings')));
++        common_hidden('token', common_session_token());
++        common_element('h2', NULL, _('Address'));
+hunk ./actions/smssettings.php 41
+-              if ($user->sms) {
+-                      common_element_start('p');
+-                      $carrier = $user->getCarrier();
+-                      common_element('span', 'address confirmed', $user->sms . ' (' . $carrier->name . ')');
+-                      common_element('span', 'input_instructions',
+-                                     _('Current confirmed SMS-enabled phone number.'));
+-                      common_hidden('sms', $user->sms);
+-                      common_hidden('carrier', $user->carrier);
+-                      common_element_end('p');
+-                      common_submit('remove', _('Remove'));
+-              } else {
+-                      $confirm = $this->get_confirmation();
+-                      if ($confirm) {
+-                              $carrier = Sms_carrier::staticGet($confirm->address_extra);
+-                              common_element_start('p');
+-                              common_element('span', 'address unconfirmed', $confirm->address . ' (' . $carrier->name . ')');
+-                              common_element('span', 'input_instructions',
+-                                                         _('Awaiting confirmation on this phone number.'));
+-                              common_hidden('sms', $confirm->address);
+-                              common_hidden('carrier', $confirm->address_extra);
+-                              common_element_end('p');
+-                              common_submit('cancel', _('Cancel'));
+-                              common_input('code', _('Confirmation code'), NULL,
+-                                                       _('Enter the code you received on your phone.'));
+-                              common_submit('confirm', _('Confirm'));
+-                      } else {
+-                              common_input('sms', _('SMS Phone number'),
+-                                                       ($this->arg('sms')) ? $this->arg('sms') : NULL,
+-                                                       _('Phone number, no punctuation or spaces, with area code'));
+-                              $this->carrier_select();
+-                              common_submit('add', _('Add'));
+-                      }
+-              }
++        if ($user->sms) {
++            common_element_start('p');
++            $carrier = $user->getCarrier();
++            common_element('span', 'address confirmed', $user->sms . ' (' . $carrier->name . ')');
++            common_element('span', 'input_instructions',
++                           _('Current confirmed SMS-enabled phone number.'));
++            common_hidden('sms', $user->sms);
++            common_hidden('carrier', $user->carrier);
++            common_element_end('p');
++            common_submit('remove', _('Remove'));
++        } else {
++            $confirm = $this->get_confirmation();
++            if ($confirm) {
++                $carrier = Sms_carrier::staticGet($confirm->address_extra);
++                common_element_start('p');
++                common_element('span', 'address unconfirmed', $confirm->address . ' (' . $carrier->name . ')');
++                common_element('span', 'input_instructions',
++                               _('Awaiting confirmation on this phone number.'));
++                common_hidden('sms', $confirm->address);
++                common_hidden('carrier', $confirm->address_extra);
++                common_element_end('p');
++                common_submit('cancel', _('Cancel'));
++                common_input('code', _('Confirmation code'), NULL,
++                             _('Enter the code you received on your phone.'));
++                common_submit('confirm', _('Confirm'));
++            } else {
++                common_input('sms', _('SMS Phone number'),
++                             ($this->arg('sms')) ? $this->arg('sms') : NULL,
++                             _('Phone number, no punctuation or spaces, with area code'));
++                $this->carrier_select();
++                common_submit('add', _('Add'));
++            }
++        }
+hunk ./actions/smssettings.php 75
+-              if ($user->sms) {
+-                      common_element('h2', NULL, _('Incoming email'));
+-                      
+-                      if ($user->incomingemail) {
+-                              common_element_start('p');
+-                              common_element('span', 'address', $user->incomingemail);
+-                              common_element('span', 'input_instructions',
+-                                                         _('Send email to this address to post new notices.'));
+-                              common_element_end('p');
+-                              common_submit('removeincoming', _('Remove'));
+-                      }
+-                      
+-                      common_element_start('p');
+-                      common_element('span', 'input_instructions',
+-                                                 _('Make a new email address for posting to; cancels the old one.'));
+-                      common_element_end('p');
+-                      common_submit('newincoming', _('New'));
+-              }
+-              
+-              common_element('h2', NULL, _('Preferences'));
+-              
+-              common_checkbox('smsnotify',
+-                                              _('Send me notices through SMS; I understand I may incur exorbitant charges from my carrier.'),
+-                                              $user->smsnotify);
+-                      
+-              common_submit('save', _('Save'));
+-              
+-              common_element_end('form');
+-              common_show_footer();
+-      }
++        if ($user->sms) {
++            common_element('h2', NULL, _('Incoming email'));
++            
++            if ($user->incomingemail) {
++                common_element_start('p');
++                common_element('span', 'address', $user->incomingemail);
++                common_element('span', 'input_instructions',
++                               _('Send email to this address to post new notices.'));
++                common_element_end('p');
++                common_submit('removeincoming', _('Remove'));
++            }
++            
++            common_element_start('p');
++            common_element('span', 'input_instructions',
++                           _('Make a new email address for posting to; cancels the old one.'));
++            common_element_end('p');
++            common_submit('newincoming', _('New'));
++        }
++        
++        common_element('h2', NULL, _('Preferences'));
++        
++        common_checkbox('smsnotify',
++                        _('Send me notices through SMS; I understand I may incur exorbitant charges from my carrier.'),
++                        $user->smsnotify);
++            
++        common_submit('save', _('Save'));
++        
++        common_element_end('form');
++        common_show_footer();
++    }
+hunk ./actions/smssettings.php 106
+-      function get_confirmation() {
+-              $user = common_current_user();
+-              $confirm = new Confirm_address();
+-              $confirm->user_id = $user->id;
+-              $confirm->address_type = 'sms';
+-              if ($confirm->find(TRUE)) {
+-                      return $confirm;
+-              } else {
+-                      return NULL;
+-              }
+-      }
++    function get_confirmation() {
++        $user = common_current_user();
++        $confirm = new Confirm_address();
++        $confirm->user_id = $user->id;
++        $confirm->address_type = 'sms';
++        if ($confirm->find(TRUE)) {
++            return $confirm;
++        } else {
++            return NULL;
++        }
++    }
+hunk ./actions/smssettings.php 118
+-      function handle_post() {
++    function handle_post() {
+hunk ./actions/smssettings.php 120
+-              # CSRF protection
++        # CSRF protection
+hunk ./actions/smssettings.php 122
+-              $token = $this->trimmed('token');
+-              if (!$token || $token != common_session_token()) {
+-                      $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        $token = $this->trimmed('token');
++        if (!$token || $token != common_session_token()) {
++            $this->show_form(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/smssettings.php 128
+-              if ($this->arg('save')) {
+-                      $this->save_preferences();
+-              } else if ($this->arg('add')) {
+-                      $this->add_address();
+-              } else if ($this->arg('cancel')) {
+-                      $this->cancel_confirmation();
+-              } else if ($this->arg('remove')) {
+-                      $this->remove_address();
+-              } else if ($this->arg('removeincoming')) {
+-                      $this->remove_incoming();
+-              } else if ($this->arg('newincoming')) {
+-                      $this->new_incoming();
+-              } else if ($this->arg('confirm')) {
+-                      $this->confirm_code();
+-              } else {
+-                      $this->show_form(_('Unexpected form submission.'));
+-              }
+-      }
++        if ($this->arg('save')) {
++            $this->save_preferences();
++        } else if ($this->arg('add')) {
++            $this->add_address();
++        } else if ($this->arg('cancel')) {
++            $this->cancel_confirmation();
++        } else if ($this->arg('remove')) {
++            $this->remove_address();
++        } else if ($this->arg('removeincoming')) {
++            $this->remove_incoming();
++        } else if ($this->arg('newincoming')) {
++            $this->new_incoming();
++        } else if ($this->arg('confirm')) {
++            $this->confirm_code();
++        } else {
++            $this->show_form(_('Unexpected form submission.'));
++        }
++    }
+hunk ./actions/smssettings.php 147
+-      function save_preferences() {
++    function save_preferences() {
+hunk ./actions/smssettings.php 149
+-              $smsnotify = $this->boolean('smsnotify');
+-              
+-              $user = common_current_user();
++        $smsnotify = $this->boolean('smsnotify');
++        
++        $user = common_current_user();
+hunk ./actions/smssettings.php 153
+-              assert(!is_null($user)); # should already be checked
++        assert(!is_null($user)); # should already be checked
+hunk ./actions/smssettings.php 155
+-              $user->query('BEGIN');
++        $user->query('BEGIN');
+hunk ./actions/smssettings.php 157
+-              $original = clone($user);
++        $original = clone($user);
+hunk ./actions/smssettings.php 159
+-              $user->smsnotify = $smsnotify;
++        $user->smsnotify = $smsnotify;
+hunk ./actions/smssettings.php 161
+-              $result = $user->update($original);
++        $result = $user->update($original);
+hunk ./actions/smssettings.php 163
+-              if ($result === FALSE) {
+-                      common_log_db_error($user, 'UPDATE', __FILE__);
+-                      common_server_error(_('Couldn\'t update user.'));
+-                      return;
+-              }
++        if ($result === FALSE) {
++            common_log_db_error($user, 'UPDATE', __FILE__);
++            common_server_error(_('Couldn\'t update user.'));
++            return;
++        }
+hunk ./actions/smssettings.php 169
+-              $user->query('COMMIT');
++        $user->query('COMMIT');
+hunk ./actions/smssettings.php 171
+-              $this->show_form(_('Preferences saved.'), true);
+-      }
++        $this->show_form(_('Preferences saved.'), true);
++    }
+hunk ./actions/smssettings.php 174
+-      function add_address() {
++    function add_address() {
+hunk ./actions/smssettings.php 176
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/smssettings.php 178
+-              $sms = $this->trimmed('sms');
+-              $carrier_id = $this->trimmed('carrier');
+-              
+-              # Some validation
++        $sms = $this->trimmed('sms');
++        $carrier_id = $this->trimmed('carrier');
++        
++        # Some validation
+hunk ./actions/smssettings.php 183
+-              if (!$sms) {
+-                      $this->show_form(_('No phone number.'));
+-                      return;
+-              }
++        if (!$sms) {
++            $this->show_form(_('No phone number.'));
++            return;
++        }
+hunk ./actions/smssettings.php 188
+-              if (!$carrier_id) {
+-                      $this->show_form(_('No carrier selected.'));
+-                      return;
+-              }
+-              
+-              $sms = common_canonical_sms($sms);
+-              
+-              if ($user->sms == $sms) {
+-                  $this->show_form(_('That is already your phone number.'));
+-                  return;
+-              } else if ($this->sms_exists($sms)) {
+-                  $this->show_form(_('That phone number already belongs to another user.'));
+-                  return;
+-              }
++        if (!$carrier_id) {
++            $this->show_form(_('No carrier selected.'));
++            return;
++        }
++        
++        $sms = common_canonical_sms($sms);
++        
++        if ($user->sms == $sms) {
++            $this->show_form(_('That is already your phone number.'));
++            return;
++        } else if ($this->sms_exists($sms)) {
++            $this->show_form(_('That phone number already belongs to another user.'));
++            return;
++        }
+hunk ./actions/smssettings.php 203
+-              $confirm = new Confirm_address();
+-              $confirm->address = $sms;
+-              $confirm->address_extra = $carrier_id;
+-              $confirm->address_type = 'sms';
+-              $confirm->user_id = $user->id;
+-              $confirm->code = common_confirmation_code(40);
++          $confirm = new Confirm_address();
++           $confirm->address = $sms;
++           $confirm->address_extra = $carrier_id;
++           $confirm->address_type = 'sms';
++           $confirm->user_id = $user->id;
++           $confirm->code = common_confirmation_code(40);
+hunk ./actions/smssettings.php 210
+-              $result = $confirm->insert();
++        $result = $confirm->insert();
+hunk ./actions/smssettings.php 212
+-              if ($result === FALSE) {
+-                      common_log_db_error($confirm, 'INSERT', __FILE__);
+-                      common_server_error(_('Couldn\'t insert confirmation code.'));
+-                      return;
+-              }
++        if ($result === FALSE) {
++            common_log_db_error($confirm, 'INSERT', __FILE__);
++            common_server_error(_('Couldn\'t insert confirmation code.'));
++            return;
++        }
+hunk ./actions/smssettings.php 218
+-              $carrier = Sms_carrier::staticGet($carrier_id);
+-              
+-              mail_confirm_sms($confirm->code,
+-                                               $user->nickname,
+-                                               $carrier->toEmailAddress($sms));
++        $carrier = Sms_carrier::staticGet($carrier_id);
++        
++        mail_confirm_sms($confirm->code,
++                         $user->nickname,
++                         $carrier->toEmailAddress($sms));
+hunk ./actions/smssettings.php 224
+-              $msg = _('A confirmation code was sent to the phone number you added. Check your inbox (and spam box!) for the code and instructions on how to use it.');
++        $msg = _('A confirmation code was sent to the phone number you added. Check your inbox (and spam box!) for the code and instructions on how to use it.');
+hunk ./actions/smssettings.php 226
+-              $this->show_form($msg, TRUE);
+-      }
++        $this->show_form($msg, TRUE);
++    }
+hunk ./actions/smssettings.php 229
+-      function cancel_confirmation() {
+-              
+-              $sms = $this->trimmed('sms');
+-              $carrier = $this->trimmed('carrier');
+-              
+-              $confirm = $this->get_confirmation();
+-              
+-              if (!$confirm) {
+-                      $this->show_form(_('No pending confirmation to cancel.'));
+-                      return;
+-              }
+-              if ($confirm->address != $sms) {
+-                      $this->show_form(_('That is the wrong confirmation number.'));
+-                      return;
+-              }
++    function cancel_confirmation() {
++        
++        $sms = $this->trimmed('sms');
++        $carrier = $this->trimmed('carrier');
++        
++        $confirm = $this->get_confirmation();
++        
++        if (!$confirm) {
++            $this->show_form(_('No pending confirmation to cancel.'));
++            return;
++        }
++        if ($confirm->address != $sms) {
++            $this->show_form(_('That is the wrong confirmation number.'));
++            return;
++        }
+hunk ./actions/smssettings.php 248
+-                      common_log_db_error($confirm, 'DELETE', __FILE__);
++            common_log_db_error($confirm, 'DELETE', __FILE__);
+hunk ./actions/smssettings.php 254
+-      }
++    }
+hunk ./actions/smssettings.php 256
+-      function remove_address() {
++    function remove_address() {
+hunk ./actions/smssettings.php 258
+-              $user = common_current_user();
+-              $sms = $this->arg('sms');
+-              $carrier = $this->arg('carrier');
+-              
+-              # Maybe an old tab open...?
++        $user = common_current_user();
++        $sms = $this->arg('sms');
++        $carrier = $this->arg('carrier');
++        
++        # Maybe an old tab open...?
+hunk ./actions/smssettings.php 264
+-              if ($user->sms != $sms) {
+-                  $this->show_form(_('That is not your phone number.'));
+-                  return;
+-              }
++        if ($user->sms != $sms) {
++            $this->show_form(_('That is not your phone number.'));
++            return;
++        }
+hunk ./actions/smssettings.php 269
+-              $user->query('BEGIN');
+-              $original = clone($user);
+-              $user->sms = NULL;
+-              $user->carrier = NULL;          
+-              $user->smsemail = NULL;         
+-              $result = $user->updateKeys($original);
+-              if (!$result) {
+-                      common_log_db_error($user, 'UPDATE', __FILE__);
+-                      common_server_error(_('Couldn\'t update user.'));
+-                      return;
+-              }
+-              $user->query('COMMIT');
++        $user->query('BEGIN');
++        $original = clone($user);
++        $user->sms = NULL;
++        $user->carrier = NULL;        
++        $user->smsemail = NULL;        
++        $result = $user->updateKeys($original);
++        if (!$result) {
++            common_log_db_error($user, 'UPDATE', __FILE__);
++            common_server_error(_('Couldn\'t update user.'));
++            return;
++        }
++        $user->query('COMMIT');
+hunk ./actions/smssettings.php 282
+-              $this->show_form(_('The address was removed.'), TRUE);
+-      }
+-      
+-      function sms_exists($sms) {
+-              $user = common_current_user();
+-              $other = User::staticGet('sms', $sms);
+-              if (!$other) {
+-                      return false;
+-              } else {
+-                      return $other->id != $user->id;
+-              }
+-      }
++        $this->show_form(_('The address was removed.'), TRUE);
++    }
++    
++    function sms_exists($sms) {
++        $user = common_current_user();
++        $other = User::staticGet('sms', $sms);
++        if (!$other) {
++            return false;
++        } else {
++            return $other->id != $user->id;
++        }
++    }
+hunk ./actions/smssettings.php 295
+-      function carrier_select() {
+-              $carrier = new Sms_carrier();
+-              $cnt = $carrier->find();
++    function carrier_select() {
++        $carrier = new Sms_carrier();
++        $cnt = $carrier->find();
+hunk ./actions/smssettings.php 299
+-              common_element_start('p');
+-              common_element('label', array('for' => 'carrier'));
+-              common_element_start('select', array('name' => 'carrier',
+-                                                                                       'id' => 'carrier'));
+-              common_element('option', array('value' => 0),
+-                                         _('Select a carrier'));
+-              while ($carrier->fetch()) {
+-                      common_element('option', array('value' => $carrier->id),
+-                                                 $carrier->name);
+-              }
+-              common_element_end('select');
+-              common_element_end('p');
+-              common_element('span', 'input_instructions',
+-                                         sprintf(_('Mobile carrier for your phone. '.
+-                                                               'If you know a carrier that accepts ' . 
+-                                                               'SMS over email but isn\'t listed here, ' .
+-                                                               'send email to let us know at %s.'),
+-                                                         common_config('site', 'email')));
+-      }
++        common_element_start('p');
++        common_element('label', array('for' => 'carrier'));
++        common_element_start('select', array('name' => 'carrier',
++                                             'id' => 'carrier'));
++        common_element('option', array('value' => 0),
++                       _('Select a carrier'));
++        while ($carrier->fetch()) {
++            common_element('option', array('value' => $carrier->id),
++                           $carrier->name);
++        }
++        common_element_end('select');
++        common_element_end('p');
++        common_element('span', 'input_instructions',
++                       sprintf(_('Mobile carrier for your phone. '.
++                                 'If you know a carrier that accepts ' . 
++                                 'SMS over email but isn\'t listed here, ' .
++                                 'send email to let us know at %s.'),
++                               common_config('site', 'email')));
++    }
+hunk ./actions/smssettings.php 319
+-      function confirm_code() {
+-              
+-              $code = $this->trimmed('code');
+-              
+-              if (!$code) {
+-                      $this->show_form(_('No code entered'));
+-                      return;
+-              }
+-              
+-              common_redirect(common_local_url('confirmaddress', 
+-                                                                               array('code' => $code)));
+-      }
++    function confirm_code() {
++        
++        $code = $this->trimmed('code');
++        
++        if (!$code) {
++            $this->show_form(_('No code entered'));
++            return;
++        }
++        
++        common_redirect(common_local_url('confirmaddress', 
++                                         array('code' => $code)));
++    }
+hunk ./actions/subedit.php 35
+-              $token = $this->trimmed('token');
++        $token = $this->trimmed('token');
+hunk ./actions/subedit.php 37
+-              if (!$token || $token != common_session_token()) {
+-                      $this->client_error(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        if (!$token || $token != common_session_token()) {
++            $this->client_error(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/subscribe.php 24
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/subscribe.php 27
+-              if (!common_logged_in()) {
+-                      common_user_error(_('Not logged in.'));
+-                      return;
+-              }
++        if (!common_logged_in()) {
++            common_user_error(_('Not logged in.'));
++            return;
++        }
+hunk ./actions/subscribe.php 32
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/subscribe.php 34
+-              if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+-                      common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname)));
+-                      return;
+-              }
++        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
++            common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname)));
++            return;
++        }
+hunk ./actions/subscribe.php 39
+-              # CSRF protection
++        # CSRF protection
+hunk ./actions/subscribe.php 41
+-              $token = $this->trimmed('token');
++        $token = $this->trimmed('token');
+hunk ./actions/subscribe.php 43
+-              if (!$token || $token != common_session_token()) {
+-                      $this->client_error(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        if (!$token || $token != common_session_token()) {
++            $this->client_error(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/subscribe.php 48
+-              $other_id = $this->arg('subscribeto');
++        $other_id = $this->arg('subscribeto');
+hunk ./actions/subscribe.php 53
+-                      $this->client_error(_('Not a local user.'));
+-                      return;
++            $this->client_error(_('Not a local user.'));
++            return;
+hunk ./actions/subscribe.php 57
+-              $result = subs_subscribe_to($user, $other);
++        $result = subs_subscribe_to($user, $other);
+hunk ./actions/subscribe.php 59
+-              if($result != true) {
+-                      common_user_error($result);
+-                      return;
+-              }
++        if($result != true) {
++            common_user_error($result);
++            return;
++        }
+hunk ./actions/subscribe.php 64
+-              if ($this->boolean('ajax')) {
+-                      common_start_html('text/xml;charset=utf-8', true);
+-                      common_element_start('head');
+-                      common_element('title', null, _('Subscribed'));
+-                      common_element_end('head');
+-                      common_element_start('body');
+-                      common_unsubscribe_form($other->getProfile());
+-                      common_element_end('body');
+-                      common_element_end('html');
+-              } else {
+-                  common_redirect(common_local_url('subscriptions', array('nickname' =>
+-                                                                                                                              $user->nickname)));
++        if ($this->boolean('ajax')) {
++            common_start_html('text/xml;charset=utf-8', true);
++            common_element_start('head');
++            common_element('title', null, _('Subscribed'));
++            common_element_end('head');
++            common_element_start('body');
++            common_unsubscribe_form($other->getProfile());
++            common_element_end('body');
++            common_element_end('html');
++        } else {
++            common_redirect(common_local_url('subscriptions', array('nickname' =>
++                                                                $user->nickname)));
+hunk ./actions/subscribe.php 77
+-      }
++    }
+hunk ./actions/subscribers.php 26
+-      function gallery_type() {
+-              return _('Subscribers');
+-      }
++    function gallery_type() {
++        return _('Subscribers');
++    }
+hunk ./actions/subscribers.php 30
+-      function get_instructions(&$profile) {
+-              $user =& common_current_user();
+-              if ($user && ($user->id == $profile->id)) {
+-                      return _('These are the people who listen to your notices.');
+-              } else {
+-                      return sprintf(_('These are the people who listen to %s\'s notices.'), $profile->nickname);
+-              }
+-      }
++    function get_instructions(&$profile) {
++        $user =& common_current_user();
++        if ($user && ($user->id == $profile->id)) {
++            return _('These are the people who listen to your notices.');
++        } else {
++            return sprintf(_('These are the people who listen to %s\'s notices.'), $profile->nickname);
++        }
++    }
+hunk ./actions/subscribers.php 39
+-      function fields() {
+-              return array('subscriber', 'subscribed');
+-      }
++    function fields() {
++        return array('subscriber', 'subscribed');
++    }
+hunk ./actions/subscribers.php 43
+-      function div_class() {
+-              return 'subscribers';
+-      }
++    function div_class() {
++        return 'subscribers';
++    }
+hunk ./actions/subscribers.php 47
+-      function get_other(&$subs) {
+-              return $subs->subscriber;
+-      }
++    function get_other(&$subs) {
++        return $subs->subscriber;
++    }
+hunk ./actions/subscriptions.php 26
+-      function gallery_type() {
+-              return _('Subscriptions');
+-      }
++    function gallery_type() {
++        return _('Subscriptions');
++    }
+hunk ./actions/subscriptions.php 30
+-      function get_instructions(&$profile) {
+-              $user =& common_current_user();
+-              if ($user && ($user->id == $profile->id)) {
+-                      return _('These are the people whose notices you listen to.');
+-              } else {
+-                      return sprintf(_('These are the people whose notices %s listens to.'), $profile->nickname);
+-              }
+-      }
++    function get_instructions(&$profile) {
++        $user =& common_current_user();
++        if ($user && ($user->id == $profile->id)) {
++            return _('These are the people whose notices you listen to.');
++        } else {
++            return sprintf(_('These are the people whose notices %s listens to.'), $profile->nickname);
++        }
++    }
+hunk ./actions/subscriptions.php 39
+-      function fields() {
+-              return array('subscribed', 'subscriber');
+-      }
++    function fields() {
++        return array('subscribed', 'subscriber');
++    }
+hunk ./actions/subscriptions.php 43
+-      function div_class() {
+-              return 'subscriptions';
+-      }
++    function div_class() {
++        return 'subscriptions';
++    }
+hunk ./actions/subscriptions.php 47
+-      function get_other(&$subs) {
+-              return $subs->subscribed;
+-      }
++    function get_other(&$subs) {
++        return $subs->subscribed;
++    }
+hunk ./actions/subscriptions.php 60
+-              $sub = Subscription::pkeyGet(array('subscriber' => $this->owner->id,
+-                                                                                 'subscribed' => $profile->id));
++        $sub = Subscription::pkeyGet(array('subscriber' => $this->owner->id,
++                                           'subscribed' => $profile->id));
+hunk ./actions/sup.php 23
+-      
+-      function handle($args) {
+-              
+-              parent::handle($args);
+-              
+-              $seconds = $this->trimmed('seconds');
+-              
+-              if (!$seconds) {
+-                      $seconds = 15;
+-              }
++    
++    function handle($args) {
++        
++        parent::handle($args);
++        
++        $seconds = $this->trimmed('seconds');
++        
++        if (!$seconds) {
++            $seconds = 15;
++        }
+hunk ./actions/sup.php 34
+-              $updates = $this->get_updates($seconds);
+-              
+-              header('Content-Type: application/json; charset=utf-8');
+-              
+-              print json_encode(array('updated_time' => date('c'),
+-                                                              'since_time' => date('c', time() - $seconds),
+-                                                              'available_periods' => $this->available_periods(),
+-                                                              'period' => $seconds,
+-                                                              'updates' => $updates));
+-      }
+-      
+-      function available_periods() {
+-              static $periods = array(86400, 43200, 21600, 7200,
+-                                                              3600, 1800,     600, 300, 120,
+-                                                              60, 30, 15); 
+-              $available = array();
+-              foreach ($periods as $period) {
+-                      $available[$period] = common_local_url('sup',
+-                                                                                                 array('seconds' => $period));
+-              }
+-              
+-              return $available;
+-      }
+-      
+-      function get_updates($seconds) {
+-              $notice = new Notice();
++        $updates = $this->get_updates($seconds);
++        
++        header('Content-Type: application/json; charset=utf-8');
++        
++        print json_encode(array('updated_time' => date('c'),
++                                'since_time' => date('c', time() - $seconds),
++                                'available_periods' => $this->available_periods(),
++                                'period' => $seconds,
++                                'updates' => $updates));
++    }
++    
++    function available_periods() {
++        static $periods = array(86400, 43200, 21600, 7200,
++                                3600, 1800,    600, 300, 120,
++                                60, 30, 15); 
++        $available = array();
++        foreach ($periods as $period) {
++            $available[$period] = common_local_url('sup',
++                                                   array('seconds' => $period));
++        }
++        
++        return $available;
++    }
++    
++    function get_updates($seconds) {
++        $notice = new Notice();
+hunk ./actions/sup.php 61
+-              # XXX: cache this. Depends on how big this protocol becomes;
+-              # Re-doing this query every 15 seconds isn't the end of the world.
++        # XXX: cache this. Depends on how big this protocol becomes;
++        # Re-doing this query every 15 seconds isn't the end of the world.
+hunk ./actions/sup.php 64
+-              $notice->query('SELECT profile_id, max(id) AS max_id ' .
+-                                         'FROM notice ' .
+-                                         'WHERE created > (now() - ' . $seconds . ') ' .
+-                                         'GROUP BY profile_id');
+-              
+-              $updates = array();
+-              
+-              while ($notice->fetch()) {
+-                      $updates[] = array($notice->profile_id, $notice->max_id);
+-              }
+-              
+-              return $updates;
+-      }
+-      
+-      function is_readonly() {
+-              return true;
+-      }
++        $notice->query('SELECT profile_id, max(id) AS max_id ' .
++                       'FROM notice ' .
++                       'WHERE created > (now() - ' . $seconds . ') ' .
++                       'GROUP BY profile_id');
++        
++        $updates = array();
++        
++        while ($notice->fetch()) {
++            $updates[] = array($notice->profile_id, $notice->max_id);
++        }
++        
++        return $updates;
++    }
++    
++    function is_readonly() {
++        return true;
++    }
+hunk ./actions/tag.php 27
+-      function handle($args) {
++    function handle($args) {
+hunk ./actions/tag.php 29
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/tag.php 31
+-              # Looks like we're good; show the header
++        # Looks like we're good; show the header
+hunk ./actions/tag.php 33
+-              if (isset($args['tag']) && $args['tag']) {
+-                      $tag = $args['tag'];
+-                      common_show_header(sprintf(_("Notices tagged with %s"), $tag),
+-                                                         array($this, 'show_header'), $tag,
+-                                                         array($this, 'show_top'));
+-                      $this->show_notices($tag);
+-              } else {
+-                      common_show_header(_("Tags"),
+-                                                         array($this, 'show_header'), '',
+-                                                         array($this, 'show_top'));
+-                      $this->show_tags();
+-              }
++        if (isset($args['tag']) && $args['tag']) {
++            $tag = $args['tag'];
++            common_show_header(sprintf(_("Notices tagged with %s"), $tag),
++                               array($this, 'show_header'), $tag,
++                               array($this, 'show_top'));
++            $this->show_notices($tag);
++        } else {
++            common_show_header(_("Tags"),
++                               array($this, 'show_header'), '',
++                               array($this, 'show_top'));
++            $this->show_tags();
++        }
+hunk ./actions/tag.php 46
+-              common_show_footer();
+-      }
++        common_show_footer();
++    }
+hunk ./actions/tag.php 49
+-      function show_header($tag = false) {
+-              if ($tag) {
+-                      common_element('link', array('rel' => 'alternate',
+-                                                                               'href' => common_local_url('tagrss', array('tag' => $tag)),
+-                                                                               'type' => 'application/rss+xml',
+-                                                                               'title' => sprintf(_('Feed for tag %s'), $tag)));
+-              }
+-      }
++    function show_header($tag = false) {
++        if ($tag) {
++            common_element('link', array('rel' => 'alternate',
++                                         'href' => common_local_url('tagrss', array('tag' => $tag)),
++                                         'type' => 'application/rss+xml',
++                                         'title' => sprintf(_('Feed for tag %s'), $tag)));
++        }
++    }
+hunk ./actions/tag.php 58
+-      function get_instructions() {
+-              return _('Showing most popular tags from the last week');
+-      }
++    function get_instructions() {
++        return _('Showing most popular tags from the last week');
++    }
+hunk ./actions/tag.php 62
+-      function show_top($tag = false) {
+-              if (!$tag) {
+-                      $instr = $this->get_instructions();
+-                      $output = common_markup_to_html($instr);
+-                      common_element_start('div', 'instructions');
+-                      common_raw($output);
+-                      common_element_end('div');
+-                      $this->public_views_menu();
+-              }
+-              else {
+-                      $this->show_feeds_list(array(0=>array('href'=>common_local_url('tagrss'),
+-                                                                                                'type' => 'rss',
+-                                                                                                'version' => 'RSS 1.0',
+-                                                                                                'item' => 'tagrss')));
+-              }
+-      }
++    function show_top($tag = false) {
++        if (!$tag) {
++            $instr = $this->get_instructions();
++            $output = common_markup_to_html($instr);
++            common_element_start('div', 'instructions');
++            common_raw($output);
++            common_element_end('div');
++            $this->public_views_menu();
++        }
++        else {
++            $this->show_feeds_list(array(0=>array('href'=>common_local_url('tagrss'),
++                                                  'type' => 'rss',
++                                                  'version' => 'RSS 1.0',
++                                                  'item' => 'tagrss')));
++        }
++    }
+hunk ./actions/tag.php 79
+-      function show_tags()
+-      {
+-              # This should probably be cached rather than recalculated
+-              $tags = DB_DataObject::factory('Notice_tag');
++    function show_tags()
++    {
++        # This should probably be cached rather than recalculated
++        $tags = DB_DataObject::factory('Notice_tag');
+hunk ./actions/tag.php 84
+-              #Need to clear the selection and then only re-add the field
+-              #we are grouping by, otherwise it's not a valid 'group by'
+-              #even though MySQL seems to let it slide...
+-              $tags->selectAdd();
+-              $tags->selectAdd('tag');
++        #Need to clear the selection and then only re-add the field
++        #we are grouping by, otherwise it's not a valid 'group by'
++        #even though MySQL seems to let it slide...
++        $tags->selectAdd();
++        $tags->selectAdd('tag');
+hunk ./actions/tag.php 90
+-              #Add the aggregated columns...
+-              $tags->selectAdd('max(notice_id) as last_notice_id');
+-              if(common_config('db','type')=='pgsql') {
+-                      $calc='sum(exp(-extract(epoch from (now()-created))/%s)) as weight';
+-              } else {
+-                      $calc='sum(exp(-(now() - created)/%s)) as weight';
+-              }
+-              $tags->selectAdd(sprintf($calc, common_config('tag', 'dropoff')));
+-              $tags->groupBy('tag');
+-              $tags->orderBy('weight DESC');
++        #Add the aggregated columns...
++        $tags->selectAdd('max(notice_id) as last_notice_id');
++        if(common_config('db','type')=='pgsql') {
++            $calc='sum(exp(-extract(epoch from (now()-created))/%s)) as weight';
++        } else {
++            $calc='sum(exp(-(now() - created)/%s)) as weight';
++        }
++        $tags->selectAdd(sprintf($calc, common_config('tag', 'dropoff')));
++        $tags->groupBy('tag');
++        $tags->orderBy('weight DESC');
+hunk ./actions/tag.php 101
+-              # $tags->whereAdd('created > "' . strftime('%Y-%m-%d %H:%M:%S', strtotime('-1 MONTH')) . '"');
++        # $tags->whereAdd('created > "' . strftime('%Y-%m-%d %H:%M:%S', strtotime('-1 MONTH')) . '"');
+hunk ./actions/tag.php 103
+-              $tags->limit(TAGS_PER_PAGE);
++        $tags->limit(TAGS_PER_PAGE);
+hunk ./actions/tag.php 105
+-              $cnt = $tags->find();
++        $cnt = $tags->find();
+hunk ./actions/tag.php 107
+-              if ($cnt > 0) {
+-                      common_element_start('p', 'tagcloud');
++        if ($cnt > 0) {
++            common_element_start('p', 'tagcloud');
+hunk ./actions/tag.php 110
+-                      $tw = array();
+-                      $sum = 0;
+-                      while ($tags->fetch()) {
+-                              $tw[$tags->tag] = $tags->weight;
+-                              $sum += $tags->weight;
+-                      }
++            $tw = array();
++            $sum = 0;
++            while ($tags->fetch()) {
++                $tw[$tags->tag] = $tags->weight;
++                $sum += $tags->weight;
++            }
+hunk ./actions/tag.php 117
+-                      ksort($tw);
++            ksort($tw);
+hunk ./actions/tag.php 119
+-                      foreach ($tw as $tag => $weight) {
+-                              $this->show_tag($tag, $weight, $weight/$sum);
+-                      }
++            foreach ($tw as $tag => $weight) {
++                $this->show_tag($tag, $weight, $weight/$sum);
++            }
+hunk ./actions/tag.php 123
+-                      common_element_end('p');
+-              }
+-      }
++            common_element_end('p');
++        }
++    }
+hunk ./actions/tag.php 127
+-      function show_tag($tag, $weight, $relative) {
++    function show_tag($tag, $weight, $relative) {
+hunk ./actions/tag.php 129
+-              # XXX: these should probably tune to the size of the site
+-              if ($relative > 0.1) {
+-                      $cls =  'largest';
+-              } else if ($relative > 0.05) {
+-                      $cls = 'verylarge';
+-              } else if ($relative > 0.02) {
+-                      $cls = 'large';
+-              } else if ($relative > 0.01) {
+-                      $cls = 'medium';
+-              } else if ($relative > 0.005) {
+-                      $cls = 'small';
+-              } else if ($relative > 0.002) {
+-                      $cls = 'verysmall';
+-              } else {
+-                      $cls = 'smallest';
+-              }
++        # XXX: these should probably tune to the size of the site
++        if ($relative > 0.1) {
++            $cls =  'largest';
++        } else if ($relative > 0.05) {
++            $cls = 'verylarge';
++        } else if ($relative > 0.02) {
++            $cls = 'large';
++        } else if ($relative > 0.01) {
++            $cls = 'medium';
++        } else if ($relative > 0.005) {
++            $cls = 'small';
++        } else if ($relative > 0.002) {
++            $cls = 'verysmall';
++        } else {
++            $cls = 'smallest';
++        }
+hunk ./actions/tag.php 146
+-              common_element('a', array('class' => "$cls weight-$weight relative-$relative",
+-                                                                'href' => common_local_url('tag', array('tag' => $tag))),
+-                                         $tag);
+-              common_text(' ');
+-      }
++        common_element('a', array('class' => "$cls weight-$weight relative-$relative",
++                                  'href' => common_local_url('tag', array('tag' => $tag))),
++                       $tag);
++        common_text(' ');
++    }
+hunk ./actions/tag.php 152
+-      function show_notices($tag) {
++    function show_notices($tag) {
+hunk ./actions/tag.php 154
+-              $cnt = 0;
++        $cnt = 0;
+hunk ./actions/tag.php 156
+-              $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
++        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+hunk ./actions/tag.php 158
+-              $notice = Notice_tag::getStream($tag, (($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
++        $notice = Notice_tag::getStream($tag, (($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
+hunk ./actions/tag.php 162
+-              common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+-                                                $page, 'tag', array('tag' => $tag));
+-      }
++        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
++                          $page, 'tag', array('tag' => $tag));
++    }
+hunk ./actions/tagother.php 26
+-      function handle($args) {
++    function handle($args) {
+hunk ./actions/tagother.php 28
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/tagother.php 30
+-              if (!common_logged_in()) {
+-                      $this->client_error(_('Not logged in'), 403);
+-                      return;
+-              }
++        if (!common_logged_in()) {
++            $this->client_error(_('Not logged in'), 403);
++            return;
++        }
+hunk ./actions/tagother.php 35
+-              if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+-                      $this->save_tags();
+-              } else {
+-                      $id = $this->trimmed('id');
+-                      if (!$id) {
+-                              $this->client_error(_('No id argument.'));
+-                              return;
+-                      }
+-                      $profile = Profile::staticGet('id', $id);
+-                      if (!$profile) {
+-                              $this->client_error(_('No profile with that ID.'));
+-                              return;
+-                      }
+-                      $this->show_form($profile);
+-              }
+-      }
++        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
++            $this->save_tags();
++        } else {
++            $id = $this->trimmed('id');
++            if (!$id) {
++                $this->client_error(_('No id argument.'));
++                return;
++            }
++            $profile = Profile::staticGet('id', $id);
++            if (!$profile) {
++                $this->client_error(_('No profile with that ID.'));
++                return;
++            }
++            $this->show_form($profile);
++        }
++    }
+hunk ./actions/tagother.php 52
+-      function show_form($profile, $error=NULL) {
++    function show_form($profile, $error=NULL) {
+hunk ./actions/tagother.php 54
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/tagother.php 56
+-              common_show_header(_('Tag a person'),
+-                                                 NULL, array($profile, $error), array($this, 'show_top'));
++        common_show_header(_('Tag a person'),
++                           NULL, array($profile, $error), array($this, 'show_top'));
+hunk ./actions/tagother.php 59
+-              $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
++        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+hunk ./actions/tagother.php 61
+-              common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
+-                                                                      'class' => 'avatar stream',
+-                                                                      'width' => AVATAR_PROFILE_SIZE,
+-                                                                      'height' => AVATAR_PROFILE_SIZE,
+-                                                                      'alt' =>
+-                                                                      ($profile->fullname) ? $profile->fullname :
+-                                                                      $profile->nickname));
++        common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
++                                    'class' => 'avatar stream',
++                                    'width' => AVATAR_PROFILE_SIZE,
++                                    'height' => AVATAR_PROFILE_SIZE,
++                                    'alt' =>
++                                    ($profile->fullname) ? $profile->fullname :
++                                    $profile->nickname));
+hunk ./actions/tagother.php 69
+-              common_element('a', array('href' => $profile->profileurl,
+-                                                                'class' => 'external profile nickname'),
+-                                         $profile->nickname);
++        common_element('a', array('href' => $profile->profileurl,
++                                  'class' => 'external profile nickname'),
++                       $profile->nickname);
+hunk ./actions/tagother.php 73
+-              if ($profile->fullname) {
+-                      common_element_start('div', 'fullname');
+-                      if ($profile->homepage) {
+-                              common_element('a', array('href' => $profile->homepage),
+-                                                         $profile->fullname);
+-                      } else {
+-                              common_text($profile->fullname);
+-                      }
+-                      common_element_end('div');
+-              }
+-              if ($profile->location) {
+-                      common_element('div', 'location', $profile->location);
+-              }
+-              if ($profile->bio) {
+-                      common_element('div', 'bio', $profile->bio);
+-              }
++        if ($profile->fullname) {
++            common_element_start('div', 'fullname');
++            if ($profile->homepage) {
++                common_element('a', array('href' => $profile->homepage),
++                               $profile->fullname);
++            } else {
++                common_text($profile->fullname);
++            }
++            common_element_end('div');
++        }
++        if ($profile->location) {
++            common_element('div', 'location', $profile->location);
++        }
++        if ($profile->bio) {
++            common_element('div', 'bio', $profile->bio);
++        }
+hunk ./actions/tagother.php 90
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'tag_user',
+-                                                                                 'name' => 'tagother',
+-                                                                                 'action' => $this->self_url()));
+-              common_hidden('token', common_session_token());
+-              common_hidden('id', $profile->id);
+-              common_input('tags', _('Tags'),
+-                                       ($this->arg('tags')) ? $this->arg('tags') : implode(' ', Profile_tag::getTags($user->id, $profile->id)),
+-                                       _('Tags for this user (letters, numbers, -, ., and _), comma- or space- separated'));
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'tag_user',
++                                           'name' => 'tagother',
++                                           'action' => $this->self_url()));
++        common_hidden('token', common_session_token());
++        common_hidden('id', $profile->id);
++        common_input('tags', _('Tags'),
++                     ($this->arg('tags')) ? $this->arg('tags') : implode(' ', Profile_tag::getTags($user->id, $profile->id)),
++                     _('Tags for this user (letters, numbers, -, ., and _), comma- or space- separated'));
+hunk ./actions/tagother.php 100
+-              common_submit('save', _('Save'));
+-              common_element_end('form');
+-              common_show_footer();
++        common_submit('save', _('Save'));
++        common_element_end('form');
++        common_show_footer();
+hunk ./actions/tagother.php 104
+-      }
++    }
+hunk ./actions/tagother.php 106
+-      function save_tags() {
++    function save_tags() {
+hunk ./actions/tagother.php 108
+-              $id = $this->trimmed('id');
+-              $tagstring = $this->trimmed('tags');
+-              $token = $this->trimmed('token');
++        $id = $this->trimmed('id');
++        $tagstring = $this->trimmed('tags');
++        $token = $this->trimmed('token');
+hunk ./actions/tagother.php 112
+-              if (!$token || $token != common_session_token()) {
+-                      $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        if (!$token || $token != common_session_token()) {
++            $this->show_form(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/tagother.php 117
+-              $profile = Profile::staticGet('id', $id);
++        $profile = Profile::staticGet('id', $id);
+hunk ./actions/tagother.php 119
+-              if (!$profile) {
+-                      $this->client_error(_('No such profile.'));
+-                      return;
+-              }
++        if (!$profile) {
++            $this->client_error(_('No such profile.'));
++            return;
++        }
+hunk ./actions/tagother.php 124
+-              if (is_string($tagstring) && strlen($tagstring) > 0) {
++        if (is_string($tagstring) && strlen($tagstring) > 0) {
+hunk ./actions/tagother.php 126
+-                      $tags = array_map('common_canonical_tag',
+-                                                        preg_split('/[\s,]+/', $tagstring));
++            $tags = array_map('common_canonical_tag',
++                              preg_split('/[\s,]+/', $tagstring));
+hunk ./actions/tagother.php 129
+-                      foreach ($tags as $tag) {
+-                              if (!common_valid_profile_tag($tag)) {
+-                                      $this->show_form($profile, sprintf(_('Invalid tag: "%s"'), $tag));
+-                                      return;
+-                              }
+-                      }
+-              } else {
+-                      $tags = array();
+-              }
++            foreach ($tags as $tag) {
++                if (!common_valid_profile_tag($tag)) {
++                    $this->show_form($profile, sprintf(_('Invalid tag: "%s"'), $tag));
++                    return;
++                }
++            }
++        } else {
++            $tags = array();
++        }
+hunk ./actions/tagother.php 139
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/tagother.php 141
+-              if (!Subscription::pkeyGet(array('subscriber' => $user->id,
+-                                                                               'subscribed' => $profile->id)) &&
+-                      !Subscription::pkeyGet(array('subscriber' => $profile->id,
+-                                                                               'subscribed' => $user->id)))
+-              {
+-                      $this->client_error(_('You can only tag people you are subscribed to or who are subscribed to you.'));
+-                      return;
+-              }
++        if (!Subscription::pkeyGet(array('subscriber' => $user->id,
++                                         'subscribed' => $profile->id)) &&
++            !Subscription::pkeyGet(array('subscriber' => $profile->id,
++                                         'subscribed' => $user->id)))
++        {
++            $this->client_error(_('You can only tag people you are subscribed to or who are subscribed to you.'));
++            return;
++        }
+hunk ./actions/tagother.php 150
+-              $result = Profile_tag::setTags($user->id, $profile->id, $tags);
++        $result = Profile_tag::setTags($user->id, $profile->id, $tags);
+hunk ./actions/tagother.php 152
+-              if (!$result) {
+-                      $this->client_error(_('Could not save tags.'));
+-                      return;
+-              }
++        if (!$result) {
++            $this->client_error(_('Could not save tags.'));
++            return;
++        }
+hunk ./actions/tagother.php 157
+-              $action = $user->isSubscribed($profile) ? 'subscriptions' : 'subscribers';
++        $action = $user->isSubscribed($profile) ? 'subscriptions' : 'subscribers';
+hunk ./actions/tagother.php 159
+-              if ($this->boolean('ajax')) {
+-                      common_start_html('text/xml');
+-                      common_element_start('head');
+-                      common_element('title', null, _('Tags'));
+-                      common_element_end('head');
+-                      common_element_start('body');
+-                      common_element_start('p', 'subtags');
+-                      foreach ($tags as $tag) {
+-                              common_element('a', array('href' => common_local_url($action,
+-                                                                                                                                       array('nickname' => $user->nickname,
+-                                                                                                                                                 'tag' => $tag))),
+-                                                         $tag);
+-                      }
+-                      common_element_end('p');
+-                      common_element_end('body');
+-                      common_element_end('html');
+-              } else {
+-                      common_redirect(common_local_url($action, array('nickname' =>
+-                                                                                                                      $user->nickname)));
++        if ($this->boolean('ajax')) {
++            common_start_html('text/xml');
++            common_element_start('head');
++            common_element('title', null, _('Tags'));
++            common_element_end('head');
++            common_element_start('body');
++            common_element_start('p', 'subtags');
++            foreach ($tags as $tag) {
++                common_element('a', array('href' => common_local_url($action,
++                                                                     array('nickname' => $user->nickname,
++                                                                           'tag' => $tag))),
++                               $tag);
++            }
++            common_element_end('p');
++            common_element_end('body');
++            common_element_end('html');
++        } else {
++            common_redirect(common_local_url($action, array('nickname' =>
++                                                            $user->nickname)));
+hunk ./actions/tagother.php 179
+-      }
++    }
+hunk ./actions/tagother.php 181
+-      function show_top($arr = NULL) {
+-              list($profile, $error) = $arr;
+-              if ($error) {
+-                      common_element('p', 'error', $error);
+-              } else {
+-                      common_element_start('div', 'instructions');
+-                      common_element('p', NULL,
+-                                                 _('Use this form to add tags to your subscribers or subscriptions.'));
+-                      common_element_end('div');
+-              }
+-      }
++    function show_top($arr = NULL) {
++        list($profile, $error) = $arr;
++        if ($error) {
++            common_element('p', 'error', $error);
++        } else {
++            common_element_start('div', 'instructions');
++            common_element('p', NULL,
++                           _('Use this form to add tags to your subscribers or subscriptions.'));
++            common_element_end('div');
++        }
++    }
+hunk ./actions/tagrss.php 28
+-      function init() {
+-              $tag = $this->trimmed('tag');
+-              $this->tag = Notice_tag::staticGet('tag', $tag);
++    function init() {
++        $tag = $this->trimmed('tag');
++        $this->tag = Notice_tag::staticGet('tag', $tag);
+hunk ./actions/tagrss.php 32
+-              if (!$this->tag) {
+-                      common_user_error(_('No such tag.'));
+-                      return false;
+-              } else {
+-                      return true;
+-              }
+-      }
++        if (!$this->tag) {
++            common_user_error(_('No such tag.'));
++            return false;
++        } else {
++            return true;
++        }
++    }
+hunk ./actions/tagrss.php 40
+-      function get_notices($limit=0) {
+-              $tag = $this->tag;
++    function get_notices($limit=0) {
++        $tag = $this->tag;
+hunk ./actions/tagrss.php 43
+-              if (is_null($tag)) {
+-                      return NULL;
+-              }
++        if (is_null($tag)) {
++            return NULL;
++        }
+hunk ./actions/tagrss.php 47
+-              $notice = Notice_tag::getStream($tag->tag, 0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
++        $notice = Notice_tag::getStream($tag->tag, 0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
+hunk ./actions/tagrss.php 49
+-              while ($notice->fetch()) {
+-                      $notices[] = clone($notice);
+-              }
++        while ($notice->fetch()) {
++            $notices[] = clone($notice);
++        }
+hunk ./actions/tagrss.php 53
+-              return $notices;
+-      }
++        return $notices;
++    }
+hunk ./actions/tagrss.php 56
+-      function get_channel() {
+-              $tag = $this->tag->tag;
++    function get_channel() {
++        $tag = $this->tag->tag;
+hunk ./actions/tagrss.php 59
+-              $c = array('url' => common_local_url('tagrss', array('tag' => $tagname)),
+-                         'title' => $tagname,
+-                         'link' => common_local_url('tagrss', array('tag' => $tagname)),
+-                         'description' => sprintf(_('Microblog tagged with %s'), $tagname));
+-              return $c;
+-      }
++        $c = array('url' => common_local_url('tagrss', array('tag' => $tagname)),
++               'title' => $tagname,
++               'link' => common_local_url('tagrss', array('tag' => $tagname)),
++               'description' => sprintf(_('Microblog tagged with %s'), $tagname));
++        return $c;
++    }
+hunk ./actions/twitapiaccount.php 26
+-      function verify_credentials($args, $apidata) {
+-              parent::handle($args);
++    function verify_credentials($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapiaccount.php 29
+-              if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+-                      common_user_error(_('API method not found!'), $code = 404);
+-                      return;
+-              }
++        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
++            common_user_error(_('API method not found!'), $code = 404);
++            return;
++        }
+hunk ./actions/twitapiaccount.php 34
+-              $this->show_extended_profile($apidata['user'], $apidata);
+-      }
++        $this->show_extended_profile($apidata['user'], $apidata);
++    }
+hunk ./actions/twitapiaccount.php 37
+-      function end_session($args, $apidata) {
+-              parent::handle($args);
+-              common_server_error(_('API method under construction.'), $code=501);
+-      }
++    function end_session($args, $apidata) {
++        parent::handle($args);
++        common_server_error(_('API method under construction.'), $code=501);
++    }
+hunk ./actions/twitapiaccount.php 42
+-      function update_location($args, $apidata) {
+-              parent::handle($args);
++    function update_location($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapiaccount.php 45
+-              if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+-                      $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
+-                      return;
+-              }
++        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
++            $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapiaccount.php 50
+-              $location = trim($this->arg('location'));
++        $location = trim($this->arg('location'));
+hunk ./actions/twitapiaccount.php 52
+-              if (!is_null($location) && strlen($location) > 255) {
++        if (!is_null($location) && strlen($location) > 255) {
+hunk ./actions/twitapiaccount.php 54
+-                      // XXX: But Twitter just truncates and runs with it. -- Zach
+-                      $this->client_error(_('That\'s too long. Max notice size is 255 chars.'), 406, $apidate['content-type']);
+-                      return;
+-              }
++            // XXX: But Twitter just truncates and runs with it. -- Zach
++            $this->client_error(_('That\'s too long. Max notice size is 255 chars.'), 406, $apidate['content-type']);
++            return;
++        }
+hunk ./actions/twitapiaccount.php 59
+-              $user = $apidata['user'];
+-              $profile = $user->getProfile();
++        $user = $apidata['user'];
++        $profile = $user->getProfile();
+hunk ./actions/twitapiaccount.php 62
+-              if (!$profile) {
+-                      common_server_error(_('User has no profile.'));
+-                      return;
+-              }
++        if (!$profile) {
++            common_server_error(_('User has no profile.'));
++            return;
++        }
+hunk ./actions/twitapiaccount.php 67
+-              $orig_profile = clone($profile);
+-              $profile->location = $location;
++        $orig_profile = clone($profile);
++        $profile->location = $location;
+hunk ./actions/twitapiaccount.php 70
+-              $result = $profile->update($orig_profile);
++        $result = $profile->update($orig_profile);
+hunk ./actions/twitapiaccount.php 72
+-              if (!$result) {
+-                      common_log_db_error($profile, 'UPDATE', __FILE__);
+-                      common_server_error(_('Couldn\'t save profile.'));
+-                      return;
+-              }
++        if (!$result) {
++            common_log_db_error($profile, 'UPDATE', __FILE__);
++            common_server_error(_('Couldn\'t save profile.'));
++            return;
++        }
+hunk ./actions/twitapiaccount.php 78
+-              common_broadcast_profile($profile);
+-              $type = $apidata['content-type'];
++        common_broadcast_profile($profile);
++        $type = $apidata['content-type'];
+hunk ./actions/twitapiaccount.php 81
+-              $this->init_document($type);
+-              $this->show_profile($profile, $type);
+-              $this->end_document($type);
+-      }
++        $this->init_document($type);
++        $this->show_profile($profile, $type);
++        $this->end_document($type);
++    }
+hunk ./actions/twitapiaccount.php 87
+-      function update_delivery_device($args, $apidata) {
+-              parent::handle($args);
+-              common_server_error(_('API method under construction.'), $code=501);
+-      }
++    function update_delivery_device($args, $apidata) {
++        parent::handle($args);
++        common_server_error(_('API method under construction.'), $code=501);
++    }
+hunk ./actions/twitapiaccount.php 92
+-      function rate_limit_status($args, $apidata) {
+-              parent::handle($args);
+-              common_server_error(_('API method under construction.'), $code=501);
+-      }
++    function rate_limit_status($args, $apidata) {
++        parent::handle($args);
++        common_server_error(_('API method under construction.'), $code=501);
++    }
+hunk ./actions/twitapiblocks.php 26
+-      function create($args, $apidata) {
++    function create($args, $apidata) {
+hunk ./actions/twitapiblocks.php 28
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/twitapiblocks.php 30
+-              $blockee = $this->get_user($apidata['api_arg'], $apidata);
++        $blockee = $this->get_user($apidata['api_arg'], $apidata);
+hunk ./actions/twitapiblocks.php 33
+-                      $this->client_error('Not Found', 404, $apidata['content-type']);
+-                      return;
++            $this->client_error('Not Found', 404, $apidata['content-type']);
++            return;
+hunk ./actions/twitapiblocks.php 45
+-                      common_server_error(_('Block user failed.'));
++            common_server_error(_('Block user failed.'));
+hunk ./actions/twitapiblocks.php 47
+-      }
++    }
+hunk ./actions/twitapiblocks.php 49
+-      function destroy($args, $apidata) {
+-              parent::handle($args);
+-              $blockee = $this->get_user($apidata['api_arg'], $apidata);
++    function destroy($args, $apidata) {
++        parent::handle($args);
++        $blockee = $this->get_user($apidata['api_arg'], $apidata);
+hunk ./actions/twitapiblocks.php 54
+-                      $this->client_error('Not Found', 404, $apidata['content-type']);
+-                      return;
++            $this->client_error('Not Found', 404, $apidata['content-type']);
++            return;
+hunk ./actions/twitapiblocks.php 66
+-                      common_server_error(_('Unblock user failed.'));
++            common_server_error(_('Unblock user failed.'));
+hunk ./actions/twitapiblocks.php 68
+-      }
++    }
+hunk ./actions/twitapidirect_messages.php 26
+-      function direct_messages($args, $apidata) {
+-              parent::handle($args);
+-              return $this->show_messages($args, $apidata, 'received');
+-      }
++    function direct_messages($args, $apidata) {
++        parent::handle($args);
++        return $this->show_messages($args, $apidata, 'received');
++    }
+hunk ./actions/twitapidirect_messages.php 31
+-      function sent($args, $apidata) {
+-              parent::handle($args);
+-              return $this->show_messages($args, $apidata, 'sent');
+-      }
++    function sent($args, $apidata) {
++        parent::handle($args);
++        return $this->show_messages($args, $apidata, 'sent');
++    }
+hunk ./actions/twitapidirect_messages.php 36
+-      function show_messages($args, $apidata, $type) {
++    function show_messages($args, $apidata, $type) {
+hunk ./actions/twitapidirect_messages.php 38
+-              $user = $apidata['user'];
++        $user = $apidata['user'];
+hunk ./actions/twitapidirect_messages.php 40
+-              $count = $this->arg('count');
+-              $since = $this->arg('since');
+-              $since_id = $this->arg('since_id');
+-              $before_id = $this->arg('before_id');
++        $count = $this->arg('count');
++        $since = $this->arg('since');
++        $since_id = $this->arg('since_id');
++        $before_id = $this->arg('before_id');
+hunk ./actions/twitapidirect_messages.php 45
+-              $page = $this->arg('page');
++        $page = $this->arg('page');
+hunk ./actions/twitapidirect_messages.php 47
+-              if (!$page) {
+-                      $page = 1;
+-              }
++        if (!$page) {
++            $page = 1;
++        }
+hunk ./actions/twitapidirect_messages.php 51
+-              if (!$count) {
+-                      $count = 20;
+-              }
++        if (!$count) {
++            $count = 20;
++        }
+hunk ./actions/twitapidirect_messages.php 55
+-              $message = new Message();
++        $message = new Message();
+hunk ./actions/twitapidirect_messages.php 57
+-              $title = null;
+-              $subtitle = null;
+-              $link = null;
+-              $server = common_root_url();
++        $title = null;
++        $subtitle = null;
++        $link = null;
++        $server = common_root_url();
+hunk ./actions/twitapidirect_messages.php 62
+-              if ($type == 'received') {
+-                      $message->to_profile = $user->id;
+-                      $title = sprintf(_("Direct messages to %s"), $user->nickname);
+-                      $subtitle = sprintf(_("All the direct messages sent to %s"), $user->nickname);
+-                      $link = $server . $user->nickname . '/inbox';
+-              } else {
+-                      $message->from_profile = $user->id;
+-                      $title = _('Direct Messages You\'ve Sent');
+-                      $subtitle = sprintf(_("All the direct messages sent from %s"), $user->nickname);
+-                      $link = $server . $user->nickname . '/outbox';
+-              }
++        if ($type == 'received') {
++            $message->to_profile = $user->id;
++            $title = sprintf(_("Direct messages to %s"), $user->nickname);
++            $subtitle = sprintf(_("All the direct messages sent to %s"), $user->nickname);
++            $link = $server . $user->nickname . '/inbox';
++        } else {
++            $message->from_profile = $user->id;
++            $title = _('Direct Messages You\'ve Sent');
++            $subtitle = sprintf(_("All the direct messages sent from %s"), $user->nickname);
++            $link = $server . $user->nickname . '/outbox';
++        }
+hunk ./actions/twitapidirect_messages.php 74
+-              if ($before_id) {
+-                      $message->whereAdd("id < $before_id");
+-              }
++        if ($before_id) {
++            $message->whereAdd("id < $before_id");
++        }
+hunk ./actions/twitapidirect_messages.php 78
+-              if ($since_id) {
+-                      $message->whereAdd("id > $since_id");
+-              }
++        if ($since_id) {
++            $message->whereAdd("id > $since_id");
++        }
+hunk ./actions/twitapidirect_messages.php 82
+-              $since = strtotime($this->arg('since'));
++        $since = strtotime($this->arg('since'));
+hunk ./actions/twitapidirect_messages.php 84
+-              if ($since) {
+-                      $d = date('Y-m-d H:i:s', $since);
+-                      $message->whereAdd("created > '$d'");
+-              }
++        if ($since) {
++            $d = date('Y-m-d H:i:s', $since);
++            $message->whereAdd("created > '$d'");
++        }
+hunk ./actions/twitapidirect_messages.php 89
+-              $message->orderBy('created DESC, id DESC');
+-              $message->limit((($page-1)*20), $count);
+-              $message->find();
++        $message->orderBy('created DESC, id DESC');
++        $message->limit((($page-1)*20), $count);
++        $message->find();
+hunk ./actions/twitapidirect_messages.php 93
+-              switch($apidata['content-type']) {
+-               case 'xml':
+-                      $this->show_xml_dmsgs($message);
+-                      break;
+-               case 'rss':
+-                      $this->show_rss_dmsgs($message, $title, $link, $subtitle);
+-                      break;
+-               case 'atom':
+-                      $this->show_atom_dmsgs($message, $title, $link, $subtitle);
+-                      break;
+-               case 'json':
+-                      $this->show_json_dmsgs($message);
+-                      break;
+-               default:
+-                      common_user_error(_('API method not found!'), $code = 404);
+-              }
++        switch($apidata['content-type']) {
++         case 'xml':
++            $this->show_xml_dmsgs($message);
++            break;
++         case 'rss':
++            $this->show_rss_dmsgs($message, $title, $link, $subtitle);
++            break;
++         case 'atom':
++            $this->show_atom_dmsgs($message, $title, $link, $subtitle);
++            break;
++         case 'json':
++            $this->show_json_dmsgs($message);
++            break;
++         default:
++            common_user_error(_('API method not found!'), $code = 404);
++        }
+hunk ./actions/twitapidirect_messages.php 110
+-      }
++    }
+hunk ./actions/twitapidirect_messages.php 112
+-      // had to change this from "new" to "create" to avoid PHP reserved word
+-      function create($args, $apidata) {
+-              parent::handle($args);
++    // had to change this from "new" to "create" to avoid PHP reserved word
++    function create($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapidirect_messages.php 116
+-              if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+-                      $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
+-                      return;
+-              }
++        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
++            $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapidirect_messages.php 121
+-              $user = $apidata['user'];
+-              $source = $this->trimmed('source');      // Not supported by Twitter.
++        $user = $apidata['user'];
++        $source = $this->trimmed('source');     // Not supported by Twitter.
+hunk ./actions/twitapidirect_messages.php 125
+-              if (!$source || in_array($source, $reserved_sources)) {
+-                      $source = 'api';
+-              }
++        if (!$source || in_array($source, $reserved_sources)) {
++            $source = 'api';
++        }
+hunk ./actions/twitapidirect_messages.php 129
+-              $content = $this->trimmed('text');
++        $content = $this->trimmed('text');
+hunk ./actions/twitapidirect_messages.php 131
+-              if (!$content) {
+-                      $this->client_error(_('No message text!'), $code = 406, $apidata['content-type']);
+-              } else {
+-                      $content_shortened = common_shorten_links($content);
+-                      if (mb_strlen($content_shortened) > 140) {
+-                              $this->client_error(_('That\'s too long. Max message size is 140 chars.'),
+-                                      $code = 406, $apidata['content-type']);
+-                              return;
+-                      }
+-              }
++        if (!$content) {
++            $this->client_error(_('No message text!'), $code = 406, $apidata['content-type']);
++        } else {
++            $content_shortened = common_shorten_links($content);
++            if (mb_strlen($content_shortened) > 140) {
++                $this->client_error(_('That\'s too long. Max message size is 140 chars.'),
++                    $code = 406, $apidata['content-type']);
++                return;
++            }
++        }
+hunk ./actions/twitapidirect_messages.php 142
+-              $other = $this->get_user($this->trimmed('user'));
++        $other = $this->get_user($this->trimmed('user'));
+hunk ./actions/twitapidirect_messages.php 144
+-              if (!$other) {
+-                      $this->client_error(_('Recipient user not found.'), $code = 403, $apidata['content-type']);
+-                      return;
+-              } else if (!$user->mutuallySubscribed($other)) {
+-                      $this->client_error(_('Can\'t send direct messages to users who aren\'t your friend.'),
+-                              $code = 403, $apidata['content-type']);
+-                      return;
+-              } else if ($user->id == $other->id) {
+-                      // Sending msgs to yourself is allowed by Twitter
+-                      $this->client_error(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'),
+-                              $code = 403, $apidata['content-type']);
+-                      return;
+-              }
++        if (!$other) {
++            $this->client_error(_('Recipient user not found.'), $code = 403, $apidata['content-type']);
++            return;
++        } else if (!$user->mutuallySubscribed($other)) {
++            $this->client_error(_('Can\'t send direct messages to users who aren\'t your friend.'),
++                $code = 403, $apidata['content-type']);
++            return;
++        } else if ($user->id == $other->id) {
++            // Sending msgs to yourself is allowed by Twitter
++            $this->client_error(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'),
++                $code = 403, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapidirect_messages.php 158
+-              $message = Message::saveNew($user->id, $other->id,
+-                      html_entity_decode($content, ENT_NOQUOTES, 'UTF-8'), $source);
++        $message = Message::saveNew($user->id, $other->id,
++            html_entity_decode($content, ENT_NOQUOTES, 'UTF-8'), $source);
+hunk ./actions/twitapidirect_messages.php 161
+-              if (is_string($message)) {
+-                      $this->server_error($message);
+-                      return;
+-              }
++        if (is_string($message)) {
++            $this->server_error($message);
++            return;
++        }
+hunk ./actions/twitapidirect_messages.php 166
+-              $this->notify($user, $other, $message);
++        $this->notify($user, $other, $message);
+hunk ./actions/twitapidirect_messages.php 168
+-              if ($apidata['content-type'] == 'xml') {
+-                      $this->show_single_xml_dmsg($message);
+-              } elseif ($apidata['content-type'] == 'json') {
+-                      $this->show_single_json_dmsg($message);
+-              }
++        if ($apidata['content-type'] == 'xml') {
++            $this->show_single_xml_dmsg($message);
++        } elseif ($apidata['content-type'] == 'json') {
++            $this->show_single_json_dmsg($message);
++        }
+hunk ./actions/twitapidirect_messages.php 174
+-      }
++    }
+hunk ./actions/twitapidirect_messages.php 176
+-      function destroy($args, $apidata) {
+-              parent::handle($args);
+-              common_server_error(_('API method under construction.'), $code=501);
+-      }
++    function destroy($args, $apidata) {
++        parent::handle($args);
++        common_server_error(_('API method under construction.'), $code=501);
++    }
+hunk ./actions/twitapidirect_messages.php 181
+-      function show_xml_dmsgs($message) {
++    function show_xml_dmsgs($message) {
+hunk ./actions/twitapidirect_messages.php 183
+-              $this->init_document('xml');
+-              common_element_start('direct-messages', array('type' => 'array'));
++        $this->init_document('xml');
++        common_element_start('direct-messages', array('type' => 'array'));
+hunk ./actions/twitapidirect_messages.php 186
+-              if (is_array($messages)) {
+-                      foreach ($message as $m) {
+-                              $twitter_dm = $this->twitter_dmsg_array($m);
+-                              $this->show_twitter_xml_dmsg($twitter_dm);
+-                      }
+-              } else {
+-                      while ($message->fetch()) {
+-                              $twitter_dm = $this->twitter_dmsg_array($message);
+-                              $this->show_twitter_xml_dmsg($twitter_dm);
+-                      }
+-              }
++        if (is_array($messages)) {
++            foreach ($message as $m) {
++                $twitter_dm = $this->twitter_dmsg_array($m);
++                $this->show_twitter_xml_dmsg($twitter_dm);
++            }
++        } else {
++            while ($message->fetch()) {
++                $twitter_dm = $this->twitter_dmsg_array($message);
++                $this->show_twitter_xml_dmsg($twitter_dm);
++            }
++        }
+hunk ./actions/twitapidirect_messages.php 198
+-              common_element_end('direct-messages');
+-              $this->end_document('xml');
++        common_element_end('direct-messages');
++        $this->end_document('xml');
+hunk ./actions/twitapidirect_messages.php 201
+-      }
++    }
+hunk ./actions/twitapidirect_messages.php 203
+-      function show_json_dmsgs($message) {
++    function show_json_dmsgs($message) {
+hunk ./actions/twitapidirect_messages.php 205
+-              $this->init_document('json');
++        $this->init_document('json');
+hunk ./actions/twitapidirect_messages.php 207
+-              $dmsgs = array();
++        $dmsgs = array();
+hunk ./actions/twitapidirect_messages.php 209
+-              if (is_array($message)) {
+-                      foreach ($message as $m) {
+-                              $twitter_dm = $this->twitter_dmsg_array($m);
+-                              array_push($dmsgs, $twitter_dm);
+-                      }
+-              } else {
+-                      while ($message->fetch()) {
+-                              $twitter_dm = $this->twitter_dmsg_array($message);
+-                              array_push($dmsgs, $twitter_dm);
+-                      }
+-              }
++        if (is_array($message)) {
++            foreach ($message as $m) {
++                $twitter_dm = $this->twitter_dmsg_array($m);
++                array_push($dmsgs, $twitter_dm);
++            }
++        } else {
++            while ($message->fetch()) {
++                $twitter_dm = $this->twitter_dmsg_array($message);
++                array_push($dmsgs, $twitter_dm);
++            }
++        }
+hunk ./actions/twitapidirect_messages.php 221
+-              $this->show_json_objects($dmsgs);
+-              $this->end_document('json');
++        $this->show_json_objects($dmsgs);
++        $this->end_document('json');
+hunk ./actions/twitapidirect_messages.php 224
+-      }
++    }
+hunk ./actions/twitapidirect_messages.php 226
+-      function show_rss_dmsgs($message, $title, $link, $subtitle) {
++    function show_rss_dmsgs($message, $title, $link, $subtitle) {
+hunk ./actions/twitapidirect_messages.php 228
+-              $this->init_document('rss');
++        $this->init_document('rss');
+hunk ./actions/twitapidirect_messages.php 230
+-              common_element_start('channel');
+-              common_element('title', NULL, $title);
++        common_element_start('channel');
++        common_element('title', NULL, $title);
+hunk ./actions/twitapidirect_messages.php 233
+-              common_element('link', NULL, $link);
+-              common_element('description', NULL, $subtitle);
+-              common_element('language', NULL, 'en-us');
+-              common_element('ttl', NULL, '40');
++        common_element('link', NULL, $link);
++        common_element('description', NULL, $subtitle);
++        common_element('language', NULL, 'en-us');
++        common_element('ttl', NULL, '40');
+hunk ./actions/twitapidirect_messages.php 238
+-              if (is_array($message)) {
+-                      foreach ($message as $m) {
+-                              $entry = $this->twitter_rss_dmsg_array($m);
+-                              $this->show_twitter_rss_item($entry);
+-                      }
+-              } else {
+-                      while ($message->fetch()) {
+-                              $entry = $this->twitter_rss_dmsg_array($message);
+-                              $this->show_twitter_rss_item($entry);
+-                      }
+-              }
++        if (is_array($message)) {
++            foreach ($message as $m) {
++                $entry = $this->twitter_rss_dmsg_array($m);
++                $this->show_twitter_rss_item($entry);
++            }
++        } else {
++            while ($message->fetch()) {
++                $entry = $this->twitter_rss_dmsg_array($message);
++                $this->show_twitter_rss_item($entry);
++            }
++        }
+hunk ./actions/twitapidirect_messages.php 250
+-              common_element_end('channel');
+-              $this->end_twitter_rss();
++        common_element_end('channel');
++        $this->end_twitter_rss();
+hunk ./actions/twitapidirect_messages.php 253
+-      }
++    }
+hunk ./actions/twitapidirect_messages.php 255
+-      function show_atom_dmsgs($message, $title, $link, $subtitle) {
++    function show_atom_dmsgs($message, $title, $link, $subtitle) {
+hunk ./actions/twitapidirect_messages.php 257
+-              $this->init_document('atom');
++        $this->init_document('atom');
+hunk ./actions/twitapidirect_messages.php 259
+-              common_element('title', NULL, $title);
+-              $siteserver = common_config('site', 'server');
+-              common_element('id', NULL, "tag:$siteserver,2008:DirectMessage");
+-              common_element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), NULL);
+-              common_element('updated', NULL, common_date_iso8601(strftime('%c')));
+-              common_element('subtitle', NULL, $subtitle);
++        common_element('title', NULL, $title);
++        $siteserver = common_config('site', 'server');
++        common_element('id', NULL, "tag:$siteserver,2008:DirectMessage");
++        common_element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), NULL);
++        common_element('updated', NULL, common_date_iso8601(strftime('%c')));
++        common_element('subtitle', NULL, $subtitle);
+hunk ./actions/twitapidirect_messages.php 266
+-              if (is_array($message)) {
+-                      foreach ($message as $m) {
+-                              $entry = $this->twitter_rss_dmsg_array($m);
+-                              $this->show_twitter_atom_entry($entry);
+-                      }
+-              } else {
+-                      while ($message->fetch()) {
+-                              $entry = $this->twitter_rss_dmsg_array($message);
+-                              $this->show_twitter_atom_entry($entry);
+-                      }
+-              }
++        if (is_array($message)) {
++            foreach ($message as $m) {
++                $entry = $this->twitter_rss_dmsg_array($m);
++                $this->show_twitter_atom_entry($entry);
++            }
++        } else {
++            while ($message->fetch()) {
++                $entry = $this->twitter_rss_dmsg_array($message);
++                $this->show_twitter_atom_entry($entry);
++            }
++        }
+hunk ./actions/twitapidirect_messages.php 278
+-              $this->end_document('atom');
+-      }
++        $this->end_document('atom');
++    }
+hunk ./actions/twitapidirect_messages.php 281
+-      // swiped from MessageAction. Should it be place in util.php?
+-      function notify($from, $to, $message) {
+-              mail_notify_message($message, $from, $to);
+-              # XXX: Jabber, SMS notifications... probably queued
+-      }
++    // swiped from MessageAction. Should it be place in util.php?
++    function notify($from, $to, $message) {
++        mail_notify_message($message, $from, $to);
++        # XXX: Jabber, SMS notifications... probably queued
++    }
+hunk ./actions/twitapifavorites.php 26
+-      function favorites($args, $apidata) {
+-              parent::handle($args);
++    function favorites($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapifavorites.php 29
+-              $this->auth_user = $apidata['user'];
+-              $user = $this->get_user($apidata['api_arg'], $apidata);
++        $this->auth_user = $apidata['user'];
++        $user = $this->get_user($apidata['api_arg'], $apidata);
+hunk ./actions/twitapifavorites.php 32
+-              if (!$user) {
+-                      $this->client_error('Not Found', 404, $apidata['content-type']);
+-                      return;
+-              }
++        if (!$user) {
++            $this->client_error('Not Found', 404, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapifavorites.php 37
+-              $profile = $user->getProfile();
++        $profile = $user->getProfile();
+hunk ./actions/twitapifavorites.php 39
+-              if (!$profile) {
+-                      common_server_error(_('User has no profile.'));
+-                      return;
+-              }
++        if (!$profile) {
++            common_server_error(_('User has no profile.'));
++            return;
++        }
+hunk ./actions/twitapifavorites.php 44
+-              $page = $this->arg('page');
++        $page = $this->arg('page');
+hunk ./actions/twitapifavorites.php 46
+-              if (!$page) {
+-                      $page = 1;
+-              }
++        if (!$page) {
++            $page = 1;
++        }
+hunk ./actions/twitapifavorites.php 50
+-              if (!$count) {
+-                      $count = 20;
+-              }
++        if (!$count) {
++            $count = 20;
++        }
+hunk ./actions/twitapifavorites.php 54
+-              $notice = $user->favoriteNotices((($page-1)*20), $count);
++        $notice = $user->favoriteNotices((($page-1)*20), $count);
+hunk ./actions/twitapifavorites.php 56
+-              if (!$notice) {
+-                      common_server_error(_('Could not retrieve favorite notices.'));
+-                      return;
+-              }
++        if (!$notice) {
++            common_server_error(_('Could not retrieve favorite notices.'));
++            return;
++        }
+hunk ./actions/twitapifavorites.php 61
+-              $sitename = common_config('site', 'name');
+-              $siteserver = common_config('site', 'server');
++        $sitename = common_config('site', 'name');
++        $siteserver = common_config('site', 'server');
+hunk ./actions/twitapifavorites.php 64
+-              $title = sprintf(_('%s / Favorites from %s'), $sitename, $user->nickname);
+-              $id = "tag:$siteserver:favorites:".$user->id;
+-              $link = common_local_url('favorites', array('nickname' => $user->nickname));
+-              $subtitle = sprintf(_('%s updates favorited by %s / %s.'), $sitename, $profile->getBestName(), $user->nickname);
++        $title = sprintf(_('%s / Favorites from %s'), $sitename, $user->nickname);
++        $id = "tag:$siteserver:favorites:".$user->id;
++        $link = common_local_url('favorites', array('nickname' => $user->nickname));
++        $subtitle = sprintf(_('%s updates favorited by %s / %s.'), $sitename, $profile->getBestName(), $user->nickname);
+hunk ./actions/twitapifavorites.php 69
+-              switch($apidata['content-type']) {
+-               case 'xml':
+-                      $this->show_xml_timeline($notice);
+-                      break;
+-               case 'rss':
+-                      $this->show_rss_timeline($notice, $title, $link, $subtitle);
+-                      break;
+-               case 'atom':
+-                      $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
+-                      break;
+-               case 'json':
+-                      $this->show_json_timeline($notice);
+-                      break;
+-               default:
+-                      common_user_error(_('API method not found!'), $code = 404);
+-              }
++        switch($apidata['content-type']) {
++         case 'xml':
++            $this->show_xml_timeline($notice);
++            break;
++         case 'rss':
++            $this->show_rss_timeline($notice, $title, $link, $subtitle);
++            break;
++         case 'atom':
++            $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
++            break;
++         case 'json':
++            $this->show_json_timeline($notice);
++            break;
++         default:
++            common_user_error(_('API method not found!'), $code = 404);
++        }
+hunk ./actions/twitapifavorites.php 86
+-      }
++    }
+hunk ./actions/twitapifavorites.php 88
+-      function create($args, $apidata) {
+-              parent::handle($args);
++    function create($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapifavorites.php 91
+-              // Check for RESTfulness
+-              if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
+-                      // XXX: Twitter just prints the err msg, no XML / JSON.
+-                      $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
+-                      return;
+-              }
++        // Check for RESTfulness
++        if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
++            // XXX: Twitter just prints the err msg, no XML / JSON.
++            $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapifavorites.php 98
+-              if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+-                      common_user_error(_('API method not found!'), $code = 404);
+-                      return;
+-              }
++        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
++            common_user_error(_('API method not found!'), $code = 404);
++            return;
++        }
+hunk ./actions/twitapifavorites.php 103
+-              $this->auth_user = $apidata['user'];
+-              $user = $this->auth_user;
+-              $notice_id = $apidata['api_arg'];
+-              $notice = Notice::staticGet($notice_id);
++        $this->auth_user = $apidata['user'];
++        $user = $this->auth_user;
++        $notice_id = $apidata['api_arg'];
++        $notice = Notice::staticGet($notice_id);
+hunk ./actions/twitapifavorites.php 108
+-              if (!$notice) {
+-                      $this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']);
+-                      return;
+-              }
++        if (!$notice) {
++            $this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapifavorites.php 113
+-              // XXX: Twitter lets you fave things repeatedly via api.
+-              if ($user->hasFave($notice)) {
+-                      $this->client_error(_('This notice is already a favorite!'), 403, $apidata['content-type']);
+-                      return;
+-              }
++        // XXX: Twitter lets you fave things repeatedly via api.
++        if ($user->hasFave($notice)) {
++            $this->client_error(_('This notice is already a favorite!'), 403, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapifavorites.php 119
+-              $fave = Fave::addNew($user, $notice);
++        $fave = Fave::addNew($user, $notice);
+hunk ./actions/twitapifavorites.php 121
+-              if (!$fave) {
+-                      common_server_error(_('Could not create favorite.'));
+-                      return;
+-              }
++        if (!$fave) {
++            common_server_error(_('Could not create favorite.'));
++            return;
++        }
+hunk ./actions/twitapifavorites.php 126
+-              $this->notify($fave, $notice, $user);
+-              $user->blowFavesCache();
++        $this->notify($fave, $notice, $user);
++        $user->blowFavesCache();
+hunk ./actions/twitapifavorites.php 129
+-              if ($apidata['content-type'] == 'xml') {
+-                      $this->show_single_xml_status($notice);
+-              } elseif ($apidata['content-type'] == 'json') {
+-                      $this->show_single_json_status($notice);
+-              }
++        if ($apidata['content-type'] == 'xml') {
++            $this->show_single_xml_status($notice);
++        } elseif ($apidata['content-type'] == 'json') {
++            $this->show_single_json_status($notice);
++        }
+hunk ./actions/twitapifavorites.php 135
+-      }
++    }
+hunk ./actions/twitapifavorites.php 137
+-      function destroy($args, $apidata) {
+-              parent::handle($args);
+-              common_server_error(_('API method under construction.'), $code=501);
+-      }
++    function destroy($args, $apidata) {
++        parent::handle($args);
++        common_server_error(_('API method under construction.'), $code=501);
++    }
+hunk ./actions/twitapifavorites.php 142
+-      // XXX: these two funcs swiped from faves.  Maybe put in util.php, or some common base class?
++    // XXX: these two funcs swiped from faves.  Maybe put in util.php, or some common base class?
+hunk ./actions/twitapifavorites.php 144
+-      function notify($fave, $notice, $user) {
+-          $other = User::staticGet('id', $notice->profile_id);
+-              if ($other && $other->id != $user->id) {
+-                      if ($other->email && $other->emailnotifyfav) {
+-                              $this->notify_mail($other, $user, $notice);
+-                      }
+-                      # XXX: notify by IM
+-                      # XXX: notify by SMS
+-              }
+-      }
++    function notify($fave, $notice, $user) {
++        $other = User::staticGet('id', $notice->profile_id);
++        if ($other && $other->id != $user->id) {
++            if ($other->email && $other->emailnotifyfav) {
++                $this->notify_mail($other, $user, $notice);
++            }
++            # XXX: notify by IM
++            # XXX: notify by SMS
++        }
++    }
+hunk ./actions/twitapifavorites.php 155
+-      function notify_mail($other, $user, $notice) {
+-              $profile = $user->getProfile();
+-              $bestname = $profile->getBestName();
+-              $subject = sprintf(_('%s added your notice as a favorite'), $bestname);
+-              $body = sprintf(_("%1\$s just added your notice from %2\$s as one of their favorites.\n\n" .
+-                                                "In case you forgot, you can see the text of your notice here:\n\n" .
+-                                                "%3\$s\n\n" .
+-                                                "You can see the list of %1\$s's favorites here:\n\n" .
+-                                                "%4\$s\n\n" .
+-                                                "Faithfully yours,\n" .
+-                                                "%5\$s\n"),
+-                                              $bestname,
+-                                              common_exact_date($notice->created),
+-                                              common_local_url('shownotice', array('notice' => $notice->id)),
+-                                              common_local_url('showfavorites', array('nickname' => $user->nickname)),
+-                                              common_config('site', 'name'));
++    function notify_mail($other, $user, $notice) {
++        $profile = $user->getProfile();
++        $bestname = $profile->getBestName();
++        $subject = sprintf(_('%s added your notice as a favorite'), $bestname);
++        $body = sprintf(_("%1\$s just added your notice from %2\$s as one of their favorites.\n\n" .
++                          "In case you forgot, you can see the text of your notice here:\n\n" .
++                          "%3\$s\n\n" .
++                          "You can see the list of %1\$s's favorites here:\n\n" .
++                          "%4\$s\n\n" .
++                          "Faithfully yours,\n" .
++                          "%5\$s\n"),
++                        $bestname,
++                        common_exact_date($notice->created),
++                        common_local_url('shownotice', array('notice' => $notice->id)),
++                        common_local_url('showfavorites', array('nickname' => $user->nickname)),
++                        common_config('site', 'name'));
+hunk ./actions/twitapifavorites.php 172
+-              mail_to_user($other, $subject, $body);
+-      }
++        mail_to_user($other, $subject, $body);
++    }
+hunk ./actions/twitapifriendships.php 26
+-      function create($args, $apidata) {
+-              parent::handle($args);
++    function create($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapifriendships.php 29
+-              if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+-                      $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
+-                      return;
+-              }
++        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
++            $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapifriendships.php 34
+-              $id = $apidata['api_arg'];
++        $id = $apidata['api_arg'];
+hunk ./actions/twitapifriendships.php 36
+-              $other = $this->get_user($id);
++        $other = $this->get_user($id);
+hunk ./actions/twitapifriendships.php 38
+-              if (!$other) {
+-                      $this->client_error(_('Could not follow user: User not found.'), 403, $apidata['content-type']);
+-                      return;
+-              }
++        if (!$other) {
++            $this->client_error(_('Could not follow user: User not found.'), 403, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapifriendships.php 43
+-              $user = $apidata['user'];
++        $user = $apidata['user'];
+hunk ./actions/twitapifriendships.php 45
+-              if ($user->isSubscribed($other)) {
+-                      $errmsg = sprintf(_('Could not follow user: %s is already on your list.'), $other->nickname);
+-                      $this->client_error($errmsg, 403, $apidata['content-type']);
+-                      return;
+-              }
++        if ($user->isSubscribed($other)) {
++            $errmsg = sprintf(_('Could not follow user: %s is already on your list.'), $other->nickname);
++            $this->client_error($errmsg, 403, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapifriendships.php 51
+-              $sub = new Subscription();
++        $sub = new Subscription();
+hunk ./actions/twitapifriendships.php 53
+-              $sub->query('BEGIN');
++        $sub->query('BEGIN');
+hunk ./actions/twitapifriendships.php 55
+-              $sub->subscriber = $user->id;
+-              $sub->subscribed = $other->id;
+-              $sub->created = DB_DataObject_Cast::dateTime(); # current time
++        $sub->subscriber = $user->id;
++        $sub->subscribed = $other->id;
++        $sub->created = DB_DataObject_Cast::dateTime(); # current time
+hunk ./actions/twitapifriendships.php 59
+-              $result = $sub->insert();
++        $result = $sub->insert();
+hunk ./actions/twitapifriendships.php 61
+-              if (!$result) {
+-                      $errmsg = sprintf(_('Could not follow user: %s is already on your list.'), $other->nickname);
+-                      $this->client_error($errmsg, 400, $apidata['content-type']);
+-                      return;
+-              }
++        if (!$result) {
++            $errmsg = sprintf(_('Could not follow user: %s is already on your list.'), $other->nickname);
++            $this->client_error($errmsg, 400, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapifriendships.php 67
+-              $sub->query('COMMIT');
++        $sub->query('COMMIT');
+hunk ./actions/twitapifriendships.php 69
+-              mail_subscribe_notify($other, $user);
++        mail_subscribe_notify($other, $user);
+hunk ./actions/twitapifriendships.php 71
+-              $type = $apidata['content-type'];
+-              $this->init_document($type);
+-              $this->show_profile($other, $type);
+-              $this->end_document($type);
++        $type = $apidata['content-type'];
++        $this->init_document($type);
++        $this->show_profile($other, $type);
++        $this->end_document($type);
+hunk ./actions/twitapifriendships.php 76
+-      }
++    }
+hunk ./actions/twitapifriendships.php 78
+-      function destroy($args, $apidata) {
+-              parent::handle($args);
++    function destroy($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapifriendships.php 81
+-              if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
+-                      $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
+-                      return;
+-              }
++        if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
++            $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapifriendships.php 86
+-              $id = $apidata['api_arg'];
++        $id = $apidata['api_arg'];
+hunk ./actions/twitapifriendships.php 88
+-              # We can't subscribe to a remote person, but we can unsub
++        # We can't subscribe to a remote person, but we can unsub
+hunk ./actions/twitapifriendships.php 90
+-              $other = $this->get_profile($id);
+-              $user = $apidata['user'];
++        $other = $this->get_profile($id);
++        $user = $apidata['user'];
+hunk ./actions/twitapifriendships.php 93
+-              $sub = new Subscription();
+-              $sub->subscriber = $user->id;
+-              $sub->subscribed = $other->id;
++        $sub = new Subscription();
++        $sub->subscriber = $user->id;
++        $sub->subscribed = $other->id;
+hunk ./actions/twitapifriendships.php 97
+-              if ($sub->find(TRUE)) {
+-                      $sub->query('BEGIN');
+-                      $sub->delete();
+-                      $sub->query('COMMIT');
+-              } else {
+-                      $this->client_error(_('You are not friends with the specified user.'), 403, $apidata['content-type']);
+-                      return;
+-              }
++        if ($sub->find(TRUE)) {
++            $sub->query('BEGIN');
++            $sub->delete();
++            $sub->query('COMMIT');
++        } else {
++            $this->client_error(_('You are not friends with the specified user.'), 403, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapifriendships.php 106
+-              $type = $apidata['content-type'];
+-              $this->init_document($type);
+-              $this->show_profile($other, $type);
+-              $this->end_document($type);
++        $type = $apidata['content-type'];
++        $this->init_document($type);
++        $this->show_profile($other, $type);
++        $this->end_document($type);
+hunk ./actions/twitapifriendships.php 111
+-      }
++    }
+hunk ./actions/twitapifriendships.php 113
+-      function exists($args, $apidata) {
+-              parent::handle($args);
++    function exists($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapifriendships.php 116
+-              if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+-                      common_user_error(_('API method not found!'), $code = 404);
+-                      return;
+-              }
++        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
++            common_user_error(_('API method not found!'), $code = 404);
++            return;
++        }
+hunk ./actions/twitapifriendships.php 121
+-              $user_a_id = $this->trimmed('user_a');
+-              $user_b_id = $this->trimmed('user_b');
++        $user_a_id = $this->trimmed('user_a');
++        $user_b_id = $this->trimmed('user_b');
+hunk ./actions/twitapifriendships.php 124
+-              $user_a = $this->get_user($user_a_id);
+-              $user_b = $this->get_user($user_b_id);
++        $user_a = $this->get_user($user_a_id);
++        $user_b = $this->get_user($user_b_id);
+hunk ./actions/twitapifriendships.php 127
+-              if (!$user_a || !$user_b) {
+-                      $this->client_error(_('Two user ids or screen_names must be supplied.'), 400, $apidata['content-type']);
+-                      return;
+-              }
++        if (!$user_a || !$user_b) {
++            $this->client_error(_('Two user ids or screen_names must be supplied.'), 400, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapifriendships.php 132
+-              if ($user_a->isSubscribed($user_b)) {
+-                      $result = 'true';
+-              } else {
+-                      $result = 'false';
+-              }
++        if ($user_a->isSubscribed($user_b)) {
++            $result = 'true';
++        } else {
++            $result = 'false';
++        }
+hunk ./actions/twitapifriendships.php 138
+-              switch ($apidata['content-type']) {
+-               case 'xml':
+-                      $this->init_document('xml');
+-                      common_element('friends', NULL, $result);
+-                      $this->end_document('xml');
+-                      break;
+-               case 'json':
+-                      $this->init_document('json');
+-                      print json_encode($result);
+-                      $this->end_document('json');
+-                      break;
+-               default:
+-                      break;
+-              }
++        switch ($apidata['content-type']) {
++         case 'xml':
++            $this->init_document('xml');
++            common_element('friends', NULL, $result);
++            $this->end_document('xml');
++            break;
++         case 'json':
++            $this->init_document('json');
++            print json_encode($result);
++            $this->end_document('json');
++            break;
++         default:
++            break;
++        }
+hunk ./actions/twitapifriendships.php 153
+-      }
++    }
+hunk ./actions/twitapihelp.php 26
+-      /* Returns the string "ok" in the requested format with a 200 OK HTTP status code.
+-       * URL:http://identi.ca/api/help/test.format
+-       * Formats: xml, json
+-       */
+-      function test($args, $apidata) {
+-              parent::handle($args);
++    /* Returns the string "ok" in the requested format with a 200 OK HTTP status code.
++     * URL:http://identi.ca/api/help/test.format
++     * Formats: xml, json
++     */
++    function test($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapihelp.php 33
+-              if ($apidata['content-type'] == 'xml') {
+-                      $this->init_document('xml');
+-                      common_element('ok', NULL, 'true');
+-                      $this->end_document('xml');
+-              } elseif ($apidata['content-type'] == 'json') {
+-                      $this->init_document('json');
+-                      print '"ok"';
+-                      $this->end_document('json');
+-              } else {
+-                      common_user_error(_('API method not found!'), $code=404);
+-              }
++        if ($apidata['content-type'] == 'xml') {
++            $this->init_document('xml');
++            common_element('ok', NULL, 'true');
++            $this->end_document('xml');
++        } elseif ($apidata['content-type'] == 'json') {
++            $this->init_document('json');
++            print '"ok"';
++            $this->end_document('json');
++        } else {
++            common_user_error(_('API method not found!'), $code=404);
++        }
+hunk ./actions/twitapihelp.php 45
+-      }
++    }
+hunk ./actions/twitapihelp.php 47
+-      function downtime_schedule($args, $apidata) {
+-              parent::handle($args);
+-              common_server_error(_('API method under construction.'), $code=501);
+-      }
++    function downtime_schedule($args, $apidata) {
++        parent::handle($args);
++        common_server_error(_('API method under construction.'), $code=501);
++    }
+hunk ./actions/twitapinotifications.php 27
+-      function follow($args, $apidata) {
+-              parent::handle($args);
+-              common_server_error(_('API method under construction.'), $code=501);
+-      }
++    function follow($args, $apidata) {
++        parent::handle($args);
++        common_server_error(_('API method under construction.'), $code=501);
++    }
+hunk ./actions/twitapinotifications.php 32
+-      function leave($args, $apidata) {
+-              parent::handle($args);
+-              common_server_error(_('API method under construction.'), $code=501);
+-      }
++    function leave($args, $apidata) {
++        parent::handle($args);
++        common_server_error(_('API method under construction.'), $code=501);
++    }
+hunk ./actions/twitapistatuses.php 26
+-      function public_timeline($args, $apidata) {
+-              parent::handle($args);
++    function public_timeline($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapistatuses.php 29
+-              $sitename = common_config('site', 'name');
+-              $siteserver = common_config('site', 'server');
+-              $title = sprintf(_("%s public timeline"), $sitename);
+-              $id = "tag:$siteserver:Statuses";
+-              $link = common_root_url();
+-              $subtitle = sprintf(_("%s updates from everyone!"), $sitename);
++        $sitename = common_config('site', 'name');
++        $siteserver = common_config('site', 'server');
++        $title = sprintf(_("%s public timeline"), $sitename);
++        $id = "tag:$siteserver:Statuses";
++        $link = common_root_url();
++        $subtitle = sprintf(_("%s updates from everyone!"), $sitename);
+hunk ./actions/twitapistatuses.php 36
+-              // Number of public statuses to return by default -- Twitter sends 20
+-              $MAX_PUBSTATUSES = 20;
++        // Number of public statuses to return by default -- Twitter sends 20
++        $MAX_PUBSTATUSES = 20;
+hunk ./actions/twitapistatuses.php 39
+-              // FIXME: To really live up to the spec we need to build a list
+-              // of notices by users who have custom avatars, so fix this SQL -- Zach
++        // FIXME: To really live up to the spec we need to build a list
++        // of notices by users who have custom avatars, so fix this SQL -- Zach
+hunk ./actions/twitapistatuses.php 42
+-              $page = $this->arg('page');
+-              $since_id = $this->arg('since_id');
+-              $before_id = $this->arg('before_id');
++        $page = $this->arg('page');
++        $since_id = $this->arg('since_id');
++        $before_id = $this->arg('before_id');
+hunk ./actions/twitapistatuses.php 46
+-              // NOTE: page, since_id, and before_id are extensions to Twitter API -- TB
+-              if (!$page) {
+-                      $page = 1;
+-              }
+-              if (!$since_id) {
+-                      $since_id = 0;
+-              }
+-              if (!$before_id) {
+-                      $before_id = 0;
+-              }
++        // NOTE: page, since_id, and before_id are extensions to Twitter API -- TB
++        if (!$page) {
++            $page = 1;
++        }
++        if (!$since_id) {
++            $since_id = 0;
++        }
++        if (!$before_id) {
++            $before_id = 0;
++        }
+hunk ./actions/twitapistatuses.php 57
+-              $since = strtotime($this->arg('since'));
++        $since = strtotime($this->arg('since'));
+hunk ./actions/twitapistatuses.php 59
+-              $notice = Notice::publicStream((($page-1)*$MAX_PUBSTATUSES), $MAX_PUBSTATUSES, $since_id, $before_id, $since);
++        $notice = Notice::publicStream((($page-1)*$MAX_PUBSTATUSES), $MAX_PUBSTATUSES, $since_id, $before_id, $since);
+hunk ./actions/twitapistatuses.php 61
+-              if ($notice) {
++        if ($notice) {
+hunk ./actions/twitapistatuses.php 63
+-                      switch($apidata['content-type']) {
+-                              case 'xml':
+-                                      $this->show_xml_timeline($notice);
+-                                      break;
+-                              case 'rss':
+-                                      $this->show_rss_timeline($notice, $title, $link, $subtitle);
+-                                      break;
+-                              case 'atom':
+-                                      $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
+-                                      break;
+-                              case 'json':
+-                                      $this->show_json_timeline($notice);
+-                                      break;
+-                              default:
+-                                      common_user_error(_('API method not found!'), $code = 404);
+-                                      break;
+-                      }
++            switch($apidata['content-type']) {
++                case 'xml':
++                    $this->show_xml_timeline($notice);
++                    break;
++                case 'rss':
++                    $this->show_rss_timeline($notice, $title, $link, $subtitle);
++                    break;
++                case 'atom':
++                    $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
++                    break;
++                case 'json':
++                    $this->show_json_timeline($notice);
++                    break;
++                default:
++                    common_user_error(_('API method not found!'), $code = 404);
++                    break;
++            }
+hunk ./actions/twitapistatuses.php 81
+-              } else {
+-                      common_server_error(_('Couldn\'t find any statuses.'), $code = 503);
+-              }
++        } else {
++            common_server_error(_('Couldn\'t find any statuses.'), $code = 503);
++        }
+hunk ./actions/twitapistatuses.php 85
+-      }
++    }
+hunk ./actions/twitapistatuses.php 87
+-      function friends_timeline($args, $apidata) {
+-              parent::handle($args);
++    function friends_timeline($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapistatuses.php 90
+-              $since = $this->arg('since');
+-              $since_id = $this->arg('since_id');
+-              $count = $this->arg('count');
+-              $page = $this->arg('page');
+-              $before_id = $this->arg('before_id');
++        $since = $this->arg('since');
++        $since_id = $this->arg('since_id');
++        $count = $this->arg('count');
++        $page = $this->arg('page');
++        $before_id = $this->arg('before_id');
+hunk ./actions/twitapistatuses.php 96
+-              if (!$page) {
+-                      $page = 1;
+-              }
++        if (!$page) {
++            $page = 1;
++        }
+hunk ./actions/twitapistatuses.php 100
+-              if (!$count) {
+-                      $count = 20;
+-              }
++        if (!$count) {
++            $count = 20;
++        }
+hunk ./actions/twitapistatuses.php 104
+-              if (!$since_id) {
+-                      $since_id = 0;
+-              }
++        if (!$since_id) {
++            $since_id = 0;
++        }
+hunk ./actions/twitapistatuses.php 108
+-              // NOTE: before_id is an extension to Twitter API -- TB
+-              if (!$before_id) {
+-                      $before_id = 0;
+-              }
++        // NOTE: before_id is an extension to Twitter API -- TB
++        if (!$before_id) {
++            $before_id = 0;
++        }
+hunk ./actions/twitapistatuses.php 113
+-              $since = strtotime($this->arg('since'));
++        $since = strtotime($this->arg('since'));
+hunk ./actions/twitapistatuses.php 115
+-              $user = $this->get_user(NULL, $apidata);
+-              $this->auth_user = $user;
++        $user = $this->get_user(NULL, $apidata);
++        $this->auth_user = $user;
+hunk ./actions/twitapistatuses.php 118
+-              $profile = $user->getProfile();
++        $profile = $user->getProfile();
+hunk ./actions/twitapistatuses.php 120
+-              $sitename = common_config('site', 'name');
+-              $siteserver = common_config('site', 'server');
++        $sitename = common_config('site', 'name');
++        $siteserver = common_config('site', 'server');
+hunk ./actions/twitapistatuses.php 123
+-              $title = sprintf(_("%s and friends"), $user->nickname);
+-              $id = "tag:$siteserver:friends:" . $user->id;
+-              $link = common_local_url('all', array('nickname' => $user->nickname));
+-              $subtitle = sprintf(_('Updates from %1$s and friends on %2$s!'), $user->nickname, $sitename);
++        $title = sprintf(_("%s and friends"), $user->nickname);
++        $id = "tag:$siteserver:friends:" . $user->id;
++        $link = common_local_url('all', array('nickname' => $user->nickname));
++        $subtitle = sprintf(_('Updates from %1$s and friends on %2$s!'), $user->nickname, $sitename);
+hunk ./actions/twitapistatuses.php 128
+-              $notice = $user->noticesWithFriends(($page-1)*20, $count, $since_id, $before_id, $since);
++        $notice = $user->noticesWithFriends(($page-1)*20, $count, $since_id, $before_id, $since);
+hunk ./actions/twitapistatuses.php 130
+-              switch($apidata['content-type']) {
+-               case 'xml':
+-                      $this->show_xml_timeline($notice);
+-                      break;
+-               case 'rss':
+-                      $this->show_rss_timeline($notice, $title, $link, $subtitle);
+-                      break;
+-               case 'atom':
+-                      $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
+-                      break;
+-               case 'json':
+-                      $this->show_json_timeline($notice);
+-                      break;
+-               default:
+-                      common_user_error(_('API method not found!'), $code = 404);
+-              }
++        switch($apidata['content-type']) {
++         case 'xml':
++            $this->show_xml_timeline($notice);
++            break;
++         case 'rss':
++            $this->show_rss_timeline($notice, $title, $link, $subtitle);
++            break;
++         case 'atom':
++            $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
++            break;
++         case 'json':
++            $this->show_json_timeline($notice);
++            break;
++         default:
++            common_user_error(_('API method not found!'), $code = 404);
++        }
+hunk ./actions/twitapistatuses.php 147
+-      }
++    }
+hunk ./actions/twitapistatuses.php 149
+-      function user_timeline($args, $apidata) {
+-              parent::handle($args);
++    function user_timeline($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapistatuses.php 152
+-              $this->auth_user = $apidata['user'];
+-              $user = $this->get_user($apidata['api_arg'], $apidata);
++        $this->auth_user = $apidata['user'];
++        $user = $this->get_user($apidata['api_arg'], $apidata);
+hunk ./actions/twitapistatuses.php 155
+-              if (!$user) {
+-                      $this->client_error('Not Found', 404, $apidata['content-type']);
+-                      return;
+-              }
++        if (!$user) {
++            $this->client_error('Not Found', 404, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapistatuses.php 160
+-              $profile = $user->getProfile();
++        $profile = $user->getProfile();
+hunk ./actions/twitapistatuses.php 162
+-              if (!$profile) {
+-                      common_server_error(_('User has no profile.'));
+-                      return;
+-              }
++        if (!$profile) {
++            common_server_error(_('User has no profile.'));
++            return;
++        }
+hunk ./actions/twitapistatuses.php 167
+-              $count = $this->arg('count');
+-              $since = $this->arg('since');
+-              $since_id = $this->arg('since_id');
+-              $page = $this->arg('page');
+-              $before_id = $this->arg('before_id');
++        $count = $this->arg('count');
++        $since = $this->arg('since');
++        $since_id = $this->arg('since_id');
++        $page = $this->arg('page');
++        $before_id = $this->arg('before_id');
+hunk ./actions/twitapistatuses.php 173
+-              if (!$page) {
+-                      $page = 1;
+-              }
++        if (!$page) {
++            $page = 1;
++        }
+hunk ./actions/twitapistatuses.php 177
+-              if (!$count) {
+-                      $count = 20;
+-              }
++        if (!$count) {
++            $count = 20;
++        }
+hunk ./actions/twitapistatuses.php 181
+-              if (!$since_id) {
+-                      $since_id = 0;
+-              }
++        if (!$since_id) {
++            $since_id = 0;
++        }
+hunk ./actions/twitapistatuses.php 185
+-              // NOTE: before_id is an extensions to Twitter API -- TB
+-              if (!$before_id) {
+-                      $before_id = 0;
+-              }
++        // NOTE: before_id is an extensions to Twitter API -- TB
++        if (!$before_id) {
++            $before_id = 0;
++        }
+hunk ./actions/twitapistatuses.php 190
+-              $since = strtotime($this->arg('since'));
++        $since = strtotime($this->arg('since'));
+hunk ./actions/twitapistatuses.php 192
+-              $sitename = common_config('site', 'name');
+-              $siteserver = common_config('site', 'server');
++        $sitename = common_config('site', 'name');
++        $siteserver = common_config('site', 'server');
+hunk ./actions/twitapistatuses.php 195
+-              $title = sprintf(_("%s timeline"), $user->nickname);
+-              $id = "tag:$siteserver:user:".$user->id;
+-              $link = common_local_url('showstream', array('nickname' => $user->nickname));
+-              $subtitle = sprintf(_('Updates from %1$s on %2$s!'), $user->nickname, $sitename);
++        $title = sprintf(_("%s timeline"), $user->nickname);
++        $id = "tag:$siteserver:user:".$user->id;
++        $link = common_local_url('showstream', array('nickname' => $user->nickname));
++        $subtitle = sprintf(_('Updates from %1$s on %2$s!'), $user->nickname, $sitename);
+hunk ./actions/twitapistatuses.php 200
+-              # FriendFeed's SUP protocol
+-              # Also added RSS and Atom feeds
++        # FriendFeed's SUP protocol
++        # Also added RSS and Atom feeds
+hunk ./actions/twitapistatuses.php 203
+-              $suplink = common_local_url('sup', NULL, $user->id);
+-              header('X-SUP-ID: '.$suplink);
++        $suplink = common_local_url('sup', NULL, $user->id);
++        header('X-SUP-ID: '.$suplink);
+hunk ./actions/twitapistatuses.php 206
+-              # XXX: since
++        # XXX: since
+hunk ./actions/twitapistatuses.php 208
+-              $notice = $user->getNotices((($page-1)*20), $count, $since_id, $before_id, $since);
++        $notice = $user->getNotices((($page-1)*20), $count, $since_id, $before_id, $since);
+hunk ./actions/twitapistatuses.php 210
+-              switch($apidata['content-type']) {
+-               case 'xml':
+-                      $this->show_xml_timeline($notice);
+-                      break;
+-               case 'rss':
+-                      $this->show_rss_timeline($notice, $title, $link, $subtitle, $suplink);
+-                      break;
+-               case 'atom':
+-                      $this->show_atom_timeline($notice, $title, $id, $link, $subtitle, $suplink);
+-                      break;
+-               case 'json':
+-                      $this->show_json_timeline($notice);
+-                      break;
+-               default:
+-                      common_user_error(_('API method not found!'), $code = 404);
+-              }
++        switch($apidata['content-type']) {
++         case 'xml':
++            $this->show_xml_timeline($notice);
++            break;
++         case 'rss':
++            $this->show_rss_timeline($notice, $title, $link, $subtitle, $suplink);
++            break;
++         case 'atom':
++            $this->show_atom_timeline($notice, $title, $id, $link, $subtitle, $suplink);
++            break;
++         case 'json':
++            $this->show_json_timeline($notice);
++            break;
++         default:
++            common_user_error(_('API method not found!'), $code = 404);
++        }
+hunk ./actions/twitapistatuses.php 227
+-      }
++    }
+hunk ./actions/twitapistatuses.php 229
+-      function update($args, $apidata) {
++    function update($args, $apidata) {
+hunk ./actions/twitapistatuses.php 231
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/twitapistatuses.php 233
+-              if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+-                      common_user_error(_('API method not found!'), $code = 404);
+-                      return;
+-              }
++        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
++            common_user_error(_('API method not found!'), $code = 404);
++            return;
++        }
+hunk ./actions/twitapistatuses.php 238
+-              if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+-                      $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
+-                      return;
+-              }
++        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
++            $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapistatuses.php 243
+-              $this->auth_user = $apidata['user'];
+-              $user = $this->auth_user;
+-              $status = $this->trimmed('status');
+-              $source = $this->trimmed('source');
+-              $in_reply_to_status_id = intval($this->trimmed('in_reply_to_status_id'));
++        $this->auth_user = $apidata['user'];
++        $user = $this->auth_user;
++        $status = $this->trimmed('status');
++        $source = $this->trimmed('source');
++        $in_reply_to_status_id = intval($this->trimmed('in_reply_to_status_id'));
+hunk ./actions/twitapistatuses.php 249
+-              if (!$source || in_array($source, $reserved_sources)) {
+-                      $source = 'api';
+-              }
++        if (!$source || in_array($source, $reserved_sources)) {
++            $source = 'api';
++        }
+hunk ./actions/twitapistatuses.php 253
+-              if (!$status) {
++        if (!$status) {
+hunk ./actions/twitapistatuses.php 255
+-                      // XXX: Note: In this case, Twitter simply returns '200 OK'
+-                      // No error is given, but the status is not posted to the
+-                      // user's timeline.      Seems bad.      Shouldn't we throw an
+-                      // errror? -- Zach
+-                      return;
++            // XXX: Note: In this case, Twitter simply returns '200 OK'
++            // No error is given, but the status is not posted to the
++            // user's timeline.     Seems bad.     Shouldn't we throw an
++            // errror? -- Zach
++            return;
+hunk ./actions/twitapistatuses.php 261
+-              } else {
++        } else {
+hunk ./actions/twitapistatuses.php 263
+-                      $status_shortened = common_shorten_links($status);
++            $status_shortened = common_shorten_links($status);
+hunk ./actions/twitapistatuses.php 265
+-                      if (mb_strlen($status_shortened) > 140) {
++            if (mb_strlen($status_shortened) > 140) {
+hunk ./actions/twitapistatuses.php 267
+-                              // XXX: Twitter truncates anything over 140, flags the status
+-                              // as "truncated." Sending this error may screw up some clients
+-                              // that assume Twitter will truncate for them.  Should we just
+-                              // truncate too? -- Zach
+-                              $this->client_error(_('That\'s too long. Max notice size is 140 chars.'), $code = 406, $apidata['content-type']);
+-                              return;
++                // XXX: Twitter truncates anything over 140, flags the status
++                // as "truncated." Sending this error may screw up some clients
++                // that assume Twitter will truncate for them.    Should we just
++                // truncate too? -- Zach
++                $this->client_error(_('That\'s too long. Max notice size is 140 chars.'), $code = 406, $apidata['content-type']);
++                return;
+hunk ./actions/twitapistatuses.php 274
+-                      }
+-              }
++            }
++        }
+hunk ./actions/twitapistatuses.php 277
+-              // Check for commands
+-              $inter = new CommandInterpreter();
+-              $cmd = $inter->handle_command($user, $status_shortened);
++        // Check for commands
++        $inter = new CommandInterpreter();
++        $cmd = $inter->handle_command($user, $status_shortened);
+hunk ./actions/twitapistatuses.php 281
+-              if ($cmd) {
++        if ($cmd) {
+hunk ./actions/twitapistatuses.php 283
+-                      if ($this->supported($cmd)) {
+-                              $cmd->execute(new Channel());
+-                      }
++            if ($this->supported($cmd)) {
++                $cmd->execute(new Channel());
++            }
+hunk ./actions/twitapistatuses.php 287
+-                      // cmd not supported?  Twitter just returns your latest status.
+-                      // And, it returns your last status whether the cmd was successful
+-                      // or not!
+-                      $n = $user->getCurrentNotice();
+-                      $apidata['api_arg'] = $n->id;
+-              } else {
++            // cmd not supported?  Twitter just returns your latest status.
++            // And, it returns your last status whether the cmd was successful
++            // or not!
++            $n = $user->getCurrentNotice();
++            $apidata['api_arg'] = $n->id;
++        } else {
+hunk ./actions/twitapistatuses.php 294
+-                      $reply_to = NULL;
++            $reply_to = NULL;
+hunk ./actions/twitapistatuses.php 296
+-                      if ($in_reply_to_status_id) {
++            if ($in_reply_to_status_id) {
+hunk ./actions/twitapistatuses.php 298
+-                              // check whether notice actually exists
+-                              $reply = Notice::staticGet($in_reply_to_status_id);
++                // check whether notice actually exists
++                $reply = Notice::staticGet($in_reply_to_status_id);
+hunk ./actions/twitapistatuses.php 301
+-                              if ($reply) {
+-                                      $reply_to = $in_reply_to_status_id;
+-                              } else {
+-                                      $this->client_error(_('Not found'), $code = 404, $apidata['content-type']);
+-                                      return;
+-                              }
+-                      }
++                if ($reply) {
++                    $reply_to = $in_reply_to_status_id;
++                } else {
++                    $this->client_error(_('Not found'), $code = 404, $apidata['content-type']);
++                    return;
++                }
++            }
+hunk ./actions/twitapistatuses.php 309
+-                      $notice = Notice::saveNew($user->id, html_entity_decode($status, ENT_NOQUOTES, 'UTF-8'),
+-                              $source, 1, $reply_to);
++            $notice = Notice::saveNew($user->id, html_entity_decode($status, ENT_NOQUOTES, 'UTF-8'),
++                $source, 1, $reply_to);
+hunk ./actions/twitapistatuses.php 312
+-                      if (is_string($notice)) {
+-                              $this->server_error($notice);
+-                              return;
+-                      }
++            if (is_string($notice)) {
++                $this->server_error($notice);
++                return;
++            }
+hunk ./actions/twitapistatuses.php 317
+-                      common_broadcast_notice($notice);
+-                      $apidata['api_arg'] = $notice->id;
+-              }
++            common_broadcast_notice($notice);
++            $apidata['api_arg'] = $notice->id;
++        }
+hunk ./actions/twitapistatuses.php 321
+-              $this->show($args, $apidata);
+-      }
++        $this->show($args, $apidata);
++    }
+hunk ./actions/twitapistatuses.php 324
+-      function replies($args, $apidata) {
++    function replies($args, $apidata) {
+hunk ./actions/twitapistatuses.php 326
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/twitapistatuses.php 328
+-              $since = $this->arg('since');
+-              $count = $this->arg('count');
+-              $page = $this->arg('page');
+-              $since_id = $this->arg('since_id');
+-              $before_id = $this->arg('before_id');
++        $since = $this->arg('since');
++        $count = $this->arg('count');
++        $page = $this->arg('page');
++        $since_id = $this->arg('since_id');
++        $before_id = $this->arg('before_id');
+hunk ./actions/twitapistatuses.php 334
+-              $this->auth_user = $apidata['user'];
+-              $user = $this->auth_user;
+-              $profile = $user->getProfile();
++        $this->auth_user = $apidata['user'];
++        $user = $this->auth_user;
++        $profile = $user->getProfile();
+hunk ./actions/twitapistatuses.php 338
+-              $sitename = common_config('site', 'name');
+-              $siteserver = common_config('site', 'server');
++        $sitename = common_config('site', 'name');
++        $siteserver = common_config('site', 'server');
+hunk ./actions/twitapistatuses.php 341
+-              $title = sprintf(_('%1$s / Updates replying to %2$s'), $sitename, $user->nickname);
+-              $id = "tag:$siteserver:replies:".$user->id;
+-              $link = common_local_url('replies', array('nickname' => $user->nickname));
+-              $subtitle = sprintf(_('%1$s updates that reply to updates from %2$s / %3$s.'), $sitename, $user->nickname, $profile->getBestName());
++        $title = sprintf(_('%1$s / Updates replying to %2$s'), $sitename, $user->nickname);
++        $id = "tag:$siteserver:replies:".$user->id;
++        $link = common_local_url('replies', array('nickname' => $user->nickname));
++        $subtitle = sprintf(_('%1$s updates that reply to updates from %2$s / %3$s.'), $sitename, $user->nickname, $profile->getBestName());
+hunk ./actions/twitapistatuses.php 346
+-              if (!$page) {
+-                      $page = 1;
+-              }
++        if (!$page) {
++            $page = 1;
++        }
+hunk ./actions/twitapistatuses.php 350
+-              if (!$count) {
+-                      $count = 20;
+-              }
++        if (!$count) {
++            $count = 20;
++        }
+hunk ./actions/twitapistatuses.php 354
+-              if (!$since_id) {
+-                      $since_id = 0;
+-              }
++        if (!$since_id) {
++            $since_id = 0;
++        }
+hunk ./actions/twitapistatuses.php 358
+-              // NOTE: before_id is an extension to Twitter API -- TB
+-              if (!$before_id) {
+-                      $before_id = 0;
+-              }
++        // NOTE: before_id is an extension to Twitter API -- TB
++        if (!$before_id) {
++            $before_id = 0;
++        }
+hunk ./actions/twitapistatuses.php 363
+-              $since = strtotime($this->arg('since'));
++        $since = strtotime($this->arg('since'));
+hunk ./actions/twitapistatuses.php 365
+-              $notice = $user->getReplies((($page-1)*20), $count, $since_id, $before_id, $since);
+-              $notices = array();
++        $notice = $user->getReplies((($page-1)*20), $count, $since_id, $before_id, $since);
++        $notices = array();
+hunk ./actions/twitapistatuses.php 368
+-              while ($notice->fetch()) {
+-                      $notices[] = clone($notice);
+-              }
++        while ($notice->fetch()) {
++            $notices[] = clone($notice);
++        }
+hunk ./actions/twitapistatuses.php 372
+-              switch($apidata['content-type']) {
+-               case 'xml':
+-                      $this->show_xml_timeline($notices);
+-                      break;
+-               case 'rss':
+-                      $this->show_rss_timeline($notices, $title, $link, $subtitle);
+-                      break;
+-               case 'atom':
+-                      $this->show_atom_timeline($notices, $title, $id, $link, $subtitle);
+-                      break;
+-               case 'json':
+-                      $this->show_json_timeline($notices);
+-                      break;
+-               default:
+-                      common_user_error(_('API method not found!'), $code = 404);
+-              }
++        switch($apidata['content-type']) {
++         case 'xml':
++            $this->show_xml_timeline($notices);
++            break;
++         case 'rss':
++            $this->show_rss_timeline($notices, $title, $link, $subtitle);
++            break;
++         case 'atom':
++            $this->show_atom_timeline($notices, $title, $id, $link, $subtitle);
++            break;
++         case 'json':
++            $this->show_json_timeline($notices);
++            break;
++         default:
++            common_user_error(_('API method not found!'), $code = 404);
++        }
+hunk ./actions/twitapistatuses.php 389
+-      }
++    }
+hunk ./actions/twitapistatuses.php 391
+-      function show($args, $apidata) {
+-              parent::handle($args);
++    function show($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapistatuses.php 394
+-              if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+-                      common_user_error(_('API method not found!'), $code = 404);
+-                      return;
+-              }
++        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
++            common_user_error(_('API method not found!'), $code = 404);
++            return;
++        }
+hunk ./actions/twitapistatuses.php 399
+-              $this->auth_user = $apidata['user'];
+-              $notice_id = $apidata['api_arg'];
+-              $notice = Notice::staticGet($notice_id);
++        $this->auth_user = $apidata['user'];
++        $notice_id = $apidata['api_arg'];
++        $notice = Notice::staticGet($notice_id);
+hunk ./actions/twitapistatuses.php 403
+-              if ($notice) {
+-                      if ($apidata['content-type'] == 'xml') {
+-                              $this->show_single_xml_status($notice);
+-                      } elseif ($apidata['content-type'] == 'json') {
+-                              $this->show_single_json_status($notice);
+-                      }
+-              } else {
+-                      // XXX: Twitter just sets a 404 header and doens't bother to return an err msg
+-                      $this->client_error(_('No status with that ID found.'), 404, $apidata['content-type']);
+-              }
++        if ($notice) {
++            if ($apidata['content-type'] == 'xml') {
++                $this->show_single_xml_status($notice);
++            } elseif ($apidata['content-type'] == 'json') {
++                $this->show_single_json_status($notice);
++            }
++        } else {
++            // XXX: Twitter just sets a 404 header and doens't bother to return an err msg
++            $this->client_error(_('No status with that ID found.'), 404, $apidata['content-type']);
++        }
+hunk ./actions/twitapistatuses.php 414
+-      }
++    }
+hunk ./actions/twitapistatuses.php 416
+-      function destroy($args, $apidata) {
++    function destroy($args, $apidata) {
+hunk ./actions/twitapistatuses.php 418
+-              parent::handle($args);
++        parent::handle($args);
+hunk ./actions/twitapistatuses.php 420
+-              if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+-                      common_user_error(_('API method not found!'), $code = 404);
+-                      return;
+-              }
++        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
++            common_user_error(_('API method not found!'), $code = 404);
++            return;
++        }
+hunk ./actions/twitapistatuses.php 425
+-              // Check for RESTfulness
+-              if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
+-                      // XXX: Twitter just prints the err msg, no XML / JSON.
+-                      $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
+-                      return;
+-              }
++        // Check for RESTfulness
++        if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
++            // XXX: Twitter just prints the err msg, no XML / JSON.
++            $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapistatuses.php 432
+-              $this->auth_user = $apidata['user'];
+-              $user = $this->auth_user;
+-              $notice_id = $apidata['api_arg'];
+-              $notice = Notice::staticGet($notice_id);
++        $this->auth_user = $apidata['user'];
++        $user = $this->auth_user;
++        $notice_id = $apidata['api_arg'];
++        $notice = Notice::staticGet($notice_id);
+hunk ./actions/twitapistatuses.php 437
+-              if (!$notice) {
+-                      $this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']);
+-                      return;
+-              }
++        if (!$notice) {
++            $this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapistatuses.php 442
+-              if ($user->id == $notice->profile_id) {
+-                      $replies = new Reply;
+-                      $replies->get('notice_id', $notice_id);
+-                      common_dequeue_notice($notice);
+-                      $replies->delete();
+-                      $notice->delete();
++        if ($user->id == $notice->profile_id) {
++            $replies = new Reply;
++            $replies->get('notice_id', $notice_id);
++            common_dequeue_notice($notice);
++            $replies->delete();
++            $notice->delete();
+hunk ./actions/twitapistatuses.php 449
+-                      if ($apidata['content-type'] == 'xml') {
+-                              $this->show_single_xml_status($notice);
+-                      } elseif ($apidata['content-type'] == 'json') {
+-                              $this->show_single_json_status($notice);
+-                      }
+-              } else {
+-                      $this->client_error(_('You may not delete another user\'s status.'), 403, $apidata['content-type']);
+-              }
++            if ($apidata['content-type'] == 'xml') {
++                $this->show_single_xml_status($notice);
++            } elseif ($apidata['content-type'] == 'json') {
++                $this->show_single_json_status($notice);
++            }
++        } else {
++            $this->client_error(_('You may not delete another user\'s status.'), 403, $apidata['content-type']);
++        }
+hunk ./actions/twitapistatuses.php 458
+-      }
++    }
+hunk ./actions/twitapistatuses.php 460
+-      function friends($args, $apidata) {
+-              parent::handle($args);
+-              return $this->subscriptions($apidata, 'subscribed', 'subscriber');
+-      }
++    function friends($args, $apidata) {
++        parent::handle($args);
++        return $this->subscriptions($apidata, 'subscribed', 'subscriber');
++    }
+hunk ./actions/twitapistatuses.php 465
+-      function followers($args, $apidata) {
+-              parent::handle($args);
++    function followers($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapistatuses.php 468
+-              return $this->subscriptions($apidata, 'subscriber', 'subscribed');
+-      }
++        return $this->subscriptions($apidata, 'subscriber', 'subscribed');
++    }
+hunk ./actions/twitapistatuses.php 471
+-      function subscriptions($apidata, $other_attr, $user_attr) {
++    function subscriptions($apidata, $other_attr, $user_attr) {
+hunk ./actions/twitapistatuses.php 473
+-              # XXX: lite
++        # XXX: lite
+hunk ./actions/twitapistatuses.php 475
+-              $this->auth_user = $apidate['user'];
+-              $user = $this->get_user($apidata['api_arg'], $apidata);
++        $this->auth_user = $apidate['user'];
++        $user = $this->get_user($apidata['api_arg'], $apidata);
+hunk ./actions/twitapistatuses.php 478
+-              if (!$user) {
+-                      $this->client_error('Not Found', 404, $apidata['content-type']);
+-                      return;
+-              }
++        if (!$user) {
++            $this->client_error('Not Found', 404, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapistatuses.php 483
+-              $page = $this->trimmed('page');
++        $page = $this->trimmed('page');
+hunk ./actions/twitapistatuses.php 485
+-              if (!$page || !is_numeric($page)) {
+-                      $page = 1;
+-              }
++        if (!$page || !is_numeric($page)) {
++            $page = 1;
++        }
+hunk ./actions/twitapistatuses.php 489
+-              $profile = $user->getProfile();
++        $profile = $user->getProfile();
+hunk ./actions/twitapistatuses.php 491
+-              if (!$profile) {
+-                      common_server_error(_('User has no profile.'));
+-                      return;
+-              }
++        if (!$profile) {
++            common_server_error(_('User has no profile.'));
++            return;
++        }
+hunk ./actions/twitapistatuses.php 496
+-              $sub = new Subscription();
+-              $sub->$user_attr = $profile->id;
++        $sub = new Subscription();
++        $sub->$user_attr = $profile->id;
+hunk ./actions/twitapistatuses.php 499
+-              $since = strtotime($this->trimmed('since'));
++        $since = strtotime($this->trimmed('since'));
+hunk ./actions/twitapistatuses.php 501
+-              if ($since) {
+-                      $d = date('Y-m-d H:i:s', $since);
+-                      $sub->whereAdd("created > '$d'");
+-              }
++        if ($since) {
++            $d = date('Y-m-d H:i:s', $since);
++            $sub->whereAdd("created > '$d'");
++        }
+hunk ./actions/twitapistatuses.php 506
+-              $sub->orderBy('created DESC');
+-              $sub->limit(($page-1)*100, 100);
++        $sub->orderBy('created DESC');
++        $sub->limit(($page-1)*100, 100);
+hunk ./actions/twitapistatuses.php 509
+-              $others = array();
++        $others = array();
+hunk ./actions/twitapistatuses.php 511
+-              if ($sub->find()) {
+-                      while ($sub->fetch()) {
+-                              $others[] = Profile::staticGet($sub->$other_attr);
+-                      }
+-              } else {
+-                      // user has no followers
+-              }
++        if ($sub->find()) {
++            while ($sub->fetch()) {
++                $others[] = Profile::staticGet($sub->$other_attr);
++            }
++        } else {
++            // user has no followers
++        }
+hunk ./actions/twitapistatuses.php 519
+-              $type = $apidata['content-type'];
++        $type = $apidata['content-type'];
+hunk ./actions/twitapistatuses.php 521
+-              $this->init_document($type);
+-              $this->show_profiles($others, $type);
+-              $this->end_document($type);
+-      }
++        $this->init_document($type);
++        $this->show_profiles($others, $type);
++        $this->end_document($type);
++    }
+hunk ./actions/twitapistatuses.php 526
+-      function show_profiles($profiles, $type) {
+-              switch ($type) {
+-               case 'xml':
+-                      common_element_start('users', array('type' => 'array'));
+-                      foreach ($profiles as $profile) {
+-                              $this->show_profile($profile);
+-                      }
+-                      common_element_end('users');
+-                      break;
+-               case 'json':
+-                      $arrays = array();
+-                      foreach ($profiles as $profile) {
+-                              $arrays[] = $this->twitter_user_array($profile, true);
+-                      }
+-                      print json_encode($arrays);
+-                      break;
+-               default:
+-                      $this->client_error(_('unsupported file type'));
+-              }
+-      }
++    function show_profiles($profiles, $type) {
++        switch ($type) {
++         case 'xml':
++            common_element_start('users', array('type' => 'array'));
++            foreach ($profiles as $profile) {
++                $this->show_profile($profile);
++            }
++            common_element_end('users');
++            break;
++         case 'json':
++            $arrays = array();
++            foreach ($profiles as $profile) {
++                $arrays[] = $this->twitter_user_array($profile, true);
++            }
++            print json_encode($arrays);
++            break;
++         default:
++            $this->client_error(_('unsupported file type'));
++        }
++    }
+hunk ./actions/twitapistatuses.php 547
+-      function featured($args, $apidata) {
+-              parent::handle($args);
+-              common_server_error(_('API method under construction.'), $code=501);
+-      }
++    function featured($args, $apidata) {
++        parent::handle($args);
++        common_server_error(_('API method under construction.'), $code=501);
++    }
+hunk ./actions/twitapistatuses.php 552
+-      function supported($cmd) {
++    function supported($cmd) {
+hunk ./actions/twitapistatuses.php 554
+-              $cmdlist = array('MessageCommand', 'SubCommand', 'UnsubCommand', 'FavCommand', 'OnCommand', 'OffCommand');
++        $cmdlist = array('MessageCommand', 'SubCommand', 'UnsubCommand', 'FavCommand', 'OnCommand', 'OffCommand');
+hunk ./actions/twitapistatuses.php 556
+-              if (in_array(get_class($cmd), $cmdlist)) {
+-                      return true;
+-              }
++        if (in_array(get_class($cmd), $cmdlist)) {
++            return true;
++        }
+hunk ./actions/twitapistatuses.php 560
+-              return false;
+-      }
++        return false;
++    }
+hunk ./actions/twitapiusers.php 13
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+hunk ./actions/twitapiusers.php 17
+- * along with this program.    If not, see <http://www.gnu.org/licenses/>.
++ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+hunk ./actions/twitapiusers.php 26
+-      function show($args, $apidata) {
+-              parent::handle($args);
++    function show($args, $apidata) {
++        parent::handle($args);
+hunk ./actions/twitapiusers.php 29
+-              if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+-                      common_user_error(_('API method not found!'), $code = 404);
+-                      return;
+-              }
++        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
++            common_user_error(_('API method not found!'), $code = 404);
++            return;
++        }
+hunk ./actions/twitapiusers.php 34
+-              $user = null;
+-              $email = $this->arg('email');
++        $user = null;
++        $email = $this->arg('email');
+hunk ./actions/twitapiusers.php 37
+-              if ($email) {
+-                      $user = User::staticGet('email', $email);
+-              } elseif (isset($apidata['api_arg'])) {
+-                      $user = $this->get_user($apidata['api_arg']);
+-              }
++        if ($email) {
++            $user = User::staticGet('email', $email);
++        } elseif (isset($apidata['api_arg'])) {
++            $user = $this->get_user($apidata['api_arg']);
++        }
+hunk ./actions/twitapiusers.php 43
+-              if (!$user) {
+-                      // XXX: Twitter returns a random(?) user instead of throwing and err! -- Zach
+-                      $this->client_error(_('Not found.'), 404, $apidata['content-type']);
+-                      return;
+-              }
++        if (!$user) {
++            // XXX: Twitter returns a random(?) user instead of throwing and err! -- Zach
++            $this->client_error(_('Not found.'), 404, $apidata['content-type']);
++            return;
++        }
+hunk ./actions/twitapiusers.php 49
+-              $this->show_extended_profile($user, $apidata);
+-      }
++        $this->show_extended_profile($user, $apidata);
++    }
+hunk ./actions/twittersettings.php 28
+-      function get_instructions() {
+-              return _('Add your Twitter account to automatically send your notices to Twitter, ' .
+-                      'and subscribe to Twitter friends already here.');
+-      }
++    function get_instructions() {
++        return _('Add your Twitter account to automatically send your notices to Twitter, ' .
++            'and subscribe to Twitter friends already here.');
++    }
+hunk ./actions/twittersettings.php 33
+-      function show_form($msg=NULL, $success=false) {
+-              $user = common_current_user();
+-              $profile = $user->getProfile();
+-              $fuser = NULL;
+-              $flink = Foreign_link::getByUserID($user->id, 1); // 1 == Twitter
++    function show_form($msg=NULL, $success=false) {
++        $user = common_current_user();
++        $profile = $user->getProfile();
++        $fuser = NULL;
++        $flink = Foreign_link::getByUserID($user->id, 1); // 1 == Twitter
+hunk ./actions/twittersettings.php 39
+-              if ($flink) {
+-                      $fuser = $flink->getForeignUser();
+-              }
++        if ($flink) {
++            $fuser = $flink->getForeignUser();
++        }
+hunk ./actions/twittersettings.php 43
+-              $this->form_header(_('Twitter settings'), $msg, $success);
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'twittersettings',
+-                                                                                 'action' =>
+-                                                                                 common_local_url('twittersettings')));
+-              common_hidden('token', common_session_token());
++        $this->form_header(_('Twitter settings'), $msg, $success);
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'twittersettings',
++                                           'action' =>
++                                           common_local_url('twittersettings')));
++        common_hidden('token', common_session_token());
+hunk ./actions/twittersettings.php 50
+-              common_element('h2', NULL, _('Twitter Account'));
++        common_element('h2', NULL, _('Twitter Account'));
+hunk ./actions/twittersettings.php 52
+-              if ($fuser) {
+-                      common_element_start('p');
++        if ($fuser) {
++            common_element_start('p');
+hunk ./actions/twittersettings.php 55
+-                      common_element('span', 'twitter_user', $fuser->nickname);
+-                      common_element('a', array('href' => $fuser->uri),  $fuser->uri);
+-                      common_element('span', 'input_instructions',
+-                                     _('Current verified Twitter account.'));
+-                      common_hidden('flink_foreign_id', $flink->foreign_id);
+-                      common_element_end('p');
+-                      common_submit('remove', _('Remove'));
+-              } else {
+-                      common_input('twitter_username', _('Twitter user name'),
+-                                               ($this->arg('twitter_username')) ? $this->arg('twitter_username') : $profile->nickname,
+-                                               _('No spaces, please.')); // hey, it's what Twitter says
++            common_element('span', 'twitter_user', $fuser->nickname);
++            common_element('a', array('href' => $fuser->uri),  $fuser->uri);
++            common_element('span', 'input_instructions',
++                           _('Current verified Twitter account.'));
++            common_hidden('flink_foreign_id', $flink->foreign_id);
++            common_element_end('p');
++            common_submit('remove', _('Remove'));
++        } else {
++            common_input('twitter_username', _('Twitter user name'),
++                         ($this->arg('twitter_username')) ? $this->arg('twitter_username') : $profile->nickname,
++                         _('No spaces, please.')); // hey, it's what Twitter says
+hunk ./actions/twittersettings.php 67
+-                      common_password('twitter_password', _('Twitter password'));
+-              }
++            common_password('twitter_password', _('Twitter password'));
++        }
+hunk ./actions/twittersettings.php 70
+-              common_element('h2', NULL, _('Preferences'));
++        common_element('h2', NULL, _('Preferences'));
+hunk ./actions/twittersettings.php 72
+-              common_checkbox('noticesync', _('Automatically send my notices to Twitter.'),
+-                                              ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND) : true);
++        common_checkbox('noticesync', _('Automatically send my notices to Twitter.'),
++                        ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND) : true);
+hunk ./actions/twittersettings.php 75
+-              common_checkbox('replysync', _('Send local "@" replies to Twitter.'),
+-                                              ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true);
++        common_checkbox('replysync', _('Send local "@" replies to Twitter.'),
++                        ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true);
+hunk ./actions/twittersettings.php 78
+-              common_checkbox('friendsync', _('Subscribe to my Twitter friends here.'),
+-                                              ($flink) ? ($flink->friendsync & FOREIGN_FRIEND_RECV) : false);
++        common_checkbox('friendsync', _('Subscribe to my Twitter friends here.'),
++                        ($flink) ? ($flink->friendsync & FOREIGN_FRIEND_RECV) : false);
+hunk ./actions/twittersettings.php 81
+-              if ($flink) {
+-                      common_submit('save', _('Save'));
+-              } else {
+-                      common_submit('add', _('Add'));
+-              }
++        if ($flink) {
++            common_submit('save', _('Save'));
++        } else {
++            common_submit('add', _('Add'));
++        }
+hunk ./actions/twittersettings.php 87
+-              $this->show_twitter_subscriptions();
++        $this->show_twitter_subscriptions();
+hunk ./actions/twittersettings.php 89
+-              common_element_end('form');
++        common_element_end('form');
+hunk ./actions/twittersettings.php 91
+-              common_show_footer();
+-      }
++        common_show_footer();
++    }
+hunk ./actions/twittersettings.php 94
+-      function subscribed_twitter_users() {
++    function subscribed_twitter_users() {
+hunk ./actions/twittersettings.php 96
+-              $current_user = common_current_user();
++        $current_user = common_current_user();
+hunk ./actions/twittersettings.php 98
+-              $qry = 'SELECT user.* ' .
+-                      'FROM subscription ' .
+-                      'JOIN user ON subscription.subscribed = user.id ' .
+-                      'JOIN foreign_link ON foreign_link.user_id = user.id ' .
+-                      'WHERE subscriber = %d ' .
+-                      'ORDER BY user.nickname';
++        $qry = 'SELECT user.* ' .
++            'FROM subscription ' .
++            'JOIN user ON subscription.subscribed = user.id ' .
++            'JOIN foreign_link ON foreign_link.user_id = user.id ' .
++            'WHERE subscriber = %d ' .
++            'ORDER BY user.nickname';
+hunk ./actions/twittersettings.php 105
+-              $user = new User();
++        $user = new User();
+hunk ./actions/twittersettings.php 107
+-              $user->query(sprintf($qry, $current_user->id));
++        $user->query(sprintf($qry, $current_user->id));
+hunk ./actions/twittersettings.php 109
+-              $users = array();
++        $users = array();
+hunk ./actions/twittersettings.php 111
+-              while ($user->fetch()) {
++        while ($user->fetch()) {
+hunk ./actions/twittersettings.php 113
+-                      // Don't include the user's own self-subscription
+-                      if ($user->id != $current_user->id) {
+-                              $users[] = clone($user);
+-                      }
+-              }
++            // Don't include the user's own self-subscription
++            if ($user->id != $current_user->id) {
++                $users[] = clone($user);
++            }
++        }
+hunk ./actions/twittersettings.php 119
+-              return $users;
+-      }
++        return $users;
++    }
+hunk ./actions/twittersettings.php 122
+-      function show_twitter_subscriptions() {
++    function show_twitter_subscriptions() {
+hunk ./actions/twittersettings.php 124
+-              $friends = $this->subscribed_twitter_users();
+-              $friends_count = count($friends);
++        $friends = $this->subscribed_twitter_users();
++        $friends_count = count($friends);
+hunk ./actions/twittersettings.php 127
+-              if ($friends_count > 0) {
++        if ($friends_count > 0) {
+hunk ./actions/twittersettings.php 129
+-                      common_element('h3', NULL, _('Twitter Friends'));
+-                      common_element_start('div', array('id' => 'subscriptions'));
+-                      common_element_start('ul', array('id' => 'subscriptions_avatars'));
++            common_element('h3', NULL, _('Twitter Friends'));
++            common_element_start('div', array('id' => 'subscriptions'));
++            common_element_start('ul', array('id' => 'subscriptions_avatars'));
+hunk ./actions/twittersettings.php 133
+-                      for ($i = 0; $i < min($friends_count, SUBSCRIPTIONS); $i++) {
++            for ($i = 0; $i < min($friends_count, SUBSCRIPTIONS); $i++) {
+hunk ./actions/twittersettings.php 135
+-                              $other = Profile::staticGet($friends[$i]->id);
++                $other = Profile::staticGet($friends[$i]->id);
+hunk ./actions/twittersettings.php 137
+-                              if (!$other) {
+-                                      common_log_db_error($subs, 'SELECT', __FILE__);
+-                                      continue;
+-                              }
++                if (!$other) {
++                    common_log_db_error($subs, 'SELECT', __FILE__);
++                    continue;
++                }
+hunk ./actions/twittersettings.php 142
+-                              common_element_start('li');
+-                              common_element_start('a', array('title' => ($other->fullname) ?
+-                                                                                              $other->fullname :
+-                                                                                              $other->nickname,
+-                                                                                              'href' => $other->profileurl,
+-                                                                                              'rel' => 'contact',
+-                                                                                              'class' => 'subscription'));
+-                              $avatar = $other->getAvatar(AVATAR_MINI_SIZE);
+-                              common_element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
+-                                                                                      'width' => AVATAR_MINI_SIZE,
+-                                                                                      'height' => AVATAR_MINI_SIZE,
+-                                                                                      'class' => 'avatar mini',
+-                                                                                      'alt' =>  ($other->fullname) ?
+-                                                                                      $other->fullname :
+-                                                                                      $other->nickname));
+-                              common_element_end('a');
+-                              common_element_end('li');
++                common_element_start('li');
++                common_element_start('a', array('title' => ($other->fullname) ?
++                                                $other->fullname :
++                                                $other->nickname,
++                                                'href' => $other->profileurl,
++                                                'rel' => 'contact',
++                                                'class' => 'subscription'));
++                $avatar = $other->getAvatar(AVATAR_MINI_SIZE);
++                common_element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
++                                            'width' => AVATAR_MINI_SIZE,
++                                            'height' => AVATAR_MINI_SIZE,
++                                            'class' => 'avatar mini',
++                                            'alt' =>  ($other->fullname) ?
++                                            $other->fullname :
++                                            $other->nickname));
++                common_element_end('a');
++                common_element_end('li');
+hunk ./actions/twittersettings.php 160
+-                      }
++            }
+hunk ./actions/twittersettings.php 162
+-                      common_element_end('ul');
+-                      common_element_end('div');
++            common_element_end('ul');
++            common_element_end('div');
+hunk ./actions/twittersettings.php 165
+-              }
++        }
+hunk ./actions/twittersettings.php 167
+-              // XXX Figure out a way to show all Twitter friends... ?
++        // XXX Figure out a way to show all Twitter friends... ?
+hunk ./actions/twittersettings.php 169
+-              /*
+-              if ($subs_count > SUBSCRIPTIONS) {
+-                      common_element_start('p', array('id' => 'subscriptions_viewall'));
++        /*
++        if ($subs_count > SUBSCRIPTIONS) {
++            common_element_start('p', array('id' => 'subscriptions_viewall'));
+hunk ./actions/twittersettings.php 173
+-                      common_element('a', array('href' => common_local_url('subscriptions',
+-                                                                                                                               array('nickname' => $profile->nickname)),
+-                                                                        'class' => 'moresubscriptions'),
+-                                                 _('All subscriptions'));
+-                      common_element_end('p');
+-              }
+-              */
++            common_element('a', array('href' => common_local_url('subscriptions',
++                                                                 array('nickname' => $profile->nickname)),
++                                      'class' => 'moresubscriptions'),
++                           _('All subscriptions'));
++            common_element_end('p');
++        }
++        */
+hunk ./actions/twittersettings.php 181
+-      }
++    }
+hunk ./actions/twittersettings.php 183
+-      function handle_post() {
++    function handle_post() {
+hunk ./actions/twittersettings.php 185
+-              # CSRF protection
+-              $token = $this->trimmed('token');
+-              if (!$token || $token != common_session_token()) {
+-                      $this->show_form(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        # CSRF protection
++        $token = $this->trimmed('token');
++        if (!$token || $token != common_session_token()) {
++            $this->show_form(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/twittersettings.php 192
+-              if ($this->arg('save')) {
+-                      $this->save_preferences();
+-              } else if ($this->arg('add')) {
+-                      $this->add_twitter_acct();
+-              } else if ($this->arg('remove')) {
+-                      $this->remove_twitter_acct();
+-              } else {
+-                      $this->show_form(_('Unexpected form submission.'));
+-              }
+-      }
++        if ($this->arg('save')) {
++            $this->save_preferences();
++        } else if ($this->arg('add')) {
++            $this->add_twitter_acct();
++        } else if ($this->arg('remove')) {
++            $this->remove_twitter_acct();
++        } else {
++            $this->show_form(_('Unexpected form submission.'));
++        }
++    }
+hunk ./actions/twittersettings.php 203
+-      function add_twitter_acct() {
++    function add_twitter_acct() {
+hunk ./actions/twittersettings.php 205
+-              $screen_name = $this->trimmed('twitter_username');
+-              $password = $this->trimmed('twitter_password');
+-              $noticesync = $this->boolean('noticesync');
+-              $replysync = $this->boolean('replysync');
+-              $friendsync = $this->boolean('friendsync');
++        $screen_name = $this->trimmed('twitter_username');
++        $password = $this->trimmed('twitter_password');
++        $noticesync = $this->boolean('noticesync');
++        $replysync = $this->boolean('replysync');
++        $friendsync = $this->boolean('friendsync');
+hunk ./actions/twittersettings.php 211
+-              if (!Validate::string($screen_name,
+-                              array(  'min_length' => 1,
+-                                              'max_length' => 15,
+-                                              'format' => VALIDATE_NUM . VALIDATE_ALPHA . '_'))) {
+-                      $this->show_form(
+-                              _('Username must have only numbers, upper- and lowercase letters, and underscore (_). 15 chars max.'));
+-                      return;
+-              }
++        if (!Validate::string($screen_name,
++                array(    'min_length' => 1,
++                        'max_length' => 15,
++                         'format' => VALIDATE_NUM . VALIDATE_ALPHA . '_'))) {
++            $this->show_form(
++                _('Username must have only numbers, upper- and lowercase letters, and underscore (_). 15 chars max.'));
++            return;
++        }
+hunk ./actions/twittersettings.php 220
+-              if (!$this->verify_credentials($screen_name, $password)) {
+-                      $this->show_form(_('Could not verify your Twitter credentials!'));
+-                      return;
+-              }
++        if (!$this->verify_credentials($screen_name, $password)) {
++            $this->show_form(_('Could not verify your Twitter credentials!'));
++            return;
++        }
+hunk ./actions/twittersettings.php 225
+-              $twit_user = twitter_user_info($screen_name, $password);
++        $twit_user = twitter_user_info($screen_name, $password);
+hunk ./actions/twittersettings.php 227
+-              if (!$twit_user) {
+-                      $this->show_form(sprintf(_('Unable to retrieve account information for "%s" from Twitter.'),
+-                              $screen_name));
+-                      return;
+-              }
++        if (!$twit_user) {
++            $this->show_form(sprintf(_('Unable to retrieve account information for "%s" from Twitter.'),
++                $screen_name));
++            return;
++        }
+hunk ./actions/twittersettings.php 233
+-              if (!save_twitter_user($twit_user->id, $screen_name)) {
+-                      $this->show_form(_('Unable to save your Twitter settings!'));
+-                      return;
+-              }
++        if (!save_twitter_user($twit_user->id, $screen_name)) {
++            $this->show_form(_('Unable to save your Twitter settings!'));
++            return;
++        }
+hunk ./actions/twittersettings.php 238
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/twittersettings.php 240
+-              $flink = DB_DataObject::factory('foreign_link');
+-              $flink->user_id = $user->id;
+-              $flink->foreign_id = $twit_user->id;
+-              $flink->service = 1; // Twitter
+-              $flink->credentials = $password;
+-              $flink->created = common_sql_now();
++        $flink = DB_DataObject::factory('foreign_link');
++        $flink->user_id = $user->id;
++        $flink->foreign_id = $twit_user->id;
++        $flink->service = 1; // Twitter
++        $flink->credentials = $password;
++        $flink->created = common_sql_now();
+hunk ./actions/twittersettings.php 247
+-              $this->set_flags($flink, $noticesync, $replysync, $friendsync);
++        $this->set_flags($flink, $noticesync, $replysync, $friendsync);
+hunk ./actions/twittersettings.php 249
+-              $flink_id = $flink->insert();
++        $flink_id = $flink->insert();
+hunk ./actions/twittersettings.php 251
+-              if (!$flink_id) {
+-                      common_log_db_error($flink, 'INSERT', __FILE__);
+-                      $this->show_form(_('Unable to save your Twitter settings!'));
+-                      return;
+-              }
++        if (!$flink_id) {
++            common_log_db_error($flink, 'INSERT', __FILE__);
++            $this->show_form(_('Unable to save your Twitter settings!'));
++            return;
++        }
+hunk ./actions/twittersettings.php 257
+-              if ($friendsync) {
+-                      save_twitter_friends($user, $twit_user->id, $screen_name, $password);
+-              }
++        if ($friendsync) {
++            save_twitter_friends($user, $twit_user->id, $screen_name, $password);
++        }
+hunk ./actions/twittersettings.php 261
+-              $this->show_form(_('Twitter settings saved.'), true);
+-      }
++        $this->show_form(_('Twitter settings saved.'), true);
++    }
+hunk ./actions/twittersettings.php 264
+-      function remove_twitter_acct() {
++    function remove_twitter_acct() {
+hunk ./actions/twittersettings.php 266
+-              $user = common_current_user();
+-              $flink = Foreign_link::getByUserID($user->id, 1);
+-              $flink_foreign_id = $this->arg('flink_foreign_id');
++        $user = common_current_user();
++        $flink = Foreign_link::getByUserID($user->id, 1);
++        $flink_foreign_id = $this->arg('flink_foreign_id');
+hunk ./actions/twittersettings.php 270
+-              # Maybe an old tab open...?
+-              if ($flink->foreign_id != $flink_foreign_id) {
+-                  $this->show_form(_('That is not your Twitter account.'));
+-                  return;
+-              }
++        # Maybe an old tab open...?
++        if ($flink->foreign_id != $flink_foreign_id) {
++            $this->show_form(_('That is not your Twitter account.'));
++            return;
++        }
+hunk ./actions/twittersettings.php 276
+-              $result = $flink->delete();
++        $result = $flink->delete();
+hunk ./actions/twittersettings.php 278
+-              if (!$result) {
+-                      common_log_db_error($flink, 'DELETE', __FILE__);
+-                      common_server_error(_('Couldn\'t remove Twitter user.'));
+-                      return;
+-              }
++        if (!$result) {
++            common_log_db_error($flink, 'DELETE', __FILE__);
++            common_server_error(_('Couldn\'t remove Twitter user.'));
++            return;
++        }
+hunk ./actions/twittersettings.php 284
+-              $this->show_form(_('Twitter account removed.'), TRUE);
+-      }
++        $this->show_form(_('Twitter account removed.'), TRUE);
++    }
+hunk ./actions/twittersettings.php 287
+-      function save_preferences() {
++    function save_preferences() {
+hunk ./actions/twittersettings.php 289
+-              $noticesync = $this->boolean('noticesync');
+-              $friendsync = $this->boolean('friendsync');
+-              $replysync = $this->boolean('replysync');
++        $noticesync = $this->boolean('noticesync');
++        $friendsync = $this->boolean('friendsync');
++        $replysync = $this->boolean('replysync');
+hunk ./actions/twittersettings.php 293
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/twittersettings.php 295
+-              $flink = Foreign_link::getByUserID($user->id, 1);
++        $flink = Foreign_link::getByUserID($user->id, 1);
+hunk ./actions/twittersettings.php 297
+-              if (!$flink) {
+-                      common_log_db_error($flink, 'SELECT', __FILE__);
+-                      $this->show_form(_('Couldn\'t save Twitter preferences.'));
+-                      return;
+-              }
++        if (!$flink) {
++            common_log_db_error($flink, 'SELECT', __FILE__);
++            $this->show_form(_('Couldn\'t save Twitter preferences.'));
++            return;
++        }
+hunk ./actions/twittersettings.php 303
+-              $twitter_id = $flink->foreign_id;
+-              $password = $flink->credentials;
++        $twitter_id = $flink->foreign_id;
++        $password = $flink->credentials;
+hunk ./actions/twittersettings.php 306
+-              $fuser = $flink->getForeignUser();
++        $fuser = $flink->getForeignUser();
+hunk ./actions/twittersettings.php 308
+-              if (!$fuser) {
+-                      common_log_db_error($fuser, 'SELECT', __FILE__);
+-                      $this->show_form(_('Couldn\'t save Twitter preferences.'));
+-                      return;
+-              }
++        if (!$fuser) {
++            common_log_db_error($fuser, 'SELECT', __FILE__);
++            $this->show_form(_('Couldn\'t save Twitter preferences.'));
++            return;
++        }
+hunk ./actions/twittersettings.php 314
+-              $screen_name = $fuser->nickname;
++        $screen_name = $fuser->nickname;
+hunk ./actions/twittersettings.php 316
+-              $original = clone($flink);
+-              $this->set_flags($flink, $noticesync, $replysync, $friendsync);
+-              $result = $flink->update($original);
++        $original = clone($flink);
++        $this->set_flags($flink, $noticesync, $replysync, $friendsync);
++        $result = $flink->update($original);
+hunk ./actions/twittersettings.php 320
+-              if ($result === FALSE) {
+-                      common_log_db_error($flink, 'UPDATE', __FILE__);
+-                      $this->show_form(_('Couldn\'t save Twitter preferences.'));
+-                      return;
+-              }
++        if ($result === FALSE) {
++            common_log_db_error($flink, 'UPDATE', __FILE__);
++            $this->show_form(_('Couldn\'t save Twitter preferences.'));
++            return;
++        }
+hunk ./actions/twittersettings.php 326
+-              if ($friendsync) {
+-                      save_twitter_friends($user, $flink->foreign_id, $screen_name, $password);
+-              }
++        if ($friendsync) {
++            save_twitter_friends($user, $flink->foreign_id, $screen_name, $password);
++        }
+hunk ./actions/twittersettings.php 330
+-              $this->show_form(_('Twitter preferences saved.'));
+-      }
++        $this->show_form(_('Twitter preferences saved.'));
++    }
+hunk ./actions/twittersettings.php 333
+-      function verify_credentials($screen_name, $password) {
+-              $uri = 'http://twitter.com/account/verify_credentials.json';
+-              $data = get_twitter_data($uri, $screen_name, $password);
++    function verify_credentials($screen_name, $password) {
++        $uri = 'http://twitter.com/account/verify_credentials.json';
++        $data = get_twitter_data($uri, $screen_name, $password);
+hunk ./actions/twittersettings.php 337
+-              if (!$data) {
+-                      return false;
+-              }
++        if (!$data) {
++            return false;
++        }
+hunk ./actions/twittersettings.php 341
+-              $user = json_decode($data);
++        $user = json_decode($data);
+hunk ./actions/twittersettings.php 343
+-              if (!$user) {
+-                      return false;
+-              }
++        if (!$user) {
++            return false;
++        }
+hunk ./actions/twittersettings.php 347
+-              $twitter_id = $user->status->id;
++         $twitter_id = $user->status->id;
+hunk ./actions/twittersettings.php 349
+-              if ($twitter_id) {
+-                      return $twitter_id;
+-              }
++        if ($twitter_id) {
++            return $twitter_id;
++        }
+hunk ./actions/twittersettings.php 353
+-              return false;
+-      }
++        return false;
++    }
+hunk ./actions/twittersettings.php 356
+-      function set_flags(&$flink, $noticesync, $replysync, $friendsync) {
+-              if ($noticesync) {
+-                      $flink->noticesync |= FOREIGN_NOTICE_SEND;
+-              } else {
+-                      $flink->noticesync &= ~FOREIGN_NOTICE_SEND;
+-              }
++    function set_flags(&$flink, $noticesync, $replysync, $friendsync) {
++        if ($noticesync) {
++            $flink->noticesync |= FOREIGN_NOTICE_SEND;
++        } else {
++            $flink->noticesync &= ~FOREIGN_NOTICE_SEND;
++        }
+hunk ./actions/twittersettings.php 363
+-              if ($replysync) {
+-                      $flink->noticesync |= FOREIGN_NOTICE_SEND_REPLY;
+-              } else {
+-                      $flink->noticesync &= ~FOREIGN_NOTICE_SEND_REPLY;
+-              }
++        if ($replysync) {
++            $flink->noticesync |= FOREIGN_NOTICE_SEND_REPLY;
++        } else {
++            $flink->noticesync &= ~FOREIGN_NOTICE_SEND_REPLY;
++        }
+hunk ./actions/twittersettings.php 369
+-              if ($friendsync) {
+-                      $flink->friendsync |= FOREIGN_FRIEND_RECV;
+-              } else {
+-                      $flink->friendsync &= ~FOREIGN_FRIEND_RECV;
+-              }
++        if ($friendsync) {
++            $flink->friendsync |= FOREIGN_FRIEND_RECV;
++        } else {
++            $flink->friendsync &= ~FOREIGN_FRIEND_RECV;
++        }
+hunk ./actions/twittersettings.php 375
+-              $flink->profilesync = 0;
+-      }
++        $flink->profilesync = 0;
++    }
+hunk ./actions/unblock.php 35
+-              $token = $this->trimmed('token');
++        $token = $this->trimmed('token');
+hunk ./actions/unblock.php 37
+-              if (!$token || $token != common_session_token()) {
+-                      $this->client_error(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        if (!$token || $token != common_session_token()) {
++            $this->client_error(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/unsubscribe.php 22
+-      function handle($args) {
+-              parent::handle($args);
+-              if (!common_logged_in()) {
+-                      common_user_error(_('Not logged in.'));
+-                      return;
+-              }
++    function handle($args) {
++        parent::handle($args);
++        if (!common_logged_in()) {
++            common_user_error(_('Not logged in.'));
++            return;
++        }
+hunk ./actions/unsubscribe.php 29
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./actions/unsubscribe.php 31
+-              if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+-                      common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname)));
+-                      return;
+-              }
++        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
++            common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname)));
++            return;
++        }
+hunk ./actions/unsubscribe.php 36
+-              # CSRF protection
++        # CSRF protection
+hunk ./actions/unsubscribe.php 38
+-              $token = $this->trimmed('token');
++        $token = $this->trimmed('token');
+hunk ./actions/unsubscribe.php 40
+-              if (!$token || $token != common_session_token()) {
+-                      $this->client_error(_('There was a problem with your session token. Try again, please.'));
+-                      return;
+-              }
++        if (!$token || $token != common_session_token()) {
++            $this->client_error(_('There was a problem with your session token. Try again, please.'));
++            return;
++        }
+hunk ./actions/unsubscribe.php 45
+-              $other_id = $this->arg('unsubscribeto');
++        $other_id = $this->arg('unsubscribeto');
+hunk ./actions/unsubscribe.php 59
+-              $result = subs_unsubscribe_to($user, $other);
++        $result = subs_unsubscribe_to($user, $other);
+hunk ./actions/unsubscribe.php 61
+-              if ($result != true) {
+-                      common_user_error($result);
+-                      return;
+-              }
++        if ($result != true) {
++            common_user_error($result);
++            return;
++        }
+hunk ./actions/unsubscribe.php 66
+-              if ($this->boolean('ajax')) {
+-                      common_start_html('text/xml;charset=utf-8', true);
+-                      common_element_start('head');
+-                      common_element('title', null, _('Unsubscribed'));
+-                      common_element_end('head');
+-                      common_element_start('body');
+-                      common_subscribe_form($other);
+-                      common_element_end('body');
+-                      common_element_end('html');
+-              } else {
+-              common_redirect(common_local_url('subscriptions', array('nickname' =>
+-                                                                                                                              $user->nickname)));
++        if ($this->boolean('ajax')) {
++            common_start_html('text/xml;charset=utf-8', true);
++            common_element_start('head');
++            common_element('title', null, _('Unsubscribed'));
++            common_element_end('head');
++            common_element_start('body');
++            common_subscribe_form($other);
++            common_element_end('body');
++            common_element_end('html');
++        } else {
++            common_redirect(common_local_url('subscriptions', array('nickname' =>
++                                                                    $user->nickname)));
+hunk ./actions/unsubscribe.php 79
+-      }
++    }
+hunk ./actions/updateprofile.php 25
+-      
+-      function handle($args) {
+-              parent::handle($args);
+-              try {
+-                      common_remove_magic_from_request();
+-                      $req = OAuthRequest::from_request();
+-                      # Note: server-to-server function!
+-                      $server = omb_oauth_server();
+-                      list($consumer, $token) = $server->verify_request($req);
+-                      if ($this->update_profile($req, $consumer, $token)) {
+-                              print "omb_version=".OMB_VERSION_01;
+-                      }
+-              } catch (OAuthException $e) {
+-                      $this->server_error($e->getMessage());
+-                      return;
+-              }
+-      }
++    
++    function handle($args) {
++        parent::handle($args);
++        try {
++            common_remove_magic_from_request();
++            $req = OAuthRequest::from_request();
++            # Note: server-to-server function!
++            $server = omb_oauth_server();
++            list($consumer, $token) = $server->verify_request($req);
++            if ($this->update_profile($req, $consumer, $token)) {
++                print "omb_version=".OMB_VERSION_01;
++            }
++        } catch (OAuthException $e) {
++            $this->server_error($e->getMessage());
++            return;
++        }
++    }
+hunk ./actions/updateprofile.php 43
+-      function update_profile($req, $consumer, $token) {
+-              $version = $req->get_parameter('omb_version');
+-              if ($version != OMB_VERSION_01) {
+-                      $this->client_error(_('Unsupported OMB version'), 400);
+-                      return false;
+-              }
+-              # First, check to see if listenee exists
+-              $listenee =  $req->get_parameter('omb_listenee');
+-              $remote = Remote_profile::staticGet('uri', $listenee);
+-              if (!$remote) {
+-                      $this->client_error(_('Profile unknown'), 404);
+-                      return false;
+-              }
+-              # Second, check to see if they should be able to post updates!
+-              # We see if there are any subscriptions to that remote user with
+-              # the given token.
++    function update_profile($req, $consumer, $token) {
++        $version = $req->get_parameter('omb_version');
++        if ($version != OMB_VERSION_01) {
++            $this->client_error(_('Unsupported OMB version'), 400);
++            return false;
++        }
++        # First, check to see if listenee exists
++        $listenee =  $req->get_parameter('omb_listenee');
++        $remote = Remote_profile::staticGet('uri', $listenee);
++        if (!$remote) {
++            $this->client_error(_('Profile unknown'), 404);
++            return false;
++        }
++        # Second, check to see if they should be able to post updates!
++        # We see if there are any subscriptions to that remote user with
++        # the given token.
+hunk ./actions/updateprofile.php 60
+-              $sub = new Subscription();
+-              $sub->subscribed = $remote->id;
+-              $sub->token = $token->key;
+-              if (!$sub->find(true)) {
+-                      $this->client_error(_('You did not send us that profile'), 403);
+-                      return false;
+-              }
++        $sub = new Subscription();
++        $sub->subscribed = $remote->id;
++        $sub->token = $token->key;
++        if (!$sub->find(true)) {
++            $this->client_error(_('You did not send us that profile'), 403);
++            return false;
++        }
+hunk ./actions/updateprofile.php 68
+-              $profile = Profile::staticGet('id', $remote->id);
+-              if (!$profile) {
+-                      # This one is our fault
+-                      $this->server_error(_('Remote profile with no matching profile'), 500);
+-                      return false;
+-              }
+-              $nickname = $req->get_parameter('omb_listenee_nickname');
+-              if ($nickname && !Validate::string($nickname, array('min_length' => 1,
+-                                                                                                                      'max_length' => 64,
+-                                                                                                                      'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+-                      $this->client_error(_('Nickname must have only lowercase letters and numbers and no spaces.'));
+-                      return false;
+-              }
+-              $license = $req->get_parameter('omb_listenee_license');
+-              if ($license && !common_valid_http_url($license)) {
+-                      $this->client_error(sprintf(_("Invalid license URL '%s'"), $license));
+-                      return false;
+-              }
+-              $profile_url = $req->get_parameter('omb_listenee_profile');
+-              if ($profile_url && !common_valid_http_url($profile_url)) {
+-                      $this->client_error(sprintf(_("Invalid profile URL '%s'."), $profile_url));
+-                      return false;
+-              }
+-              # optional stuff
+-              $fullname = $req->get_parameter('omb_listenee_fullname');
+-              if ($fullname && strlen($fullname) > 255) {
+-                      $this->client_error(_("Full name is too long (max 255 chars)."));
+-                      return false;
+-              }
+-              $homepage = $req->get_parameter('omb_listenee_homepage');
+-              if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) {
+-                      $this->client_error(sprintf(_("Invalid homepage '%s'"), $homepage));
+-                      return false;
+-              }
+-              $bio = $req->get_parameter('omb_listenee_bio');
+-              if ($bio && strlen($bio) > 140) {
+-                      $this->client_error(_("Bio is too long (max 140 chars)."));
+-                      return false;
+-              }
+-              $location = $req->get_parameter('omb_listenee_location');
+-              if ($location && strlen($location) > 255) {
+-                      $this->client_error(_("Location is too long (max 255 chars)."));
+-                      return false;
+-              }
+-              $avatar = $req->get_parameter('omb_listenee_avatar');
+-              if ($avatar) {
+-                      if (!common_valid_http_url($avatar) || strlen($avatar) > 255) {
+-                              $this->client_error(sprintf(_("Invalid avatar URL '%s'"), $avatar));
+-                              return false;
+-                      }
+-                      $size = @getimagesize($avatar);
+-                      if (!$size) {
+-                              $this->client_error(sprintf(_("Can't read avatar URL '%s'"), $avatar));
+-                              return false;
+-                      }
+-                      if ($size[0] != AVATAR_PROFILE_SIZE || $size[1] != AVATAR_PROFILE_SIZE) {
+-                              $this->client_error(sprintf(_("Wrong size image at '%s'"), $avatar));
+-                              return false;
+-                      }
+-                      if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG,
+-                                                                                IMAGETYPE_PNG))) {
+-                              $this->client_error(sprintf(_("Wrong image type for '%s'"), $avatar));
+-                              return false;
+-                      }
+-              }
++        $profile = Profile::staticGet('id', $remote->id);
++        if (!$profile) {
++            # This one is our fault
++            $this->server_error(_('Remote profile with no matching profile'), 500);
++            return false;
++        }
++        $nickname = $req->get_parameter('omb_listenee_nickname');
++        if ($nickname && !Validate::string($nickname, array('min_length' => 1,
++                                                            'max_length' => 64,
++                                                            'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
++            $this->client_error(_('Nickname must have only lowercase letters and numbers and no spaces.'));
++            return false;
++        }
++        $license = $req->get_parameter('omb_listenee_license');
++        if ($license && !common_valid_http_url($license)) {
++            $this->client_error(sprintf(_("Invalid license URL '%s'"), $license));
++            return false;
++        }
++        $profile_url = $req->get_parameter('omb_listenee_profile');
++        if ($profile_url && !common_valid_http_url($profile_url)) {
++            $this->client_error(sprintf(_("Invalid profile URL '%s'."), $profile_url));
++            return false;
++        }
++        # optional stuff
++        $fullname = $req->get_parameter('omb_listenee_fullname');
++        if ($fullname && strlen($fullname) > 255) {
++            $this->client_error(_("Full name is too long (max 255 chars)."));
++            return false;
++        }
++        $homepage = $req->get_parameter('omb_listenee_homepage');
++        if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) {
++            $this->client_error(sprintf(_("Invalid homepage '%s'"), $homepage));
++            return false;
++        }
++        $bio = $req->get_parameter('omb_listenee_bio');
++        if ($bio && strlen($bio) > 140) {
++            $this->client_error(_("Bio is too long (max 140 chars)."));
++            return false;
++        }
++        $location = $req->get_parameter('omb_listenee_location');
++        if ($location && strlen($location) > 255) {
++            $this->client_error(_("Location is too long (max 255 chars)."));
++            return false;
++        }
++        $avatar = $req->get_parameter('omb_listenee_avatar');
++        if ($avatar) {
++            if (!common_valid_http_url($avatar) || strlen($avatar) > 255) {
++                $this->client_error(sprintf(_("Invalid avatar URL '%s'"), $avatar));
++                return false;
++            }
++            $size = @getimagesize($avatar);
++            if (!$size) {
++                $this->client_error(sprintf(_("Can't read avatar URL '%s'"), $avatar));
++                return false;
++            }
++            if ($size[0] != AVATAR_PROFILE_SIZE || $size[1] != AVATAR_PROFILE_SIZE) {
++                $this->client_error(sprintf(_("Wrong size image at '%s'"), $avatar));
++                return false;
++            }
++            if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG,
++                                          IMAGETYPE_PNG))) {
++                $this->client_error(sprintf(_("Wrong image type for '%s'"), $avatar));
++                return false;
++            }
++        }
+hunk ./actions/updateprofile.php 134
+-              $orig_profile = clone($profile);
++        $orig_profile = clone($profile);
+hunk ./actions/updateprofile.php 136
+-              if ($nickname) {
+-                      $profile->nickname = $nickname;
+-              }
+-              if ($profile_url) {
+-                      $profile->profileurl = $profile_url;
+-              }
+-              if ($fullname) {
+-                      $profile->fullname = $fullname;
+-              }
+-              if ($homepage) {
+-                      $profile->homepage = $homepage;
+-              }
+-              if ($bio) {
+-                      $profile->bio = $bio;
+-              }
+-              if ($location) {
+-                      $profile->location = $location;
+-              }
++        if ($nickname) {
++            $profile->nickname = $nickname;
++        }
++        if ($profile_url) {
++            $profile->profileurl = $profile_url;
++        }
++        if ($fullname) {
++            $profile->fullname = $fullname;
++        }
++        if ($homepage) {
++            $profile->homepage = $homepage;
++        }
++        if ($bio) {
++            $profile->bio = $bio;
++        }
++        if ($location) {
++            $profile->location = $location;
++        }
+hunk ./actions/updateprofile.php 155
+-              if (!$profile->update($orig_profile)) {
+-                      $this->server_error(_('Could not save new profile info'), 500);
+-                      return false;
+-              } else {
+-                      if ($avatar) {
+-                              $temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar');
+-                              copy($avatar, $temp_filename);
+-                              if (!$profile->setOriginal($temp_filename)) {
+-                                      $this->server_error(_('Could not save avatar info'), 500);
+-                                      return false;
+-                              }
+-                      }
+-                      header('HTTP/1.1 200 OK');
+-                      header('Content-type: text/plain');
+-                      print 'Updated profile';
+-                      print "\n";
+-                      return true;
+-              }
+-      }
++        if (!$profile->update($orig_profile)) {
++            $this->server_error(_('Could not save new profile info'), 500);
++            return false;
++        } else {
++            if ($avatar) {
++                $temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar');
++                copy($avatar, $temp_filename);
++                if (!$profile->setOriginal($temp_filename)) {
++                    $this->server_error(_('Could not save avatar info'), 500);
++                    return false;
++                }
++            }
++            header('HTTP/1.1 200 OK');
++            header('Content-type: text/plain');
++            print 'Updated profile';
++            print "\n";
++            return true;
++        }
++    }
+hunk ./actions/userauthorization.php 27
+-      function handle($args) {
+-              parent::handle($args);
++    function handle($args) {
++        parent::handle($args);
+hunk ./actions/userauthorization.php 30
+-              if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+-                      # CSRF protection
+-                      $token = $this->trimmed('token');
+-                      if (!$token || $token != common_session_token()) {
+-                              $req = $this->get_stored_request();
+-                              $this->show_form(_('There was a problem with your session token. Try again, please.'), $req);
+-                              return;
+-                      }
+-                      # We've shown the form, now post user's choice
+-                      $this->send_authorization();
+-              } else {
+-                      if (!common_logged_in()) {
+-                              # Go log in, and then come back
+-                              common_debug('saving URL for returnto', __FILE__);
+-                              common_set_returnto($_SERVER['REQUEST_URI']);
++        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
++            # CSRF protection
++            $token = $this->trimmed('token');
++            if (!$token || $token != common_session_token()) {
++                $req = $this->get_stored_request();
++                $this->show_form(_('There was a problem with your session token. Try again, please.'), $req);
++                return;
++            }
++            # We've shown the form, now post user's choice
++            $this->send_authorization();
++        } else {
++            if (!common_logged_in()) {
++                # Go log in, and then come back
++                common_debug('saving URL for returnto', __FILE__);
++                common_set_returnto($_SERVER['REQUEST_URI']);
+hunk ./actions/userauthorization.php 46
+-                              common_debug('redirecting to login', __FILE__);
+-                              common_redirect(common_local_url('login'));
+-                              return;
+-                      }
+-                      try {
+-                              # this must be a new request
+-                              common_debug('getting new request', __FILE__);
+-                              $req = $this->get_new_request();
+-                              if (!$req) {
+-                                      $this->client_error(_('No request found!'));
+-                              }
+-                              common_debug('validating request', __FILE__);
+-                              # XXX: only validate new requests, since nonce is one-time use
+-                              $this->validate_request($req);
+-                              common_debug('showing form', __FILE__);
+-                              $this->store_request($req);
+-                              $this->show_form($req);
+-                      } catch (OAuthException $e) {
+-                              $this->clear_request();
+-                              $this->client_error($e->getMessage());
+-                              return;
+-                      }
++                common_debug('redirecting to login', __FILE__);
++                common_redirect(common_local_url('login'));
++                return;
++            }
++            try {
++                # this must be a new request
++                common_debug('getting new request', __FILE__);
++                $req = $this->get_new_request();
++                if (!$req) {
++                    $this->client_error(_('No request found!'));
++                }
++                common_debug('validating request', __FILE__);
++                # XXX: only validate new requests, since nonce is one-time use
++                $this->validate_request($req);
++                common_debug('showing form', __FILE__);
++                $this->store_request($req);
++                $this->show_form($req);
++            } catch (OAuthException $e) {
++                $this->clear_request();
++                $this->client_error($e->getMessage());
++                return;
++            }
+hunk ./actions/userauthorization.php 69
+-              }
+-      }
++        }
++    }
+hunk ./actions/userauthorization.php 72
+-      function show_form($req) {
++    function show_form($req) {
+hunk ./actions/userauthorization.php 74
+-              $nickname = $req->get_parameter('omb_listenee_nickname');
+-              $profile = $req->get_parameter('omb_listenee_profile');
+-              $license = $req->get_parameter('omb_listenee_license');
+-              $fullname = $req->get_parameter('omb_listenee_fullname');
+-              $homepage = $req->get_parameter('omb_listenee_homepage');
+-              $bio = $req->get_parameter('omb_listenee_bio');
+-              $location = $req->get_parameter('omb_listenee_location');
+-              $avatar = $req->get_parameter('omb_listenee_avatar');
++        $nickname = $req->get_parameter('omb_listenee_nickname');
++        $profile = $req->get_parameter('omb_listenee_profile');
++        $license = $req->get_parameter('omb_listenee_license');
++        $fullname = $req->get_parameter('omb_listenee_fullname');
++        $homepage = $req->get_parameter('omb_listenee_homepage');
++        $bio = $req->get_parameter('omb_listenee_bio');
++        $location = $req->get_parameter('omb_listenee_location');
++        $avatar = $req->get_parameter('omb_listenee_avatar');
+hunk ./actions/userauthorization.php 83
+-              common_show_header(_('Authorize subscription'));
+-              common_element('p', NULL, _('Please check these details to make sure '.
+-                                                                       'that you want to subscribe to this user\'s notices. '.
+-                                                                       'If you didn\'t just ask to subscribe to someone\'s notices, '.
+-                                                                       'click "Cancel".'));
+-              common_element_start('div', 'profile');
+-              if ($avatar) {
+-                      common_element('img', array('src' => $avatar,
+-                                                                              'class' => 'avatar profile',
+-                                                                              'width' => AVATAR_PROFILE_SIZE,
+-                                                                              'height' => AVATAR_PROFILE_SIZE,
+-                                                                              'alt' => $nickname));
+-              }
+-              common_element('a', array('href' => $profile,
+-                                                                'class' => 'external profile nickname'),
+-                                         $nickname);
+-              if ($fullname) {
+-                      common_element_start('div', 'fullname');
+-                      if ($homepage) {
+-                              common_element('a', array('href' => $homepage),
+-                                                         $fullname);
+-                      } else {
+-                              common_text($fullname);
+-                      }
+-                      common_element_end('div');
+-              }
+-              if ($location) {
+-                      common_element('div', 'location', $location);
+-              }
+-              if ($bio) {
+-                      common_element('div', 'bio', $bio);
+-              }
+-              common_element_start('div', 'license');
+-              common_element('a', array('href' => $license,
+-                                                                'class' => 'license'),
+-                                         $license);
+-              common_element_end('div');
+-              common_element_end('div');
+-              common_element_start('form', array('method' => 'post',
+-                                                                                 'id' => 'userauthorization',
+-                                                                                 'name' => 'userauthorization',
+-                                                                                 'action' => common_local_url('userauthorization')));
+-              common_hidden('token', common_session_token());
+-              common_submit('accept', _('Accept'));
+-              common_submit('reject', _('Reject'));
+-              common_element_end('form');
+-              common_show_footer();
+-      }
++        common_show_header(_('Authorize subscription'));
++        common_element('p', NULL, _('Please check these details to make sure '.
++                                     'that you want to subscribe to this user\'s notices. '.
++                                     'If you didn\'t just ask to subscribe to someone\'s notices, '.
++                                     'click "Cancel".'));
++        common_element_start('div', 'profile');
++        if ($avatar) {
++            common_element('img', array('src' => $avatar,
++                                        'class' => 'avatar profile',
++                                        'width' => AVATAR_PROFILE_SIZE,
++                                        'height' => AVATAR_PROFILE_SIZE,
++                                        'alt' => $nickname));
++        }
++        common_element('a', array('href' => $profile,
++                                  'class' => 'external profile nickname'),
++                       $nickname);
++        if ($fullname) {
++            common_element_start('div', 'fullname');
++            if ($homepage) {
++                common_element('a', array('href' => $homepage),
++                               $fullname);
++            } else {
++                common_text($fullname);
++            }
++            common_element_end('div');
++        }
++        if ($location) {
++            common_element('div', 'location', $location);
++        }
++        if ($bio) {
++            common_element('div', 'bio', $bio);
++        }
++        common_element_start('div', 'license');
++        common_element('a', array('href' => $license,
++                                  'class' => 'license'),
++                       $license);
++        common_element_end('div');
++        common_element_end('div');
++        common_element_start('form', array('method' => 'post',
++                                           'id' => 'userauthorization',
++                                           'name' => 'userauthorization',
++                                           'action' => common_local_url('userauthorization')));
++        common_hidden('token', common_session_token());
++        common_submit('accept', _('Accept'));
++        common_submit('reject', _('Reject'));
++        common_element_end('form');
++        common_show_footer();
++    }
+hunk ./actions/userauthorization.php 132
+-      function send_authorization() {
+-              $req = $this->get_stored_request();
++    function send_authorization() {
++        $req = $this->get_stored_request();
+hunk ./actions/userauthorization.php 135
+-              if (!$req) {
+-                      common_user_error(_('No authorization request!'));
+-                      return;
+-              }
++        if (!$req) {
++            common_user_error(_('No authorization request!'));
++            return;
++        }
+hunk ./actions/userauthorization.php 140
+-              $callback = $req->get_parameter('oauth_callback');
++        $callback = $req->get_parameter('oauth_callback');
+hunk ./actions/userauthorization.php 142
+-              if ($this->arg('accept')) {
+-                      if (!$this->authorize_token($req)) {
+-                              $this->client_error(_('Error authorizing token'));
+-                      }
+-                      if (!$this->save_remote_profile($req)) {
+-                              $this->client_error(_('Error saving remote profile'));
+-                      }
+-                      if (!$callback) {
+-                              $this->show_accept_message($req->get_parameter('oauth_token'));
+-                      } else {
+-                              $params = array();
+-                              $params['oauth_token'] = $req->get_parameter('oauth_token');
+-                              $params['omb_version'] = OMB_VERSION_01;
+-                              $user = User::staticGet('uri', $req->get_parameter('omb_listener'));
+-                              $profile = $user->getProfile();
+-                              if (!$profile) {
+-                                      common_log_db_error($user, 'SELECT', __FILE__);
+-                                      $this->server_error(_('User without matching profile'));
+-                                      return;
+-                              }
+-                              $params['omb_listener_nickname'] = $user->nickname;
+-                              $params['omb_listener_profile'] = common_local_url('showstream',
+-                                                                                                                                 array('nickname' => $user->nickname));
+-                              if ($profile->fullname) {
+-                                      $params['omb_listener_fullname'] = $profile->fullname;
+-                              }
+-                              if ($profile->homepage) {
+-                                      $params['omb_listener_homepage'] = $profile->homepage;
+-                              }
+-                              if ($profile->bio) {
+-                                      $params['omb_listener_bio'] = $profile->bio;
+-                              }
+-                              if ($profile->location) {
+-                                      $params['omb_listener_location'] = $profile->location;
+-                              }
+-                              $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+-                              if ($avatar) {
+-                                      $params['omb_listener_avatar'] = $avatar->url;
+-                              }
+-                              $parts = array();
+-                              foreach ($params as $k => $v) {
+-                                      $parts[] = $k . '=' . OAuthUtil::urlencodeRFC3986($v);
+-                              }
+-                              $query_string = implode('&', $parts);
+-                              $parsed = parse_url($callback);
+-                              $url = $callback . (($parsed['query']) ? '&' : '?') . $query_string;
+-                              common_redirect($url, 303);
+-                      }
+-              } else {
+-                      if (!$callback) {
+-                              $this->show_reject_message();
+-                      } else {
+-                              # XXX: not 100% sure how to signal failure... just redirect without token?
+-                              common_redirect($callback, 303);
+-                      }
+-              }
+-      }
++        if ($this->arg('accept')) {
++            if (!$this->authorize_token($req)) {
++                $this->client_error(_('Error authorizing token'));
++            }
++            if (!$this->save_remote_profile($req)) {
++                $this->client_error(_('Error saving remote profile'));
++            }
++            if (!$callback) {
++                $this->show_accept_message($req->get_parameter('oauth_token'));
++            } else {
++                $params = array();
++                $params['oauth_token'] = $req->get_parameter('oauth_token');
++                $params['omb_version'] = OMB_VERSION_01;
++                $user = User::staticGet('uri', $req->get_parameter('omb_listener'));
++                $profile = $user->getProfile();
++                if (!$profile) {
++                    common_log_db_error($user, 'SELECT', __FILE__);
++                    $this->server_error(_('User without matching profile'));
++                    return;
++                }
++                $params['omb_listener_nickname'] = $user->nickname;
++                $params['omb_listener_profile'] = common_local_url('showstream',
++                                                                   array('nickname' => $user->nickname));
++                if ($profile->fullname) {
++                    $params['omb_listener_fullname'] = $profile->fullname;
++                }
++                if ($profile->homepage) {
++                    $params['omb_listener_homepage'] = $profile->homepage;
++                }
++                if ($profile->bio) {
++                    $params['omb_listener_bio'] = $profile->bio;
++                }
++                if ($profile->location) {
++                    $params['omb_listener_location'] = $profile->location;
++                }
++                $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
++                if ($avatar) {
++                    $params['omb_listener_avatar'] = $avatar->url;
++                }
++                $parts = array();
++                foreach ($params as $k => $v) {
++                    $parts[] = $k . '=' . OAuthUtil::urlencodeRFC3986($v);
++                }
++                $query_string = implode('&', $parts);
++                $parsed = parse_url($callback);
++                $url = $callback . (($parsed['query']) ? '&' : '?') . $query_string;
++                common_redirect($url, 303);
++            }
++        } else {
++            if (!$callback) {
++                $this->show_reject_message();
++            } else {
++                # XXX: not 100% sure how to signal failure... just redirect without token?
++                common_redirect($callback, 303);
++            }
++        }
++    }
+hunk ./actions/userauthorization.php 200
+-      function authorize_token(&$req) {
+-              $consumer_key = $req->get_parameter('oauth_consumer_key');
+-              $token_field = $req->get_parameter('oauth_token');
+-              common_debug('consumer key = "'.$consumer_key.'"', __FILE__);
+-              common_debug('token field = "'.$token_field.'"', __FILE__);
+-              $rt = new Token();
+-              $rt->consumer_key = $consumer_key;
+-              $rt->tok = $token_field;
+-              $rt->type = 0;
+-              $rt->state = 0;
+-              common_debug('request token to look up: "'.print_r($rt,TRUE).'"');
+-              if ($rt->find(true)) {
+-                      common_debug('found request token to authorize', __FILE__);
+-                      $orig_rt = clone($rt);
+-                      $rt->state = 1; # Authorized but not used
+-                      if ($rt->update($orig_rt)) {
+-                              common_debug('updated request token so it is authorized', __FILE__);
+-                              return true;
+-                      }
+-              }
+-              return FALSE;
+-      }
++    function authorize_token(&$req) {
++        $consumer_key = $req->get_parameter('oauth_consumer_key');
++        $token_field = $req->get_parameter('oauth_token');
++        common_debug('consumer key = "'.$consumer_key.'"', __FILE__);
++        common_debug('token field = "'.$token_field.'"', __FILE__);
++        $rt = new Token();
++        $rt->consumer_key = $consumer_key;
++        $rt->tok = $token_field;
++        $rt->type = 0;
++        $rt->state = 0;
++        common_debug('request token to look up: "'.print_r($rt,TRUE).'"');
++        if ($rt->find(true)) {
++            common_debug('found request token to authorize', __FILE__);
++            $orig_rt = clone($rt);
++            $rt->state = 1; # Authorized but not used
++            if ($rt->update($orig_rt)) {
++                common_debug('updated request token so it is authorized', __FILE__);
++                return true;
++            }
++        }
++        return FALSE;
++    }
+hunk ./actions/userauthorization.php 223
+-      # XXX: refactor with similar code in finishremotesubscribe.php
++    # XXX: refactor with similar code in finishremotesubscribe.php
+hunk ./actions/userauthorization.php 225
+-      function save_remote_profile(&$req) {
+-              # FIXME: we should really do this when the consumer comes
+-              # back for an access token. If they never do, we've got stuff in a
+-              # weird state.
++    function save_remote_profile(&$req) {
++        # FIXME: we should really do this when the consumer comes
++        # back for an access token. If they never do, we've got stuff in a
++        # weird state.
+hunk ./actions/userauthorization.php 230
+-              $nickname = $req->get_parameter('omb_listenee_nickname');
+-              $fullname = $req->get_parameter('omb_listenee_fullname');
+-              $profile_url = $req->get_parameter('omb_listenee_profile');
+-              $homepage = $req->get_parameter('omb_listenee_homepage');
+-              $bio = $req->get_parameter('omb_listenee_bio');
+-              $location = $req->get_parameter('omb_listenee_location');
+-              $avatar_url = $req->get_parameter('omb_listenee_avatar');
++        $nickname = $req->get_parameter('omb_listenee_nickname');
++        $fullname = $req->get_parameter('omb_listenee_fullname');
++        $profile_url = $req->get_parameter('omb_listenee_profile');
++        $homepage = $req->get_parameter('omb_listenee_homepage');
++        $bio = $req->get_parameter('omb_listenee_bio');
++        $location = $req->get_parameter('omb_listenee_location');
++        $avatar_url = $req->get_parameter('omb_listenee_avatar');
+hunk ./actions/userauthorization.php 238
+-              $listenee = $req->get_parameter('omb_listenee');
+-              $remote = Remote_profile::staticGet('uri', $listenee);
++        $listenee = $req->get_parameter('omb_listenee');
++        $remote = Remote_profile::staticGet('uri', $listenee);
+hunk ./actions/userauthorization.php 241
+-              if ($remote) {
+-                      $exists = true;
+-                      $profile = Profile::staticGet($remote->id);
+-                      $orig_remote = clone($remote);
+-                      $orig_profile = clone($profile);
+-              } else {
+-                      $exists = false;
+-                      $remote = new Remote_profile();
+-                      $remote->uri = $listenee;
+-                      $profile = new Profile();
+-              }
++        if ($remote) {
++            $exists = true;
++            $profile = Profile::staticGet($remote->id);
++            $orig_remote = clone($remote);
++            $orig_profile = clone($profile);
++        } else {
++            $exists = false;
++            $remote = new Remote_profile();
++            $remote->uri = $listenee;
++            $profile = new Profile();
++        }
+hunk ./actions/userauthorization.php 253
+-              $profile->nickname = $nickname;
+-              $profile->profileurl = $profile_url;
++        $profile->nickname = $nickname;
++        $profile->profileurl = $profile_url;
+hunk ./actions/userauthorization.php 256
+-              if ($fullname) {
+-                      $profile->fullname = $fullname;
+-              }
+-              if ($homepage) {
+-                      $profile->homepage = $homepage;
+-              }
+-              if ($bio) {
+-                      $profile->bio = $bio;
+-              }
+-              if ($location) {
+-                      $profile->location = $location;
+-              }
++        if ($fullname) {
++            $profile->fullname = $fullname;
++        }
++        if ($homepage) {
++            $profile->homepage = $homepage;
++        }
++        if ($bio) {
++            $profile->bio = $bio;
++        }
++        if ($location) {
++            $profile->location = $location;
++        }
+hunk ./actions/userauthorization.php 269
+-              if ($exists) {
+-                      $profile->update($orig_profile);
+-              } else {
+-                      $profile->created = DB_DataObject_Cast::dateTime(); # current time
+-                      $id = $profile->insert();
+-                      if (!$id) {
+-                              return FALSE;
+-                      }
+-                      $remote->id = $id;
+-              }
++        if ($exists) {
++            $profile->update($orig_profile);
++        } else {
++            $profile->created = DB_DataObject_Cast::dateTime(); # current time
++            $id = $profile->insert();
++            if (!$id) {
++                return FALSE;
++            }
++            $remote->id = $id;
++        }
+hunk ./actions/userauthorization.php 280
+-              if ($exists) {
+-                      if (!$remote->update($orig_remote)) {
+-                              return FALSE;
+-                      }
+-              } else {
+-                      $remote->created = DB_DataObject_Cast::dateTime(); # current time
+-                      if (!$remote->insert()) {
+-                              return FALSE;
+-                      }
+-              }
++        if ($exists) {
++            if (!$remote->update($orig_remote)) {
++                return FALSE;
++            }
++        } else {
++            $remote->created = DB_DataObject_Cast::dateTime(); # current time
++            if (!$remote->insert()) {
++                return FALSE;
++            }
++        }
+hunk ./actions/userauthorization.php 291
+-              if ($avatar_url) {
+-                      if (!$this->add_avatar($profile, $avatar_url)) {
+-                              return FALSE;
+-                      }
+-              }
++        if ($avatar_url) {
++            if (!$this->add_avatar($profile, $avatar_url)) {
++                return FALSE;
++            }
++        }
+hunk ./actions/userauthorization.php 297
+-              $user = common_current_user();
+-              $datastore = omb_oauth_datastore();
+-              $consumer = $this->get_consumer($datastore, $req);
+-              $token = $this->get_token($datastore, $req, $consumer);
++        $user = common_current_user();
++        $datastore = omb_oauth_datastore();
++        $consumer = $this->get_consumer($datastore, $req);
++        $token = $this->get_token($datastore, $req, $consumer);
+hunk ./actions/userauthorization.php 302
+-              $sub = new Subscription();
+-              $sub->subscriber = $user->id;
+-              $sub->subscribed = $remote->id;
+-              $sub->token = $token->key; # NOTE: request token, not valid for use!
+-              $sub->created = DB_DataObject_Cast::dateTime(); # current time
++        $sub = new Subscription();
++        $sub->subscriber = $user->id;
++        $sub->subscribed = $remote->id;
++        $sub->token = $token->key; # NOTE: request token, not valid for use!
++        $sub->created = DB_DataObject_Cast::dateTime(); # current time
+hunk ./actions/userauthorization.php 308
+-              if (!$sub->insert()) {
+-                      return FALSE;
+-              }
++        if (!$sub->insert()) {
++            return FALSE;
++        }
+hunk ./actions/userauthorization.php 312
+-              return TRUE;
+-      }
++        return TRUE;
++    }
+hunk ./actions/userauthorization.php 315
+-      function add_avatar($profile, $url) {
+-              $temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar');
+-              copy($url, $temp_filename);
+-              return $profile->setOriginal($temp_filename);
+-      }
++    function add_avatar($profile, $url) {
++        $temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar');
++        copy($url, $temp_filename);
++        return $profile->setOriginal($temp_filename);
++    }
+hunk ./actions/userauthorization.php 321
+-      function show_accept_message($tok) {
+-              common_show_header(_('Subscription authorized'));
+-              common_element('p', NULL,
+-                                         _('The subscription has been authorized, but no '.
+-                                                'callback URL was passed. Check with the site\'s instructions for '.
+-                                                'details on how to authorize the subscription. Your subscription token is:'));
+-              common_element('blockquote', 'token', $tok);
+-              common_show_footer();
+-      }
++    function show_accept_message($tok) {
++        common_show_header(_('Subscription authorized'));
++        common_element('p', NULL,
++                       _('The subscription has been authorized, but no '.
++                          'callback URL was passed. Check with the site\'s instructions for '.
++                          'details on how to authorize the subscription. Your subscription token is:'));
++        common_element('blockquote', 'token', $tok);
++        common_show_footer();
++    }
+hunk ./actions/userauthorization.php 331
+-      function show_reject_message($tok) {
+-              common_show_header(_('Subscription rejected'));
+-              common_element('p', NULL,
+-                                         _('The subscription has been rejected, but no '.
+-                                                'callback URL was passed. Check with the site\'s instructions for '.
+-                                                'details on how to fully reject the subscription.'));
+-              common_show_footer();
+-      }
++    function show_reject_message($tok) {
++        common_show_header(_('Subscription rejected'));
++        common_element('p', NULL,
++                       _('The subscription has been rejected, but no '.
++                          'callback URL was passed. Check with the site\'s instructions for '.
++                          'details on how to fully reject the subscription.'));
++        common_show_footer();
++    }
+hunk ./actions/userauthorization.php 340
+-      function store_request($req) {
+-              common_ensure_session();
+-              $_SESSION['userauthorizationrequest'] = $req;
+-      }
++    function store_request($req) {
++        common_ensure_session();
++        $_SESSION['userauthorizationrequest'] = $req;
++    }
+hunk ./actions/userauthorization.php 345
+-      function clear_request() {
+-              common_ensure_session();
+-              unset($_SESSION['userauthorizationrequest']);
+-      }
++    function clear_request() {
++        common_ensure_session();
++        unset($_SESSION['userauthorizationrequest']);
++    }
+hunk ./actions/userauthorization.php 350
+-      function get_stored_request() {
+-              common_ensure_session();
+-              $req = $_SESSION['userauthorizationrequest'];
+-              return $req;
+-      }
++    function get_stored_request() {
++        common_ensure_session();
++        $req = $_SESSION['userauthorizationrequest'];
++        return $req;
++    }
+hunk ./actions/userauthorization.php 356
+-      function get_new_request() {
+-              common_remove_magic_from_request();
+-              $req = OAuthRequest::from_request();
+-              return $req;
+-      }
++    function get_new_request() {
++        common_remove_magic_from_request();
++        $req = OAuthRequest::from_request();
++        return $req;
++    }
+hunk ./actions/userauthorization.php 362
+-      # Throws an OAuthException if anything goes wrong
++    # Throws an OAuthException if anything goes wrong
+hunk ./actions/userauthorization.php 364
+-      function validate_request(&$req) {
+-              # OAuth stuff -- have to copy from OAuth.php since they're
+-              # all private methods, and there's no user-authentication method
+-              common_debug('checking version', __FILE__);
+-              $this->check_version($req);
+-              common_debug('getting datastore', __FILE__);
+-              $datastore = omb_oauth_datastore();
+-              common_debug('getting consumer', __FILE__);
+-              $consumer = $this->get_consumer($datastore, $req);
+-              common_debug('getting token', __FILE__);
+-              $token = $this->get_token($datastore, $req, $consumer);
+-              common_debug('checking timestamp', __FILE__);
+-              $this->check_timestamp($req);
+-              common_debug('checking nonce', __FILE__);
+-              $this->check_nonce($datastore, $req, $consumer, $token);
+-              common_debug('checking signature', __FILE__);
+-              $this->check_signature($req, $consumer, $token);
+-              common_debug('validating omb stuff', __FILE__);
+-              $this->validate_omb($req);
+-              common_debug('done validating', __FILE__);
+-              return true;
+-      }
++    function validate_request(&$req) {
++        # OAuth stuff -- have to copy from OAuth.php since they're
++        # all private methods, and there's no user-authentication method
++        common_debug('checking version', __FILE__);
++        $this->check_version($req);
++        common_debug('getting datastore', __FILE__);
++        $datastore = omb_oauth_datastore();
++        common_debug('getting consumer', __FILE__);
++        $consumer = $this->get_consumer($datastore, $req);
++        common_debug('getting token', __FILE__);
++        $token = $this->get_token($datastore, $req, $consumer);
++        common_debug('checking timestamp', __FILE__);
++        $this->check_timestamp($req);
++        common_debug('checking nonce', __FILE__);
++        $this->check_nonce($datastore, $req, $consumer, $token);
++        common_debug('checking signature', __FILE__);
++        $this->check_signature($req, $consumer, $token);
++        common_debug('validating omb stuff', __FILE__);
++        $this->validate_omb($req);
++        common_debug('done validating', __FILE__);
++        return true;
++    }
+hunk ./actions/userauthorization.php 387
+-      function validate_omb(&$req) {
+-              foreach (array('omb_version', 'omb_listener', 'omb_listenee',
+-                                         'omb_listenee_profile', 'omb_listenee_nickname',
+-                                         'omb_listenee_license') as $param)
+-              {
+-                      if (!$req->get_parameter($param)) {
+-                              throw new OAuthException("Required parameter '$param' not found");
+-                      }
+-              }
+-              # Now, OMB stuff
+-              $version = $req->get_parameter('omb_version');
+-              if ($version != OMB_VERSION_01) {
+-                      throw new OAuthException("OpenMicroBlogging version '$version' not supported");
+-              }
+-              $listener =     $req->get_parameter('omb_listener');
+-              $user = User::staticGet('uri', $listener);
+-              if (!$user) {
+-                      throw new OAuthException("Listener URI '$listener' not found here");
+-              }
+-              $cur = common_current_user();
+-              if ($cur->id != $user->id) {
+-                      throw new OAuthException("Can't add for another user!");
+-              }
+-              $listenee = $req->get_parameter('omb_listenee');
+-              if (!Validate::uri($listenee) &&
+-                      !common_valid_tag($listenee)) {
+-                      throw new OAuthException("Listenee URI '$listenee' not a recognizable URI");
+-              }
+-              if (strlen($listenee) > 255) {
+-                      throw new OAuthException("Listenee URI '$listenee' too long");
+-              }
++    function validate_omb(&$req) {
++        foreach (array('omb_version', 'omb_listener', 'omb_listenee',
++                       'omb_listenee_profile', 'omb_listenee_nickname',
++                       'omb_listenee_license') as $param)
++        {
++            if (!$req->get_parameter($param)) {
++                throw new OAuthException("Required parameter '$param' not found");
++            }
++        }
++        # Now, OMB stuff
++        $version = $req->get_parameter('omb_version');
++        if ($version != OMB_VERSION_01) {
++            throw new OAuthException("OpenMicroBlogging version '$version' not supported");
++        }
++        $listener =    $req->get_parameter('omb_listener');
++        $user = User::staticGet('uri', $listener);
++        if (!$user) {
++            throw new OAuthException("Listener URI '$listener' not found here");
++        }
++        $cur = common_current_user();
++        if ($cur->id != $user->id) {
++            throw new OAuthException("Can't add for another user!");
++        }
++        $listenee = $req->get_parameter('omb_listenee');
++        if (!Validate::uri($listenee) &&
++            !common_valid_tag($listenee)) {
++            throw new OAuthException("Listenee URI '$listenee' not a recognizable URI");
++        }
++        if (strlen($listenee) > 255) {
++            throw new OAuthException("Listenee URI '$listenee' too long");
++        }
+hunk ./actions/userauthorization.php 419
+-              $other = User::staticGet('uri', $listenee);
+-              if ($other) {
+-                      throw new OAuthException("Listenee URI '$listenee' is local user");
+-              }
++        $other = User::staticGet('uri', $listenee);
++        if ($other) {
++            throw new OAuthException("Listenee URI '$listenee' is local user");
++        }
+hunk ./actions/userauthorization.php 424
+-              $remote = Remote_profile::staticGet('uri', $listenee);
+-              if ($remote) {
+-                      $sub = new Subscription();
+-                      $sub->subscriber = $user->id;
+-                      $sub->subscribed = $remote->id;
+-                      if ($sub->find(TRUE)) {
+-                              throw new OAuthException("Already subscribed to user!");
+-                      }
+-              }
+-              $nickname = $req->get_parameter('omb_listenee_nickname');
+-              if (!Validate::string($nickname, array('min_length' => 1,
+-                                                                                         'max_length' => 64,
+-                                                                                         'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+-                      throw new OAuthException('Nickname must have only letters and numbers and no spaces.');
+-              }
+-              $profile = $req->get_parameter('omb_listenee_profile');
+-              if (!common_valid_http_url($profile)) {
+-                      throw new OAuthException("Invalid profile URL '$profile'.");
+-              }
++        $remote = Remote_profile::staticGet('uri', $listenee);
++        if ($remote) {
++            $sub = new Subscription();
++            $sub->subscriber = $user->id;
++            $sub->subscribed = $remote->id;
++            if ($sub->find(TRUE)) {
++                throw new OAuthException("Already subscribed to user!");
++            }
++        }
++        $nickname = $req->get_parameter('omb_listenee_nickname');
++        if (!Validate::string($nickname, array('min_length' => 1,
++                                               'max_length' => 64,
++                                               'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
++            throw new OAuthException('Nickname must have only letters and numbers and no spaces.');
++        }
++        $profile = $req->get_parameter('omb_listenee_profile');
++        if (!common_valid_http_url($profile)) {
++            throw new OAuthException("Invalid profile URL '$profile'.");
++        }
+hunk ./actions/userauthorization.php 444
+-              if ($profile == common_local_url('showstream', array('nickname' => $nickname))) {
+-                      throw new OAuthException("Profile URL '$profile' is for a local user.");
+-              }
++        if ($profile == common_local_url('showstream', array('nickname' => $nickname))) {
++            throw new OAuthException("Profile URL '$profile' is for a local user.");
++        }
+hunk ./actions/userauthorization.php 448
+-              $license = $req->get_parameter('omb_listenee_license');
+-              if (!common_valid_http_url($license)) {
+-                      throw new OAuthException("Invalid license URL '$license'.");
+-              }
+-              $site_license = common_config('license', 'url');
+-              if (!common_compatible_license($license, $site_license)) {
+-                      throw new OAuthException("Listenee stream license '$license' not compatible with site license '$site_license'.");
+-              }
+-              # optional stuff
+-              $fullname = $req->get_parameter('omb_listenee_fullname');
+-              if ($fullname && strlen($fullname) > 255) {
+-                      throw new OAuthException("Full name '$fullname' too long.");
+-              }
+-              $homepage = $req->get_parameter('omb_listenee_homepage');
+-              if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) {
+-                      throw new OAuthException("Invalid homepage '$homepage'");
+-              }
+-              $bio = $req->get_parameter('omb_listenee_bio');
+-              if ($bio && strlen($bio) > 140) {
+-                      throw new OAuthException("Bio too long '$bio'");
+-              }
+-              $location = $req->get_parameter('omb_listenee_location');
+-              if ($location && strlen($location) > 255) {
+-                      throw new OAuthException("Location too long '$location'");
+-              }
+-              $avatar = $req->get_parameter('omb_listenee_avatar');
+-              if ($avatar) {
+-                      if (!common_valid_http_url($avatar) || strlen($avatar) > 255) {
+-                              throw new OAuthException("Invalid avatar URL '$avatar'");
+-                      }
+-                      $size = @getimagesize($avatar);
+-                      if (!$size) {
+-                              throw new OAuthException("Can't read avatar URL '$avatar'");
+-                      }
+-                      if ($size[0] != AVATAR_PROFILE_SIZE || $size[1] != AVATAR_PROFILE_SIZE) {
+-                              throw new OAuthException("Wrong size image at '$avatar'");
+-                      }
+-                      if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG,
+-                                                                                IMAGETYPE_PNG))) {
+-                              throw new OAuthException("Wrong image type for '$avatar'");
+-                      }
+-              }
+-              $callback = $req->get_parameter('oauth_callback');
+-              if ($callback && !common_valid_http_url($callback)) {
+-                      throw new OAuthException("Invalid callback URL '$callback'");
+-              }
+-              if ($callback && $callback == common_local_url('finishremotesubscribe')) {
+-                      throw new OAuthException("Callback URL '$callback' is for local site.");
+-              }
+-      }
++        $license = $req->get_parameter('omb_listenee_license');
++        if (!common_valid_http_url($license)) {
++            throw new OAuthException("Invalid license URL '$license'.");
++        }
++        $site_license = common_config('license', 'url');
++        if (!common_compatible_license($license, $site_license)) {
++            throw new OAuthException("Listenee stream license '$license' not compatible with site license '$site_license'.");
++        }
++        # optional stuff
++        $fullname = $req->get_parameter('omb_listenee_fullname');
++        if ($fullname && strlen($fullname) > 255) {
++            throw new OAuthException("Full name '$fullname' too long.");
++        }
++        $homepage = $req->get_parameter('omb_listenee_homepage');
++        if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) {
++            throw new OAuthException("Invalid homepage '$homepage'");
++        }
++        $bio = $req->get_parameter('omb_listenee_bio');
++        if ($bio && strlen($bio) > 140) {
++            throw new OAuthException("Bio too long '$bio'");
++        }
++        $location = $req->get_parameter('omb_listenee_location');
++        if ($location && strlen($location) > 255) {
++            throw new OAuthException("Location too long '$location'");
++        }
++        $avatar = $req->get_parameter('omb_listenee_avatar');
++        if ($avatar) {
++            if (!common_valid_http_url($avatar) || strlen($avatar) > 255) {
++                throw new OAuthException("Invalid avatar URL '$avatar'");
++            }
++            $size = @getimagesize($avatar);
++            if (!$size) {
++                throw new OAuthException("Can't read avatar URL '$avatar'");
++            }
++            if ($size[0] != AVATAR_PROFILE_SIZE || $size[1] != AVATAR_PROFILE_SIZE) {
++                throw new OAuthException("Wrong size image at '$avatar'");
++            }
++            if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG,
++                                          IMAGETYPE_PNG))) {
++                throw new OAuthException("Wrong image type for '$avatar'");
++            }
++        }
++        $callback = $req->get_parameter('oauth_callback');
++        if ($callback && !common_valid_http_url($callback)) {
++            throw new OAuthException("Invalid callback URL '$callback'");
++        }
++        if ($callback && $callback == common_local_url('finishremotesubscribe')) {
++            throw new OAuthException("Callback URL '$callback' is for local site.");
++        }
++    }
+hunk ./actions/userauthorization.php 499
+-      # Snagged from OAuthServer
++    # Snagged from OAuthServer
+hunk ./actions/userauthorization.php 501
+-      function check_version(&$req) {
+-              $version = $req->get_parameter("oauth_version");
+-              if (!$version) {
+-                      $version = 1.0;
+-              }
+-              if ($version != 1.0) {
+-                      throw new OAuthException("OAuth version '$version' not supported");
+-              }
+-              return $version;
+-      }
++    function check_version(&$req) {
++        $version = $req->get_parameter("oauth_version");
++        if (!$version) {
++            $version = 1.0;
++        }
++        if ($version != 1.0) {
++            throw new OAuthException("OAuth version '$version' not supported");
++        }
++        return $version;
++    }
+hunk ./actions/userauthorization.php 512
+-      # Snagged from OAuthServer
++    # Snagged from OAuthServer
+hunk ./actions/userauthorization.php 514
+-      function get_consumer($datastore, $req) {
+-              $consumer_key = @$req->get_parameter("oauth_consumer_key");
+-              if (!$consumer_key) {
+-                      throw new OAuthException("Invalid consumer key");
+-              }
++    function get_consumer($datastore, $req) {
++        $consumer_key = @$req->get_parameter("oauth_consumer_key");
++        if (!$consumer_key) {
++            throw new OAuthException("Invalid consumer key");
++        }
+hunk ./actions/userauthorization.php 520
+-              $consumer = $datastore->lookup_consumer($consumer_key);
+-              if (!$consumer) {
+-                      throw new OAuthException("Invalid consumer");
+-              }
+-              return $consumer;
+-      }
++        $consumer = $datastore->lookup_consumer($consumer_key);
++        if (!$consumer) {
++            throw new OAuthException("Invalid consumer");
++        }
++        return $consumer;
++    }
+hunk ./actions/userauthorization.php 527
+-      # Mostly cadged from OAuthServer
++    # Mostly cadged from OAuthServer
+hunk ./actions/userauthorization.php 529
+-      function get_token($datastore, &$req, $consumer) {/*{{{*/
+-              $token_field = @$req->get_parameter('oauth_token');
+-              $token = $datastore->lookup_token($consumer, 'request', $token_field);
+-              if (!$token) {
+-                      throw new OAuthException("Invalid $token_type token: $token_field");
+-              }
+-              return $token;
+-      }
++    function get_token($datastore, &$req, $consumer) {/*{{{*/
++        $token_field = @$req->get_parameter('oauth_token');
++        $token = $datastore->lookup_token($consumer, 'request', $token_field);
++        if (!$token) {
++            throw new OAuthException("Invalid $token_type token: $token_field");
++        }
++        return $token;
++    }
+hunk ./actions/userauthorization.php 538
+-      function check_timestamp(&$req) {
+-              $timestamp = @$req->get_parameter('oauth_timestamp');
+-              $now = time();
+-              if ($now - $timestamp > TIMESTAMP_THRESHOLD) {
+-                      throw new OAuthException("Expired timestamp, yours $timestamp, ours $now");
+-              }
+-      }
++    function check_timestamp(&$req) {
++        $timestamp = @$req->get_parameter('oauth_timestamp');
++        $now = time();
++        if ($now - $timestamp > TIMESTAMP_THRESHOLD) {
++            throw new OAuthException("Expired timestamp, yours $timestamp, ours $now");
++        }
++    }
+hunk ./actions/userauthorization.php 546
+-      # NOTE: don't call twice on the same request; will fail!
+-      function check_nonce(&$datastore, &$req, $consumer, $token) {
+-              $timestamp = @$req->get_parameter('oauth_timestamp');
+-              $nonce = @$req->get_parameter('oauth_nonce');
+-              $found = $datastore->lookup_nonce($consumer, $token, $nonce, $timestamp);
+-              if ($found) {
+-                      throw new OAuthException("Nonce already used");
+-              }
+-              return true;
+-      }
++    # NOTE: don't call twice on the same request; will fail!
++    function check_nonce(&$datastore, &$req, $consumer, $token) {
++        $timestamp = @$req->get_parameter('oauth_timestamp');
++        $nonce = @$req->get_parameter('oauth_nonce');
++        $found = $datastore->lookup_nonce($consumer, $token, $nonce, $timestamp);
++        if ($found) {
++            throw new OAuthException("Nonce already used");
++        }
++        return true;
++    }
+hunk ./actions/userauthorization.php 557
+-      function check_signature(&$req, $consumer, $token) {
+-              $signature_method = $this->get_signature_method($req);
+-              $signature = $req->get_parameter('oauth_signature');
+-              $valid_sig = $signature_method->check_signature($req,
+-                                                                                                              $consumer,
+-                                                                                                              $token,
+-                                                                                                              $signature);
+-              if (!$valid_sig) {
+-                      throw new OAuthException("Invalid signature");
+-              }
+-      }
++    function check_signature(&$req, $consumer, $token) {
++        $signature_method = $this->get_signature_method($req);
++        $signature = $req->get_parameter('oauth_signature');
++        $valid_sig = $signature_method->check_signature($req,
++                                                        $consumer,
++                                                        $token,
++                                                        $signature);
++        if (!$valid_sig) {
++            throw new OAuthException("Invalid signature");
++        }
++    }
+hunk ./actions/userauthorization.php 569
+-      function get_signature_method(&$req) {
+-              $signature_method = @$req->get_parameter("oauth_signature_method");
+-              if (!$signature_method) {
+-                      $signature_method = "PLAINTEXT";
+-              }
+-              if ($signature_method != 'HMAC-SHA1') {
+-                      throw new OAuthException("Signature method '$signature_method' not supported.");
+-              }
+-              return omb_hmac_sha1();
+-      }
++    function get_signature_method(&$req) {
++        $signature_method = @$req->get_parameter("oauth_signature_method");
++        if (!$signature_method) {
++            $signature_method = "PLAINTEXT";
++        }
++        if ($signature_method != 'HMAC-SHA1') {
++            throw new OAuthException("Signature method '$signature_method' not supported.");
++        }
++        return omb_hmac_sha1();
++    }
+hunk ./actions/userbyid.php 23
+-      
+-      function is_readonly() {                                
+-              return true;
+-      }
+-      
++    
++    function is_readonly() {                
++        return true;
++    }
++    
+hunk ./actions/userbyid.php 32
+-              $this->client_error(_('No id.'));
+-              }
+-              $user =& User::staticGet($id);
+-              if (!$user) {
+-                      $this->client_error(_('No such user.'));
++            $this->client_error(_('No id.'));
++        }
++        $user =& User::staticGet($id);
++        if (!$user) {
++            $this->client_error(_('No such user.'));
+hunk ./actions/userbyid.php 42
+-      $type = common_negotiate_type(common_accept_to_prefs($httpaccept),
++        $type = common_negotiate_type(common_accept_to_prefs($httpaccept),
+hunk ./actions/userbyid.php 44
+-              $page = $type == 'application/rdf+xml' ? 'foaf' : 'showstream';
++        $page = $type == 'application/rdf+xml' ? 'foaf' : 'showstream';
+hunk ./actions/userbyid.php 46
+-              $url = common_local_url($page, array('nickname' => $user->nickname));
+-              common_redirect($url, 303);
+-      }
++        $url = common_local_url($page, array('nickname' => $user->nickname));
++        common_redirect($url, 303);
++    }
+hunk ./actions/userrss.php 28
+-      var $user = NULL;
++    var $user = NULL;
+hunk ./actions/userrss.php 30
+-      function init() {
+-              $nickname = $this->trimmed('nickname');
+-              $this->user = User::staticGet('nickname', $nickname);
++    function init() {
++        $nickname = $this->trimmed('nickname');
++        $this->user = User::staticGet('nickname', $nickname);
+hunk ./actions/userrss.php 34
+-              if (!$this->user) {
+-                      common_user_error(_('No such user.'));
+-                      return false;
+-              } else {
+-                      return true;
+-              }
+-      }
++        if (!$this->user) {
++            common_user_error(_('No such user.'));
++            return false;
++        } else {
++            return true;
++        }
++    }
+hunk ./actions/userrss.php 42
+-      function get_notices($limit=0) {
++    function get_notices($limit=0) {
+hunk ./actions/userrss.php 44
+-              $user = $this->user;
+-              
+-              if (is_null($user)) {
+-                      return NULL;
+-              }
+-              
+-              $notice = $user->getNotices(0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
+-              
+-              while ($notice->fetch()) {
+-                      $notices[] = clone($notice);
+-              }
++        $user = $this->user;
++        
++        if (is_null($user)) {
++            return NULL;
++        }
++        
++        $notice = $user->getNotices(0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
++        
++        while ($notice->fetch()) {
++            $notices[] = clone($notice);
++        }
+hunk ./actions/userrss.php 56
+-              return $notices;
+-      }
++        return $notices;
++    }
+hunk ./actions/userrss.php 59
+-      function get_channel() {
+-              $user = $this->user;
+-              $profile = $user->getProfile();
+-              $c = array('url' => common_local_url('userrss',
+-                                                                                       array('nickname' =>
+-                                                                                                 $user->nickname)),
+-                                 'title' => $user->nickname,
+-                                 'link' => $profile->profileurl,
+-                                 'description' => sprintf(_('Microblog by %s'), $user->nickname));
+-              return $c;
+-      }
++    function get_channel() {
++        $user = $this->user;
++        $profile = $user->getProfile();
++        $c = array('url' => common_local_url('userrss',
++                                             array('nickname' =>
++                                                   $user->nickname)),
++                   'title' => $user->nickname,
++                   'link' => $profile->profileurl,
++                   'description' => sprintf(_('Microblog by %s'), $user->nickname));
++        return $c;
++    }
+hunk ./actions/userrss.php 71
+-      function get_image() {
+-              $user = $this->user;
+-              $profile = $user->getProfile();
+-              if (!$profile) {
+-                      common_log_db_error($user, 'SELECT', __FILE__);
+-                      $this->server_error(_('User without matching profile'));
+-                      return NULL;
+-              }
+-              $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+-              return ($avatar) ? $avatar->url : NULL;
+-      }
++    function get_image() {
++        $user = $this->user;
++        $profile = $user->getProfile();
++        if (!$profile) {
++            common_log_db_error($user, 'SELECT', __FILE__);
++            $this->server_error(_('User without matching profile'));
++            return NULL;
++        }
++        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
++        return ($avatar) ? $avatar->url : NULL;
++    }
+hunk ./actions/userrss.php 83
+-      # override parent to add X-SUP-ID URL
+-      
+-      function init_rss($limit=0) {
+-              $url = common_local_url('sup', NULL, $this->user->id);
+-              header('X-SUP-ID: '.$url);
+-              parent::init_rss($limit);
+-      }
++    # override parent to add X-SUP-ID URL
++    
++    function init_rss($limit=0) {
++        $url = common_local_url('sup', NULL, $this->user->id);
++        header('X-SUP-ID: '.$url);
++        parent::init_rss($limit);
++    }
+hunk ./actions/xrds.php 26
+-      function is_readonly() {                                
+-              return true;
+-      }
++    function is_readonly() {                
++        return true;
++    }
+hunk ./actions/xrds.php 30
+-      function handle($args) {
+-              parent::handle($args);
+-              $nickname = $this->trimmed('nickname');
+-              $user = User::staticGet('nickname', $nickname);
+-              if (!$user) {
+-                      common_user_error(_('No such user.'));
+-                      return;
+-              }
+-              $this->show_xrds($user);
+-      }
++    function handle($args) {
++        parent::handle($args);
++        $nickname = $this->trimmed('nickname');
++        $user = User::staticGet('nickname', $nickname);
++        if (!$user) {
++            common_user_error(_('No such user.'));
++            return;
++        }
++        $this->show_xrds($user);
++    }
+hunk ./actions/xrds.php 41
+-      function show_xrds($user) {
++    function show_xrds($user) {
+hunk ./actions/xrds.php 43
+-              header('Content-Type: application/xrds+xml');
++        header('Content-Type: application/xrds+xml');
+hunk ./actions/xrds.php 45
+-              common_start_xml();
+-              common_element_start('XRDS', array('xmlns' => 'xri://$xrds'));
++        common_start_xml();
++        common_element_start('XRDS', array('xmlns' => 'xri://$xrds'));
+hunk ./actions/xrds.php 48
+-              common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
+-                                                'xml:id' => 'oauth',
+-                                                                                'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
+-                                                                                'version' => '2.0'));
++        common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
++                                          'xml:id' => 'oauth',
++                                          'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
++                                          'version' => '2.0'));
+hunk ./actions/xrds.php 53
+-              common_element('Type', NULL, 'xri://$xrds*simple');
++        common_element('Type', NULL, 'xri://$xrds*simple');
+hunk ./actions/xrds.php 55
+-              $this->show_service(OAUTH_ENDPOINT_REQUEST,
+-                                                      common_local_url('requesttoken'),
+-                                                      array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
+-                                                      array(OAUTH_HMAC_SHA1),
+-                                                      $user->uri);
++        $this->show_service(OAUTH_ENDPOINT_REQUEST,
++                            common_local_url('requesttoken'),
++                            array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
++                            array(OAUTH_HMAC_SHA1),
++                            $user->uri);
+hunk ./actions/xrds.php 61
+-              $this->show_service(OAUTH_ENDPOINT_AUTHORIZE,
+-                                                      common_local_url('userauthorization'),
+-                                                      array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
+-                                                      array(OAUTH_HMAC_SHA1));
++        $this->show_service(OAUTH_ENDPOINT_AUTHORIZE,
++                            common_local_url('userauthorization'),
++                            array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
++                            array(OAUTH_HMAC_SHA1));
+hunk ./actions/xrds.php 66
+-              $this->show_service(OAUTH_ENDPOINT_ACCESS,
+-                                                      common_local_url('accesstoken'),
+-                                                      array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
+-                                                      array(OAUTH_HMAC_SHA1));
++        $this->show_service(OAUTH_ENDPOINT_ACCESS,
++                            common_local_url('accesstoken'),
++                            array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
++                            array(OAUTH_HMAC_SHA1));
+hunk ./actions/xrds.php 71
+-              $this->show_service(OAUTH_ENDPOINT_RESOURCE,
+-                                                      NULL,
+-                                                      array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
+-                                                      array(OAUTH_HMAC_SHA1));
++        $this->show_service(OAUTH_ENDPOINT_RESOURCE,
++                            NULL,
++                            array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
++                            array(OAUTH_HMAC_SHA1));
+hunk ./actions/xrds.php 76
+-              common_element_end('XRD');
++        common_element_end('XRD');
+hunk ./actions/xrds.php 78
+-              # XXX: decide whether to include user's ID/nickname in postNotice URL
++        # XXX: decide whether to include user's ID/nickname in postNotice URL
+hunk ./actions/xrds.php 80
+-              common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
+-                                                'xml:id' => 'omb',
+-                                                                                'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
+-                                                                                'version' => '2.0'));
++        common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
++                                          'xml:id' => 'omb',
++                                          'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
++                                          'version' => '2.0'));
+hunk ./actions/xrds.php 85
+-              common_element('Type', NULL, 'xri://$xrds*simple');
++        common_element('Type', NULL, 'xri://$xrds*simple');
+hunk ./actions/xrds.php 87
+-              $this->show_service(OMB_ENDPOINT_POSTNOTICE,
+-                                                      common_local_url('postnotice'));
++        $this->show_service(OMB_ENDPOINT_POSTNOTICE,
++                            common_local_url('postnotice'));
+hunk ./actions/xrds.php 90
+-              $this->show_service(OMB_ENDPOINT_UPDATEPROFILE,
+-                                                      common_local_url('updateprofile'));
++        $this->show_service(OMB_ENDPOINT_UPDATEPROFILE,
++                            common_local_url('updateprofile'));
+hunk ./actions/xrds.php 93
+-              common_element_end('XRD');
++        common_element_end('XRD');
+hunk ./actions/xrds.php 95
+-              common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
+-                                                                                'version' => '2.0'));
++        common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
++                                          'version' => '2.0'));
+hunk ./actions/xrds.php 98
+-              common_element('Type', NULL, 'xri://$xrds*simple');
++        common_element('Type', NULL, 'xri://$xrds*simple');
+hunk ./actions/xrds.php 100
+-              $this->show_service(OAUTH_DISCOVERY,
+-                                                      '#oauth');
+-              $this->show_service(OMB_NAMESPACE,
+-                                                      '#omb');
++        $this->show_service(OAUTH_DISCOVERY,
++                            '#oauth');
++        $this->show_service(OMB_NAMESPACE,
++                            '#omb');
+hunk ./actions/xrds.php 105
+-              common_element_end('XRD');
++        common_element_end('XRD');
+hunk ./actions/xrds.php 107
+-              common_element_end('XRDS');
+-              common_end_xml();
+-      }
++        common_element_end('XRDS');
++        common_end_xml();
++    }
+hunk ./actions/xrds.php 111
+-      function show_service($type, $uri, $params=NULL, $sigs=NULL, $localId=NULL) {
+-              common_element_start('Service');
+-              if ($uri) {
+-                      common_element('URI', NULL, $uri);
+-              }
+-              common_element('Type', NULL, $type);
+-              if ($params) {
+-                      foreach ($params as $param) {
+-                              common_element('Type', NULL, $param);
+-                      }
+-              }
+-              if ($sigs) {
+-                      foreach ($sigs as $sig) {
+-                              common_element('Type', NULL, $sig);
+-                      }
+-              }
+-              if ($localId) {
+-                      common_element('LocalID', NULL, $localId);
+-              }
+-              common_element_end('Service');
+-      }
++    function show_service($type, $uri, $params=NULL, $sigs=NULL, $localId=NULL) {
++        common_element_start('Service');
++        if ($uri) {
++            common_element('URI', NULL, $uri);
++        }
++        common_element('Type', NULL, $type);
++        if ($params) {
++            foreach ($params as $param) {
++                common_element('Type', NULL, $param);
++            }
++        }
++        if ($sigs) {
++            foreach ($sigs as $sig) {
++                common_element('Type', NULL, $sig);
++            }
++        }
++        if ($localId) {
++            common_element('LocalID', NULL, $localId);
++        }
++        common_element_end('Service');
++    }
+hunk ./classes/Avatar.php 29
+-      # We clean up the file, too
++    # We clean up the file, too
+hunk ./classes/Avatar.php 31
+-      function delete() {
+-              $filename = $this->filename;
+-              if (parent::delete()) {
+-                      @unlink(common_avatar_path($filename));
+-              }
+-      }
++    function delete() {
++        $filename = $this->filename;
++        if (parent::delete()) {
++            @unlink(common_avatar_path($filename));
++        }
++    }
+hunk ./classes/Avatar.php 38
+-      # Create and save scaled version of this avatar
+-      # XXX: maybe break into different methods
++    # Create and save scaled version of this avatar
++    # XXX: maybe break into different methods
+hunk ./classes/Avatar.php 41
+-      function scale($size) {
++    function scale($size) {
+hunk ./classes/Avatar.php 43
+-              $image_s = imagecreatetruecolor($size, $size);
+-              $image_a = $this->to_image();
+-              $square = min($this->width, $this->height);
++        $image_s = imagecreatetruecolor($size, $size);
++        $image_a = $this->to_image();
++        $square = min($this->width, $this->height);
+hunk ./classes/Avatar.php 49
+-              imagecopyresampled($image_s, $image_a, 0, 0, 0, 0,
+-                                                 $size, $size, $square, $square);
++        imagecopyresampled($image_s, $image_a, 0, 0, 0, 0,
++                           $size, $size, $square, $square);
+hunk ./classes/Avatar.php 52
+-              $ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png";
++        $ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png";
+hunk ./classes/Avatar.php 54
+-              $filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp());
++        $filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp());
+hunk ./classes/Avatar.php 56
+-              if ($this->mediatype == 'image/jpeg') {
+-                      imagejpeg($image_s, common_avatar_path($filename));
+-              } else {
+-                      imagepng($image_s, common_avatar_path($filename));
+-              }
++        if ($this->mediatype == 'image/jpeg') {
++            imagejpeg($image_s, common_avatar_path($filename));
++        } else {
++            imagepng($image_s, common_avatar_path($filename));
++        }
+hunk ./classes/Avatar.php 62
+-              $scaled = DB_DataObject::factory('avatar');
+-              $scaled->profile_id = $this->profile_id;
+-              $scaled->width = $size;
+-              $scaled->height = $size;
+-              $scaled->original = false;
+-              $scaled->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png';
+-              $scaled->filename = $filename;
+-              $scaled->url = common_avatar_url($filename);
+-              $scaled->created = DB_DataObject_Cast::dateTime(); # current time
++        $scaled = DB_DataObject::factory('avatar');
++        $scaled->profile_id = $this->profile_id;
++        $scaled->width = $size;
++        $scaled->height = $size;
++        $scaled->original = false;
++        $scaled->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png';
++        $scaled->filename = $filename;
++        $scaled->url = common_avatar_url($filename);
++        $scaled->created = DB_DataObject_Cast::dateTime(); # current time
+hunk ./classes/Avatar.php 72
+-              if ($scaled->insert()) {
+-                      return $scaled;
+-              } else {
+-                      return NULL;
+-              }
+-      }
++        if ($scaled->insert()) {
++            return $scaled;
++        } else {
++            return NULL;
++        }
++    }
+hunk ./classes/Avatar.php 79
+-      function to_image() {
+-              $filepath = common_avatar_path($this->filename);
+-              if ($this->mediatype == 'image/gif') {
+-                      return imagecreatefromgif($filepath);
+-              } else if ($this->mediatype == 'image/jpeg') {
+-                      return imagecreatefromjpeg($filepath);
+-              } else if ($this->mediatype == 'image/png') {
+-                      return imagecreatefrompng($filepath);
+-              } else {
+-                      return NULL;
+-              }
+-      }
+-      
+-      function &pkeyGet($kv) {
+-              return Memcached_DataObject::pkeyGet('Avatar', $kv);
+-      }
++    function to_image() {
++        $filepath = common_avatar_path($this->filename);
++        if ($this->mediatype == 'image/gif') {
++            return imagecreatefromgif($filepath);
++        } else if ($this->mediatype == 'image/jpeg') {
++            return imagecreatefromjpeg($filepath);
++        } else if ($this->mediatype == 'image/png') {
++            return imagecreatefrompng($filepath);
++        } else {
++            return NULL;
++        }
++    }
++    
++    function &pkeyGet($kv) {
++        return Memcached_DataObject::pkeyGet('Avatar', $kv);
++    }
+hunk ./classes/Channel.php 23
+-      
+-      function on($user) {
+-              return false;
+-      }
++    
++    function on($user) {
++        return false;
++    }
+hunk ./classes/Channel.php 28
+-      function off($user) {
+-              return false;
+-      }
++    function off($user) {
++        return false;
++    }
+hunk ./classes/Channel.php 32
+-      function output($user, $text) {
+-              return false;
+-      }
+-      
+-      function error($user, $text) {
+-              return false;
+-      }
+-      
+-      function source() {
+-              return NULL;
+-      }
++    function output($user, $text) {
++        return false;
++    }
++    
++    function error($user, $text) {
++        return false;
++    }
++    
++    function source() {
++        return NULL;
++    }
+hunk ./classes/Channel.php 47
+-      var $conn = NULL;
+-      
+-      function source() {
+-              return 'xmpp';
+-      }
+-      
+-      function __construct($conn) {
+-              $this->conn = $conn;
+-      }
+-      
+-      function on($user) {
+-              return $this->set_notify($user, 1);
+-      }
+-      
+-      function off($user) {
+-              return $this->set_notify($user, 0);
+-      }
++    var $conn = NULL;
++    
++    function source() {
++        return 'xmpp';
++    }
++    
++    function __construct($conn) {
++        $this->conn = $conn;
++    }
++    
++    function on($user) {
++        return $this->set_notify($user, 1);
++    }
++    
++    function off($user) {
++        return $this->set_notify($user, 0);
++    }
+hunk ./classes/Channel.php 65
+-      function output($user, $text) {
+-              $text = '['.common_config('site', 'name') . '] ' . $text;
+-              jabber_send_message($user->jabber, $text);
+-      }
+-      
+-      function error($user, $text) {
+-              $text = '['.common_config('site', 'name') . '] ' . $text;
+-              jabber_send_message($user->jabber, $text);
+-      }
+-      
+-      function set_notify(&$user, $notify) {
+-              $orig = clone($user);
+-              $user->jabbernotify = $notify;
+-              $result = $user->update($orig);
+-              if (!$result) {
+-                      $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
+-                      common_log(LOG_ERR,
+-                                         'Could not set notify flag to ' . $notify .
+-                                         ' for user ' . common_log_objstring($user) .
+-                                         ': ' . $last_error->message);
+-                      return false;
+-              } else {
+-                      common_log(LOG_INFO,
+-                                         'User ' . $user->nickname . ' set notify flag to ' . $notify);
+-                      return true;
+-              }
+-      }
++    function output($user, $text) {
++        $text = '['.common_config('site', 'name') . '] ' . $text;
++        jabber_send_message($user->jabber, $text);
++    }
++    
++    function error($user, $text) {
++        $text = '['.common_config('site', 'name') . '] ' . $text;
++        jabber_send_message($user->jabber, $text);
++    }
++    
++    function set_notify(&$user, $notify) {
++        $orig = clone($user);
++        $user->jabbernotify = $notify;
++        $result = $user->update($orig);
++        if (!$result) {
++            $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
++            common_log(LOG_ERR,
++                       'Could not set notify flag to ' . $notify .
++                       ' for user ' . common_log_objstring($user) .
++                       ': ' . $last_error->message);
++            return false;
++        } else {
++            common_log(LOG_INFO,
++                       'User ' . $user->nickname . ' set notify flag to ' . $notify);
++            return true;
++        }
++    }
+hunk ./classes/Channel.php 97
+-      function source() {
+-              return 'web';
+-      }
+-      
+-      function on($user) {
+-              return false;
+-      }
+-      
+-      function off($user) {
+-              return false;
+-      }
++    function source() {
++        return 'web';
++    }
++    
++    function on($user) {
++        return false;
++    }
++    
++    function off($user) {
++        return false;
++    }
+hunk ./classes/Channel.php 109
+-      function output($user, $text) {
+-              # XXX: buffer all output and send it at the end
+-              # XXX: even better, redirect to appropriate page
+-              #      depending on what command was run
+-              common_show_header(_('Command results'));
+-              common_element('p', NULL, $text);
+-              common_show_footer();
+-      }
+-      
+-      function error($user, $text) {
+-              common_user_error($text);
+-      }
++    function output($user, $text) {
++        # XXX: buffer all output and send it at the end
++        # XXX: even better, redirect to appropriate page
++        #      depending on what command was run
++        common_show_header(_('Command results'));
++        common_element('p', NULL, $text);
++        common_show_footer();
++    }
++    
++    function error($user, $text) {
++        common_user_error($text);
++    }
+hunk ./classes/Channel.php 126
+-      function output($user, $text) {
+-              common_start_html('text/xml;charset=utf-8', true);
+-              common_element_start('head');
+-              common_element('title', null, _('Command results'));
+-              common_element_end('head');
+-              common_element_start('body');
+-              common_element('p', array('id' => 'command_result'), $text);
+-              common_element_end('body');
+-              common_element_end('html');
+-      }
++    function output($user, $text) {
++        common_start_html('text/xml;charset=utf-8', true);
++        common_element_start('head');
++        common_element('title', null, _('Command results'));
++        common_element_end('head');
++        common_element_start('body');
++        common_element('p', array('id' => 'command_result'), $text);
++        common_element_end('body');
++        common_element_end('html');
++    }
+hunk ./classes/Channel.php 137
+-      function error($user, $text) {
+-              common_start_html('text/xml;charset=utf-8', true);
+-              common_element_start('head');
+-              common_element('title', null, _('Ajax Error'));
+-              common_element_end('head');
+-              common_element_start('body');
+-              common_element('p', array('id' => 'error'), $text);
+-              common_element_end('body');
+-              common_element_end('html');
+-      }
++    function error($user, $text) {
++        common_start_html('text/xml;charset=utf-8', true);
++        common_element_start('head');
++        common_element('title', null, _('Ajax Error'));
++        common_element_end('head');
++        common_element_start('body');
++        common_element('p', array('id' => 'error'), $text);
++        common_element_end('body');
++        common_element_end('html');
++    }
+hunk ./classes/Channel.php 152
+-      var $addr = NULL;
++    var $addr = NULL;
+hunk ./classes/Channel.php 154
+-      function source() {
+-              return 'mail';
+-      }
+-      
+-      function __construct($addr=NULL) {
+-              $this->addr = $addr;
+-      }
+-      
+-      function on($user) {
+-              return $this->set_notify($user, 1);
+-      }
+-      
+-      function off($user) {
+-              return $this->set_notify($user, 0);
+-      }
++    function source() {
++        return 'mail';
++    }
++    
++    function __construct($addr=NULL) {
++        $this->addr = $addr;
++    }
++    
++    function on($user) {
++        return $this->set_notify($user, 1);
++    }
++    
++    function off($user) {
++        return $this->set_notify($user, 0);
++    }
+hunk ./classes/Channel.php 170
+-      function output($user, $text) {
++    function output($user, $text) {
+hunk ./classes/Channel.php 172
+-              $headers['From'] = $user->incomingemail;
+-              $headers['To'] = $this->addr;
+-              
+-              $headers['Subject'] = _('Command complete');
++        $headers['From'] = $user->incomingemail;
++        $headers['To'] = $this->addr;
++        
++        $headers['Subject'] = _('Command complete');
+hunk ./classes/Channel.php 177
+-              return mail_send(array($this->addr), $headers, $text);
+-      }
+-      
+-      function error($user, $text) {
+-              
+-              $headers['From'] = $user->incomingemail;
+-              $headers['To'] = $this->addr;
+-              
+-              $headers['Subject'] = _('Command failed');
++        return mail_send(array($this->addr), $headers, $text);
++    }
++    
++    function error($user, $text) {
++        
++        $headers['From'] = $user->incomingemail;
++        $headers['To'] = $this->addr;
++        
++        $headers['Subject'] = _('Command failed');
+hunk ./classes/Channel.php 187
+-              return mail_send(array($this->addr), $headers, $text);
+-      }
+-      
+-      function set_notify($user, $value) {
+-              $orig = clone($user);
+-              $user->smsnotify = $value;
+-              $result = $user->update($orig);
+-              if (!$result) {
+-                      common_log_db_error($user, 'UPDATE', __FILE__);
+-                      return false;
+-              }
+-              return true;
+-      }
++        return mail_send(array($this->addr), $headers, $text);
++    }
++    
++    function set_notify($user, $value) {
++        $orig = clone($user);
++        $user->smsnotify = $value;
++        $result = $user->update($orig);
++        if (!$result) {
++            common_log_db_error($user, 'UPDATE', __FILE__);
++            return false;
++        }
++        return true;
++    }
+hunk ./classes/Command.php 25
+-      
+-      var $user = NULL;
+-      
+-      function __construct($user=NULL) {
+-              $this->user = $user;
+-      }
+-      
+-      function execute($channel) {
+-              return false;
+-      }
++    
++    var $user = NULL;
++    
++    function __construct($user=NULL) {
++        $this->user = $user;
++    }
++    
++    function execute($channel) {
++        return false;
++    }
+hunk ./classes/Command.php 38
+-      function execute($channel) {
+-              $channel->error($this->user, _("Sorry, this command is not yet implemented."));
+-      }
++    function execute($channel) {
++        $channel->error($this->user, _("Sorry, this command is not yet implemented."));
++    }
+hunk ./classes/Command.php 50
+-      var $word = NULL;
+-      function __construct($user, $word) {
+-              parent::__construct($user);
+-              $this->word = $word;
+-      }
++    var $word = NULL;
++    function __construct($user, $word) {
++        parent::__construct($user);
++        $this->word = $word;
++    }
+hunk ./classes/Command.php 58
+-      var $word = NULL;
+-      function __construct($user, $word) {
+-              parent::__construct($user);
+-              $this->word = $word;
+-      }
++    var $word = NULL;
++    function __construct($user, $word) {
++        parent::__construct($user);
++        $this->word = $word;
++    }
+hunk ./classes/Command.php 66
+-      var $other = NULL;
+-      function __construct($user, $other) {
+-              parent::__construct($user);
+-              $this->other = $other;
+-      }
++    var $other = NULL;
++    function __construct($user, $other) {
++        parent::__construct($user);
++        $this->other = $other;
++    }
+hunk ./classes/Command.php 74
+-      var $other = NULL;
+-      function __construct($user, $other) {
+-              parent::__construct($user);
+-              $this->other = $other;
+-      }
++    var $other = NULL;
++    function __construct($user, $other) {
++        parent::__construct($user);
++        $this->other = $other;
++    }
+hunk ./classes/Command.php 82
+-      function execute($channel) {
++    function execute($channel) {
+hunk ./classes/Command.php 84
+-              $subs = new Subscription();
+-              $subs->subscriber = $this->user->id;
+-              $subs_count = (int) $subs->count() - 1;
++        $subs = new Subscription();
++        $subs->subscriber = $this->user->id;
++        $subs_count = (int) $subs->count() - 1;
+hunk ./classes/Command.php 88
+-              $subbed = new Subscription();
+-              $subbed->subscribed = $this->user->id;
+-              $subbed_count = (int) $subbed->count() - 1;
++        $subbed = new Subscription();
++        $subbed->subscribed = $this->user->id;
++        $subbed_count = (int) $subbed->count() - 1;
+hunk ./classes/Command.php 92
+-              $notices = new Notice();
+-              $notices->profile_id = $this->user->id;
+-              $notice_count = (int) $notices->count();
+-              
+-              $channel->output($this->user, sprintf(_("Subscriptions: %1\$s\n".
+-                                                                 "Subscribers: %2\$s\n".
+-                                                                 "Notices: %3\$s"),
+-                                                               $subs_count,
+-                                                               $subbed_count,
+-                                                               $notice_count));
+-      }
++        $notices = new Notice();
++        $notices->profile_id = $this->user->id;
++        $notice_count = (int) $notices->count();
++        
++        $channel->output($this->user, sprintf(_("Subscriptions: %1\$s\n".
++                                   "Subscribers: %2\$s\n".
++                                   "Notices: %3\$s"),
++                                 $subs_count,
++                                 $subbed_count,
++                                 $notice_count));
++    }
+hunk ./classes/Command.php 106
+-      
+-      var $other = NULL;
+-      
+-      function __construct($user, $other) {
+-              parent::__construct($user);
+-              $this->other = $other;
+-      }
+-      
+-      function execute($channel) {
+-              
+-              $recipient = 
+-                common_relative_profile($this->user, common_canonical_nickname($this->other));
+-              
+-              if (!$recipient) {
+-                      $channel->error($this->user, _('No such user.'));
+-                      return;
+-              }
+-              $notice = $recipient->getCurrentNotice();
+-              if (!$notice) {
+-                      $channel->error($this->user, _('User has no last notice'));
+-                      return;
+-              }
+-              
+-              $fave = Fave::addNew($this->user, $notice);
++    
++    var $other = NULL;
++    
++    function __construct($user, $other) {
++        parent::__construct($user);
++        $this->other = $other;
++    }
++    
++    function execute($channel) {
++        
++        $recipient = 
++          common_relative_profile($this->user, common_canonical_nickname($this->other));
++        
++        if (!$recipient) {
++            $channel->error($this->user, _('No such user.'));
++            return;
++        }
++        $notice = $recipient->getCurrentNotice();
++        if (!$notice) {
++            $channel->error($this->user, _('User has no last notice'));
++            return;
++        }
++        
++        $fave = Fave::addNew($this->user, $notice);
+hunk ./classes/Command.php 131
+-              if (!$fave) {
+-                      $channel->error($this->user, _('Could not create favorite.'));
+-                      return;
+-              }
++        if (!$fave) {
++            $channel->error($this->user, _('Could not create favorite.'));
++            return;
++        }
+hunk ./classes/Command.php 136
+-          $other = User::staticGet('id', $recipient->id);
+-              
+-              if ($other && $other->id != $user->id) {
+-                      if ($other->email && $other->emailnotifyfav) {
+-                              mail_notify_fave($other, $this->user, $notice);
+-                      }
+-              }
+-              
+-              $this->user->blowFavesCache();
+-              
+-              $channel->output($this->user, _('Notice marked as fave.'));
+-      }
++        $other = User::staticGet('id', $recipient->id);
++        
++        if ($other && $other->id != $user->id) {
++            if ($other->email && $other->emailnotifyfav) {
++                mail_notify_fave($other, $this->user, $notice);
++            }
++        }
++        
++        $this->user->blowFavesCache();
++        
++        $channel->output($this->user, _('Notice marked as fave.'));
++    }
+hunk ./classes/Command.php 151
+-      var $other = NULL;
+-      function __construct($user, $other) {
+-              parent::__construct($user);
+-              $this->other = $other;
+-      }
+-      
+-      function execute($channel) {
+-              $recipient = 
+-                common_relative_profile($this->user, common_canonical_nickname($this->other));
+-              
+-              if (!$recipient) {
+-                      $channel->error($this->user, _('No such user.'));
+-                      return;
+-              }
+-              
+-              $whois = sprintf(_("%1\$s (%2\$s)"), $recipient->nickname,
+-                                               $recipient->profileurl);
+-              if ($recipient->fullname) {
+-                      $whois .= "\n" . sprintf(_('Fullname: %s'), $recipient->fullname);
+-              }
+-              if ($recipient->location) {
+-                      $whois .= "\n" . sprintf(_('Location: %s'), $recipient->location);
+-              }
+-              if ($recipient->homepage) {
+-                      $whois .= "\n" . sprintf(_('Homepage: %s'), $recipient->homepage);
+-              }
+-              if ($recipient->bio) {
+-                      $whois .= "\n" . sprintf(_('About: %s'), $recipient->bio);
+-              }
+-              $channel->output($this->user, $whois);
+-      }
++    var $other = NULL;
++    function __construct($user, $other) {
++        parent::__construct($user);
++        $this->other = $other;
++    }
++    
++    function execute($channel) {
++        $recipient = 
++          common_relative_profile($this->user, common_canonical_nickname($this->other));
++        
++        if (!$recipient) {
++            $channel->error($this->user, _('No such user.'));
++            return;
++        }
++        
++        $whois = sprintf(_("%1\$s (%2\$s)"), $recipient->nickname,
++                         $recipient->profileurl);
++        if ($recipient->fullname) {
++            $whois .= "\n" . sprintf(_('Fullname: %s'), $recipient->fullname);
++        }
++        if ($recipient->location) {
++            $whois .= "\n" . sprintf(_('Location: %s'), $recipient->location);
++        }
++        if ($recipient->homepage) {
++            $whois .= "\n" . sprintf(_('Homepage: %s'), $recipient->homepage);
++        }
++        if ($recipient->bio) {
++            $whois .= "\n" . sprintf(_('About: %s'), $recipient->bio);
++        }
++        $channel->output($this->user, $whois);
++    }
+hunk ./classes/Command.php 185
+-      var $other = NULL;
+-      var $text = NULL;
+-      function __construct($user, $other, $text) {
+-              parent::__construct($user);
+-              $this->other = $other;
+-              $this->text = $text;
+-      }
+-      
+-      function execute($channel) {
+-              $other = User::staticGet('nickname', common_canonical_nickname($this->other));
+-              $len = mb_strlen($this->text);
+-              if ($len == 0) {
+-                      $channel->error($this->user, _('No content!'));
+-                      return;
+-              } else if ($len > 140) {
+-                      $content = common_shorten_links($content);
+-                      if (mb_strlen($content) > 140) {
+-                              $channel->error($this->user, sprintf(_('Message too long - maximum is 140 characters, you sent %d'), $len));
+-                              return;
+-                      }
+-              }
+-              
+-              if (!$other) {
+-                      $channel->error($this->user, _('No such user.'));
+-                      return;
+-              } else if (!$this->user->mutuallySubscribed($other)) {
+-                      $channel->error($this->user, _('You can\'t send a message to this user.'));
+-                      return;
+-              } else if ($this->user->id == $other->id) {
+-                      $channel->error($this->user, _('Don\'t send a message to yourself; just say it to yourself quietly instead.'));
+-                      return;
+-              }
+-              $message = Message::saveNew($this->user->id, $other->id, $this->text, $channel->source());
+-              if ($message) {
+-                      $channel->output($this->user, sprintf(_('Direct message to %s sent'), $this->other));
+-              } else {
+-                      $channel->error($this->user, _('Error sending direct message.'));
+-              }
+-      }
++    var $other = NULL;
++    var $text = NULL;
++    function __construct($user, $other, $text) {
++        parent::__construct($user);
++        $this->other = $other;
++        $this->text = $text;
++    }
++    
++    function execute($channel) {
++        $other = User::staticGet('nickname', common_canonical_nickname($this->other));
++        $len = mb_strlen($this->text);
++        if ($len == 0) {
++            $channel->error($this->user, _('No content!'));
++            return;
++        } else if ($len > 140) {
++            $content = common_shorten_links($content);
++            if (mb_strlen($content) > 140) {
++                $channel->error($this->user, sprintf(_('Message too long - maximum is 140 characters, you sent %d'), $len));
++                return;
++            }
++        }
++        
++        if (!$other) {
++            $channel->error($this->user, _('No such user.'));
++            return;
++        } else if (!$this->user->mutuallySubscribed($other)) {
++            $channel->error($this->user, _('You can\'t send a message to this user.'));
++            return;
++        } else if ($this->user->id == $other->id) {
++            $channel->error($this->user, _('Don\'t send a message to yourself; just say it to yourself quietly instead.'));
++            return;
++        }
++        $message = Message::saveNew($this->user->id, $other->id, $this->text, $channel->source());
++        if ($message) {
++            $channel->output($this->user, sprintf(_('Direct message to %s sent'), $this->other));
++        } else {
++            $channel->error($this->user, _('Error sending direct message.'));
++        }
++    }
+hunk ./classes/Command.php 227
+-      
+-      var $other = NULL;
+-      
+-      function __construct($user, $other) {
+-              parent::__construct($user);
+-              $this->other = $other;
+-      }
+-      
+-      function execute($channel) {
+-              $target_nickname = common_canonical_nickname($this->other);
+-              
+-              $target =
+-                common_relative_profile($this->user, $target_nickname);
++    
++    var $other = NULL;
++    
++    function __construct($user, $other) {
++        parent::__construct($user);
++        $this->other = $other;
++    }
++    
++    function execute($channel) {
++        $target_nickname = common_canonical_nickname($this->other);
++        
++        $target =
++          common_relative_profile($this->user, $target_nickname);
+hunk ./classes/Command.php 241
+-              if (!$target) {
+-                      $channel->error($this->user, _('No such user.'));
+-                      return;
+-              }
+-              $notice = $target->getCurrentNotice();
+-              if (!$notice) {
+-                      $channel->error($this->user, _('User has no last notice'));
+-                      return;
+-              }
+-              $notice_content = $notice->content;
+-              
+-              $channel->output($this->user, $target_nickname . ": " . $notice_content);
+-      }
++        if (!$target) {
++            $channel->error($this->user, _('No such user.'));
++            return;
++        }
++        $notice = $target->getCurrentNotice();
++        if (!$notice) {
++            $channel->error($this->user, _('User has no last notice'));
++            return;
++        }
++        $notice_content = $notice->content;
++        
++        $channel->output($this->user, $target_nickname . ": " . $notice_content);
++    }
+hunk ./classes/Command.php 257
+-      
+-      var $other = NULL;
+-      
+-      function __construct($user, $other) {
+-              parent::__construct($user);
+-              $this->other = $other;
+-      }
+-      
+-      function execute($channel) {
+-              
+-              if (!$this->other) {
+-                      $channel->error($this->user, _('Specify the name of the user to subscribe to'));
+-                      return;
+-              }
+-              
+-              $result = subs_subscribe_user($this->user, $this->other);
+-              
+-              if ($result == 'true') {
+-                      $channel->output($this->user, sprintf(_('Subscribed to %s'), $this->other));
+-              } else {
+-                      $channel->error($this->user, $result);
+-              }
+-      }
++    
++    var $other = NULL;
++    
++    function __construct($user, $other) {
++        parent::__construct($user);
++        $this->other = $other;
++    }
++    
++    function execute($channel) {
++        
++        if (!$this->other) {
++            $channel->error($this->user, _('Specify the name of the user to subscribe to'));
++            return;
++        }
++        
++        $result = subs_subscribe_user($this->user, $this->other);
++        
++        if ($result == 'true') {
++            $channel->output($this->user, sprintf(_('Subscribed to %s'), $this->other));
++        } else {
++            $channel->error($this->user, $result);
++        }
++    }
+hunk ./classes/Command.php 284
+-      var $other = NULL;
+-      
+-      function __construct($user, $other) {
+-              parent::__construct($user);
+-              $this->other = $other;
+-      }
++    var $other = NULL;
++    
++    function __construct($user, $other) {
++        parent::__construct($user);
++        $this->other = $other;
++    }
+hunk ./classes/Command.php 291
+-      function execute($channel) {
+-              if(!$this->other) {
+-                      $channel->error($this->user, _('Specify the name of the user to unsubscribe from'));
+-                      return;
+-              }
+-              
+-              $result=subs_unsubscribe_user($this->user, $this->other);
+-              
+-              if ($result) {
+-                      $channel->output($this->user, sprintf(_('Unsubscribed from %s'), $this->other));
+-              } else {
+-                      $channel->error($this->user, $result);
+-              }
+-      }
++    function execute($channel) {
++        if(!$this->other) {
++            $channel->error($this->user, _('Specify the name of the user to unsubscribe from'));
++            return;
++        }
++        
++        $result=subs_unsubscribe_user($this->user, $this->other);
++        
++        if ($result) {
++            $channel->output($this->user, sprintf(_('Unsubscribed from %s'), $this->other));
++        } else {
++            $channel->error($this->user, $result);
++        }
++    }
+hunk ./classes/Command.php 308
+-      var $other = NULL;
+-      function __construct($user, $other=NULL) {
+-              parent::__construct($user);
+-              $this->other = $other;
+-      }
+-      function execute($channel) {
+-              if ($other) {
+-                      $channel->error($this->user, _("Command not yet implemented."));
+-              } else {
+-                      if ($channel->off($this->user)) {
+-                              $channel->output($this->user, _('Notification off.'));
+-                      } else {
+-                              $channel->error($this->user, _('Can\'t turn off notification.'));
+-                      }
+-              }
+-      }
++    var $other = NULL;
++    function __construct($user, $other=NULL) {
++        parent::__construct($user);
++        $this->other = $other;
++    }
++    function execute($channel) {
++        if ($other) {
++            $channel->error($this->user, _("Command not yet implemented."));
++        } else {
++            if ($channel->off($this->user)) {
++                $channel->output($this->user, _('Notification off.'));
++            } else {
++                $channel->error($this->user, _('Can\'t turn off notification.'));
++            }
++        }
++    }
+hunk ./classes/Command.php 327
+-      var $other = NULL;
+-      function __construct($user, $other=NULL) {
+-              parent::__construct($user);
+-              $this->other = $other;
+-      }
+-      
+-      function execute($channel) {
+-              if ($other) {
+-                      $channel->error($this->user, _("Command not yet implemented."));
+-              } else {
+-                      if ($channel->on($this->user)) {
+-                              $channel->output($this->user, _('Notification on.'));
+-                      } else {
+-                              $channel->error($this->user, _('Can\'t turn on notification.'));
+-                      }
+-              }
+-      }
++    var $other = NULL;
++    function __construct($user, $other=NULL) {
++        parent::__construct($user);
++        $this->other = $other;
++    }
++    
++    function execute($channel) {
++        if ($other) {
++            $channel->error($this->user, _("Command not yet implemented."));
++        } else {
++            if ($channel->on($this->user)) {
++                $channel->output($this->user, _('Notification on.'));
++            } else {
++                $channel->error($this->user, _('Can\'t turn on notification.'));
++            }
++        }
++    }
+hunk ./classes/Command.php 347
+-      function execute($channel) {
+-              $channel->output($this->user,
+-                                               _("Commands:\n".
+-                                                 "on - turn on notifications\n".
+-                                                 "off - turn off notifications\n".
+-                                                 "help - show this help\n".
+-                                                 "follow <nickname> - subscribe to user\n".
+-                                                 "leave <nickname> - unsubscribe from user\n".
+-                                                 "d <nickname> <text> - direct message to user\n".
+-                                                 "get <nickname> - get last notice from user\n".
+-                                                 "whois <nickname> - get profile info on user\n".
+-                                                 "fav <nickname> - add user's last notice as a 'fave'\n".
+-                                                 "stats - get your stats\n".
+-                                                 "stop - same as 'off'\n".
+-                                                 "quit - same as 'off'\n".
+-                                                 "sub <nickname> - same as 'follow'\n".
+-                                                 "unsub <nickname> - same as 'leave'\n".
+-                                                 "last <nickname> - same as 'get'\n".
+-                                                 "on <nickname> - not yet implemented.\n".
+-                                                 "off <nickname> - not yet implemented.\n".                                              
+-                                                 "nudge <nickname> - not yet implemented.\n".
+-                                                 "invite <phone number> - not yet implemented.\n".
+-                                                 "track <word> - not yet implemented.\n".
+-                                                 "untrack <word> - not yet implemented.\n".
+-                                                 "track off - not yet implemented.\n".
+-                                                 "untrack all - not yet implemented.\n".
+-                                                 "tracks - not yet implemented.\n".
+-                                                 "tracking - not yet implemented.\n"));
+-      }
++    function execute($channel) {
++        $channel->output($this->user,
++                         _("Commands:\n".
++                           "on - turn on notifications\n".
++                           "off - turn off notifications\n".
++                           "help - show this help\n".
++                           "follow <nickname> - subscribe to user\n".
++                           "leave <nickname> - unsubscribe from user\n".
++                           "d <nickname> <text> - direct message to user\n".
++                           "get <nickname> - get last notice from user\n".
++                           "whois <nickname> - get profile info on user\n".
++                           "fav <nickname> - add user's last notice as a 'fave'\n".
++                           "stats - get your stats\n".
++                           "stop - same as 'off'\n".
++                           "quit - same as 'off'\n".
++                           "sub <nickname> - same as 'follow'\n".
++                           "unsub <nickname> - same as 'leave'\n".
++                           "last <nickname> - same as 'get'\n".
++                           "on <nickname> - not yet implemented.\n".
++                           "off <nickname> - not yet implemented.\n".                           
++                           "nudge <nickname> - not yet implemented.\n".
++                           "invite <phone number> - not yet implemented.\n".
++                           "track <word> - not yet implemented.\n".
++                           "untrack <word> - not yet implemented.\n".
++                           "track off - not yet implemented.\n".
++                           "untrack all - not yet implemented.\n".
++                           "tracks - not yet implemented.\n".
++                           "tracking - not yet implemented.\n"));
++    }
+hunk ./classes/CommandInterpreter.php 25
+-      
+-      function handle_command($user, $text) {
+-              # XXX: localise
++    
++    function handle_command($user, $text) {
++        # XXX: localise
+hunk ./classes/CommandInterpreter.php 29
+-              $text = preg_replace('/\s+/', ' ', trim($text));
+-              list($cmd, $arg) = explode(' ', $text, 2);
++        $text = preg_replace('/\s+/', ' ', trim($text));
++        list($cmd, $arg) = explode(' ', $text, 2);
+hunk ./classes/CommandInterpreter.php 32
+-              # We try to support all the same commands as Twitter, see
+-              # http://getsatisfaction.com/twitter/topics/what_are_the_twitter_commands
+-              # There are a few compatibility commands from earlier versions of 
+-              # Laconica
+-              
+-              switch(strtolower($cmd)) {
+-               case 'help':
+-                      if ($arg) {
+-                              return NULL;
+-                      }
+-                      return new HelpCommand($user);
+-               case 'on':
+-                      if ($arg) {
+-                              list($other, $extra) = explode(' ', $arg, 2);
+-                              if ($extra) {
+-                                      return NULL;
+-                              } else {
+-                                      return new OnCommand($user, $other);
+-                              }
+-                      } else {
+-                              return new OnCommand($user);
+-                      }
+-               case 'off':
+-                      if ($arg) {
+-                              list($other, $extra) = explode(' ', $arg, 2);
+-                              if ($extra) {
+-                                      return NULL;
+-                              } else {
+-                                      return new OffCommand($user, $other);
+-                              }
+-                      } else {
+-                              return new OffCommand($user);
+-                      }
+-               case 'stop':
+-               case 'quit':
+-                      if ($arg) {
+-                              return NULL;
+-                      } else {
+-                              return new OffCommand($user);
+-                      }
+-               case 'follow':
+-               case 'sub':
+-                      if (!$arg) {
+-                              return NULL;
+-                      }
+-                      list($other, $extra) = explode(' ', $arg, 2);
+-                      if ($extra) {
+-                              return NULL;
+-                      } else {
+-                              return new SubCommand($user, $other);
+-                      }
+-               case 'leave':
+-               case 'unsub':
+-                      if (!$arg) {
+-                              return NULL;
+-                      }
+-                      list($other, $extra) = explode(' ', $arg, 2);
+-                      if ($extra) {
+-                              return NULL;
+-                      } else {
+-                              return new UnsubCommand($user, $other);
+-                      }
+-               case 'get':
+-               case 'last':
+-                      if (!$arg) {
+-                              return NULL;
+-                      }
+-                      list($other, $extra) = explode(' ', $arg, 2);
+-                      if ($extra) {
+-                              return NULL;
+-                      } else {
+-                              return new GetCommand($user, $other);
+-                      }
+-               case 'd':
+-                      if (!$arg) {
+-                              return NULL;
+-                      }
+-                      list($other, $extra) = explode(' ', $arg, 2);
+-                      if (!$extra) {
+-                              return NULL;
+-                      } else {
+-                              return new MessageCommand($user, $other, $extra);
+-                      }
+-               case 'whois':
+-                      if (!$arg) {
+-                              return NULL;
+-                      }
+-                      list($other, $extra) = explode(' ', $arg, 2);
+-                      if ($extra) {
+-                              return NULL;
+-                      } else {
+-                              return new WhoisCommand($user, $other);
+-                      }
+-               case 'fav':
+-                      if (!$arg) {
+-                              return NULL;
+-                      }
+-                      list($other, $extra) = explode(' ', $arg, 2);
+-                      if ($extra) {
+-                              return NULL;
+-                      } else {
+-                              return new FavCommand($user, $other);
+-                      }
+-               case 'nudge':
+-                      if (!$arg) {
+-                              return NULL;
+-                      }
+-                      list($other, $extra) = explode(' ', $arg, 2);
+-                      if ($extra) {
+-                              return NULL;
+-                      } else {
+-                              return new NudgeCommand($user, $other);
+-                      }
+-               case 'stats':
+-                      if ($arg) {
+-                              return NULL;
+-                      }
+-                      return new StatsCommand($user);
+-               case 'invite':
+-                      if (!$arg) {
+-                              return NULL;
+-                      }
+-                      list($other, $extra) = explode(' ', $arg, 2);
+-                      if ($extra) {
+-                              return NULL;
+-                      } else {
+-                              return new InviteCommand($user, $other);
+-                      }
+-               case 'track':
+-                      if (!$arg) {
+-                              return NULL;
+-                      }
+-                      list($word, $extra) = explode(' ', $arg, 2);
+-                      if ($extra) {
+-                              return NULL;
+-                      } else if ($word == 'off') {
+-                              return new TrackOffCommand($user);
+-                      } else {
+-                              return new TrackCommand($user, $word);
+-                      }
+-               case 'untrack':
+-                      if (!$arg) {
+-                              return NULL;
+-                      }
+-                      list($word, $extra) = explode(' ', $arg, 2);
+-                      if ($extra) {
+-                              return NULL;
+-                      } else if ($word == 'all') {
+-                              return new TrackOffCommand($user);
+-                      } else {
+-                              return new UntrackCommand($user, $word);
+-                      }
+-               case 'tracks':
+-               case 'tracking':
+-                      if ($arg) {
+-                              return NULL;
+-                      }
+-                      return new TrackingCommand($user);
+-               default:
+-                      return false;
+-              }
+-      }
++        # We try to support all the same commands as Twitter, see
++        # http://getsatisfaction.com/twitter/topics/what_are_the_twitter_commands
++        # There are a few compatibility commands from earlier versions of 
++        # Laconica
++        
++        switch(strtolower($cmd)) {
++         case 'help':
++            if ($arg) {
++                return NULL;
++            }
++            return new HelpCommand($user);
++         case 'on':
++            if ($arg) {
++                list($other, $extra) = explode(' ', $arg, 2);
++                if ($extra) {
++                    return NULL;
++                } else {
++                    return new OnCommand($user, $other);
++                }
++            } else {
++                return new OnCommand($user);
++            }
++         case 'off':
++            if ($arg) {
++                list($other, $extra) = explode(' ', $arg, 2);
++                if ($extra) {
++                    return NULL;
++                } else {
++                    return new OffCommand($user, $other);
++                }
++            } else {
++                return new OffCommand($user);
++            }
++         case 'stop':
++         case 'quit':
++            if ($arg) {
++                return NULL;
++            } else {
++                return new OffCommand($user);
++            }
++         case 'follow':
++         case 'sub':
++            if (!$arg) {
++                return NULL;
++            }
++            list($other, $extra) = explode(' ', $arg, 2);
++            if ($extra) {
++                return NULL;
++            } else {
++                return new SubCommand($user, $other);
++            }
++         case 'leave':
++         case 'unsub':
++            if (!$arg) {
++                return NULL;
++            }
++            list($other, $extra) = explode(' ', $arg, 2);
++            if ($extra) {
++                return NULL;
++            } else {
++                return new UnsubCommand($user, $other);
++            }
++         case 'get':
++         case 'last':
++            if (!$arg) {
++                return NULL;
++            }
++            list($other, $extra) = explode(' ', $arg, 2);
++            if ($extra) {
++                return NULL;
++            } else {
++                return new GetCommand($user, $other);
++            }
++         case 'd':
++            if (!$arg) {
++                return NULL;
++            }
++            list($other, $extra) = explode(' ', $arg, 2);
++            if (!$extra) {
++                return NULL;
++            } else {
++                return new MessageCommand($user, $other, $extra);
++            }
++         case 'whois':
++            if (!$arg) {
++                return NULL;
++            }
++            list($other, $extra) = explode(' ', $arg, 2);
++            if ($extra) {
++                return NULL;
++            } else {
++                return new WhoisCommand($user, $other);
++            }
++         case 'fav':
++            if (!$arg) {
++                return NULL;
++            }
++            list($other, $extra) = explode(' ', $arg, 2);
++            if ($extra) {
++                return NULL;
++            } else {
++                return new FavCommand($user, $other);
++            }
++         case 'nudge':
++            if (!$arg) {
++                return NULL;
++            }
++            list($other, $extra) = explode(' ', $arg, 2);
++            if ($extra) {
++                return NULL;
++            } else {
++                return new NudgeCommand($user, $other);
++            }
++         case 'stats':
++            if ($arg) {
++                return NULL;
++            }
++            return new StatsCommand($user);
++         case 'invite':
++            if (!$arg) {
++                return NULL;
++            }
++            list($other, $extra) = explode(' ', $arg, 2);
++            if ($extra) {
++                return NULL;
++            } else {
++                return new InviteCommand($user, $other);
++            }
++         case 'track':
++            if (!$arg) {
++                return NULL;
++            }
++            list($word, $extra) = explode(' ', $arg, 2);
++            if ($extra) {
++                return NULL;
++            } else if ($word == 'off') {
++                return new TrackOffCommand($user);
++            } else {
++                return new TrackCommand($user, $word);
++            }
++         case 'untrack':
++            if (!$arg) {
++                return NULL;
++            }
++            list($word, $extra) = explode(' ', $arg, 2);
++            if ($extra) {
++                return NULL;
++            } else if ($word == 'all') {
++                return new TrackOffCommand($user);
++            } else {
++                return new UntrackCommand($user, $word);
++            }
++         case 'tracks':
++         case 'tracking':
++            if ($arg) {
++                return NULL;
++            }
++            return new TrackingCommand($user);
++         default:
++            return false;
++        }
++    }
+hunk ./classes/Fave.php 23
+-      static function addNew($user, $notice) {
+-              $fave = new Fave();
+-              $fave->user_id = $user->id;
+-              $fave->notice_id = $notice->id;
+-              if (!$fave->insert()) {
+-                      common_log_db_error($fave, 'INSERT', __FILE__);
+-                      return false;
+-              }
+-              return $fave;
+-      }
+-      
+-      function &pkeyGet($kv) {
+-              return Memcached_DataObject::pkeyGet('Fave', $kv);
+-      }
++    static function addNew($user, $notice) {
++        $fave = new Fave();
++        $fave->user_id = $user->id;
++        $fave->notice_id = $notice->id;
++        if (!$fave->insert()) {
++            common_log_db_error($fave, 'INSERT', __FILE__);
++            return false;
++        }
++        return $fave;
++    }
++    
++    function &pkeyGet($kv) {
++        return Memcached_DataObject::pkeyGet('Fave', $kv);
++    }
+hunk ./classes/Foreign_link.php 29
+-      // XXX:  This only returns a 1->1 single obj mapping.  Change?  Or make
+-      // a getForeignUsers() that returns more than one? --Zach
+-      static function getByUserID($user_id, $service) {
+-              $flink = new Foreign_link();
+-              $flink->service = $service;
+-              $flink->user_id = $user_id;
+-              $flink->limit(1);
++    // XXX:  This only returns a 1->1 single obj mapping.  Change?  Or make
++    // a getForeignUsers() that returns more than one? --Zach
++    static function getByUserID($user_id, $service) {
++        $flink = new Foreign_link();
++        $flink->service = $service;
++        $flink->user_id = $user_id;
++        $flink->limit(1);
+hunk ./classes/Foreign_link.php 37
+-              if ($flink->find(TRUE)) {
+-                      return $flink;
+-              }
++        if ($flink->find(TRUE)) {
++            return $flink;
++        }
+hunk ./classes/Foreign_link.php 41
+-              return NULL;            
+-      }
+-      
+-      static function getByForeignID($foreign_id, $service) {
+-              $flink = new Foreign_link();
+-              $flink->service = $service;
+-              $flink->foreign_id = $foreign_id;
+-              $flink->limit(1);
++        return NULL;        
++    }
++    
++    static function getByForeignID($foreign_id, $service) {
++        $flink = new Foreign_link();
++        $flink->service = $service;
++        $flink->foreign_id = $foreign_id;
++        $flink->limit(1);
+hunk ./classes/Foreign_link.php 50
+-              if ($flink->find(TRUE)) {
+-                      return $flink;
+-              }
++        if ($flink->find(TRUE)) {
++            return $flink;
++        }
+hunk ./classes/Foreign_link.php 54
+-              return NULL;            
+-      }
+-              
+-      # Convenience methods
+-      function getForeignUser() {             
+-              $fuser = new Foreign_user();
+-              $fuser->service = $this->service;
+-              $fuser->id = $this->foreign_id;
+-              
+-              $fuser->limit(1);
+-              
+-              if ($fuser->find(TRUE)) {
+-                      return $fuser;
+-              }
+-              
+-              return NULL;            
+-      }
+-      
+-      function getUser() {
+-              return User::staticGet($this->user_id);
+-      }
+-              
++        return NULL;        
++    }
++        
++    # Convenience methods
++    function getForeignUser() {        
++        $fuser = new Foreign_user();
++        $fuser->service = $this->service;
++        $fuser->id = $this->foreign_id;
++        
++        $fuser->limit(1);
++        
++        if ($fuser->find(TRUE)) {
++            return $fuser;
++        }
++        
++        return NULL;        
++    }
++    
++    function getUser() {
++        return User::staticGet($this->user_id);
++    }
++        
+hunk ./classes/Foreign_user.php 25
+-      
+-      // XXX:  This only returns a 1->1 single obj mapping.  Change?  Or make
+-      // a getForeignUsers() that returns more than one? --Zach
+-      static function getForeignUser($id, $service) {         
+-              $fuser = new Foreign_user();
+-              $fuser->whereAdd("service = $service");
+-              $fuser->whereAdd("id = $id");
+-              $fuser->limit(1);
+-              
+-              if ($fuser->find()) {
+-                      $fuser->fetch();
+-                      return $fuser;
+-              }
+-              
+-              return NULL;            
+-      }
+-      
+-      function updateKeys(&$orig) {
+-              $parts = array();
+-              foreach (array('id', 'service', 'uri', 'nickname') as $k) {
+-                      if (strcmp($this->$k, $orig->$k) != 0) {
+-                              $parts[] = $k . ' = ' . $this->_quote($this->$k);
+-                      }
+-              }
+-              if (count($parts) == 0) {
+-                      # No changes
+-                      return true;
+-              }
+-              $toupdate = implode(', ', $parts);
++    
++    // XXX:  This only returns a 1->1 single obj mapping.  Change?  Or make
++    // a getForeignUsers() that returns more than one? --Zach
++    static function getForeignUser($id, $service) {        
++        $fuser = new Foreign_user();
++        $fuser->whereAdd("service = $service");
++        $fuser->whereAdd("id = $id");
++        $fuser->limit(1);
++        
++        if ($fuser->find()) {
++            $fuser->fetch();
++            return $fuser;
++        }
++        
++        return NULL;        
++    }
++    
++    function updateKeys(&$orig) {
++        $parts = array();
++        foreach (array('id', 'service', 'uri', 'nickname') as $k) {
++            if (strcmp($this->$k, $orig->$k) != 0) {
++                $parts[] = $k . ' = ' . $this->_quote($this->$k);
++            }
++        }
++        if (count($parts) == 0) {
++            # No changes
++            return true;
++        }
++        $toupdate = implode(', ', $parts);
+hunk ./classes/Foreign_user.php 55
+-              $table = $this->tableName();
+-              if(common_config('db','quote_identifiers')) {
+-                      $table = '"' . $table . '"';
+-              }
+-              $qry = 'UPDATE ' . $table . ' SET ' . $toupdate .
+-                ' WHERE id = ' . $this->id;
+-              $orig->decache();
+-              $result = $this->query($qry);
+-              if ($result) {
+-                      $this->encache();
+-              }
+-              return $result;
+-      }
++        $table = $this->tableName();
++        if(common_config('db','quote_identifiers')) {
++            $table = '"' . $table . '"';
++        }
++        $qry = 'UPDATE ' . $table . ' SET ' . $toupdate .
++          ' WHERE id = ' . $this->id;
++        $orig->decache();
++        $result = $this->query($qry);
++        if ($result) {
++            $this->encache();
++        }
++        return $result;
++    }
+hunk ./classes/Foreign_user.php 69
+-      
++    
+hunk ./classes/Memcached_DataObject.php 27
+-              if (is_null($v)) {
+-                      $v = $k;
+-                      # XXX: HACK!
+-                      $i = new $cls;
+-                      $keys = $i->keys();
+-                      $k = $keys[0];
+-                      unset($i);
+-              }
+-              $i = Memcached_DataObject::getcached($cls, $k, $v);
+-              if ($i) {
+-                      return $i;
+-              } else {
+-                      $i = DB_DataObject::staticGet($cls, $k, $v);
+-                      if ($i) {
+-                              $i->encache();
+-                      }
+-                      return $i;
+-              }
+-      }
++        if (is_null($v)) {
++            $v = $k;
++            # XXX: HACK!
++            $i = new $cls;
++            $keys = $i->keys();
++            $k = $keys[0];
++            unset($i);
++        }
++        $i = Memcached_DataObject::getcached($cls, $k, $v);
++        if ($i) {
++            return $i;
++        } else {
++            $i = DB_DataObject::staticGet($cls, $k, $v);
++            if ($i) {
++                $i->encache();
++            }
++            return $i;
++        }
++    }
+hunk ./classes/Memcached_DataObject.php 47
+-      function &pkeyGet($cls, $kv) {
+-              $i = Memcached_DataObject::multicache($cls, $kv);
+-              if ($i) {
+-                      return $i;
+-              } else {
+-                      $i = new $cls();
+-                      foreach ($kv as $k => $v) {
+-                              $i->$k = $v;
+-                      }
+-                      if ($i->find(true)) {
+-                              $i->encache();
+-                      } else {
+-                              $i = NULL;
+-                      }
++    function &pkeyGet($cls, $kv) {
++        $i = Memcached_DataObject::multicache($cls, $kv);
++        if ($i) {
++            return $i;
++        } else {
++            $i = new $cls();
++            foreach ($kv as $k => $v) {
++                $i->$k = $v;
++            }
++            if ($i->find(true)) {
++                $i->encache();
++            } else {
++                $i = NULL;
++            }
+hunk ./classes/Memcached_DataObject.php 62
+-              }
+-      }
++        }
++    }
+hunk ./classes/Memcached_DataObject.php 65
+-      function insert() {
+-              $result = parent::insert();
+-              return $result;
+-      }
+-      
+-      function update($orig=NULL) {
+-              if (is_object($orig) && $orig instanceof Memcached_DataObject) {
+-                      $orig->decache(); # might be different keys
+-              }
+-              $result = parent::update($orig);
+-              if ($result) {
+-                      $this->encache();
+-              }
+-              return $result;
+-      }
+-      
+-      function delete() {
+-              $this->decache(); # while we still have the values!
+-              return parent::delete();
+-      }
+-      
+-      static function memcache() {
+-              return common_memcache();
+-      }
+-      
+-      static function cacheKey($cls, $k, $v) {
+-              return common_cache_key(strtolower($cls).':'.$k.':'.$v);
+-      }
+-      
+-      static function getcached($cls, $k, $v) {
+-              $c = Memcached_DataObject::memcache();
+-              if (!$c) {
+-                      return false;
+-              } else {
+-                      return $c->get(Memcached_DataObject::cacheKey($cls, $k, $v));
+-              }
+-      }
++    function insert() {
++        $result = parent::insert();
++        return $result;
++    }
++    
++    function update($orig=NULL) {
++        if (is_object($orig) && $orig instanceof Memcached_DataObject) {
++            $orig->decache(); # might be different keys
++        }
++        $result = parent::update($orig);
++        if ($result) {
++            $this->encache();
++        }
++        return $result;
++    }
++    
++    function delete() {
++        $this->decache(); # while we still have the values!
++        return parent::delete();
++    }
++    
++    static function memcache() {
++        return common_memcache();
++    }
++    
++    static function cacheKey($cls, $k, $v) {
++        return common_cache_key(strtolower($cls).':'.$k.':'.$v);
++    }
++    
++    static function getcached($cls, $k, $v) {
++        $c = Memcached_DataObject::memcache();
++        if (!$c) {
++            return false;
++        } else {
++            return $c->get(Memcached_DataObject::cacheKey($cls, $k, $v));
++        }
++    }
+hunk ./classes/Memcached_DataObject.php 103
+-      function keyTypes() {
+-              global $_DB_DATAOBJECT;
++    function keyTypes() {
++        global $_DB_DATAOBJECT;
+hunk ./classes/Memcached_DataObject.php 106
+-                      $this->databaseStructure();
++            $this->databaseStructure();
+hunk ./classes/Memcached_DataObject.php 109
+-              return $_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"];
+-      }
+-      
+-      function encache() {
+-              $c = $this->memcache();
+-              if (!$c) {
+-                      return false;
+-              } else {
+-                      $pkey = array();
+-                      $pval = array();                        
+-                      $types = $this->keyTypes();
+-                      ksort($types);
+-                      foreach ($types as $key => $type) {
+-                              if ($type == 'K') {
+-                                      $pkey[] = $key;
+-                                      $pval[] = $this->$key;
+-                              } else {
+-                                      $c->set($this->cacheKey($this->tableName(), $key, $this->$key), $this);
+-                              }
+-                      }
+-                      # XXX: should work for both compound and scalar pkeys
+-                      $pvals = implode(',', $pval);
+-                      $pkeys = implode(',', $pkey);
+-                      $c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this);
+-              }
+-      }
+-      
+-      function decache() {
+-              $c = $this->memcache();
+-              if (!$c) {
+-                      return false;
+-              } else {
+-                      $pkey = array();
+-                      $pval = array();                        
+-                      $types = $this->keyTypes();
+-                      ksort($types);
+-                      foreach ($types as $key => $type) {
+-                              if ($type == 'K') {
+-                                      $pkey[] = $key;
+-                                      $pval[] = $this->$key;
+-                              } else {
+-                                      $c->delete($this->cacheKey($this->tableName(), $key, $this->$key));
+-                              }
+-                      }
+-                      # should work for both compound and scalar pkeys
+-                      # XXX: comma works for now but may not be safe separator for future keys
+-                      $pvals = implode(',', $pval);
+-                      $pkeys = implode(',', $pkey);
+-                      $c->delete($this->cacheKey($this->tableName(), $pkeys, $pvals));
+-              }
+-      }
++        return $_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"];
++    }
++    
++    function encache() {
++        $c = $this->memcache();
++        if (!$c) {
++            return false;
++        } else {
++            $pkey = array();
++            $pval = array();            
++            $types = $this->keyTypes();
++            ksort($types);
++            foreach ($types as $key => $type) {
++                if ($type == 'K') {
++                    $pkey[] = $key;
++                    $pval[] = $this->$key;
++                } else {
++                    $c->set($this->cacheKey($this->tableName(), $key, $this->$key), $this);
++                }
++            }
++            # XXX: should work for both compound and scalar pkeys
++            $pvals = implode(',', $pval);
++            $pkeys = implode(',', $pkey);
++            $c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this);
++        }
++    }
++    
++    function decache() {
++        $c = $this->memcache();
++        if (!$c) {
++            return false;
++        } else {
++            $pkey = array();
++            $pval = array();            
++            $types = $this->keyTypes();
++            ksort($types);
++            foreach ($types as $key => $type) {
++                if ($type == 'K') {
++                    $pkey[] = $key;
++                    $pval[] = $this->$key;
++                } else {
++                    $c->delete($this->cacheKey($this->tableName(), $key, $this->$key));
++                }
++            }
++            # should work for both compound and scalar pkeys
++            # XXX: comma works for now but may not be safe separator for future keys
++            $pvals = implode(',', $pval);
++            $pkeys = implode(',', $pkey);
++            $c->delete($this->cacheKey($this->tableName(), $pkeys, $pvals));
++        }
++    }
+hunk ./classes/Memcached_DataObject.php 161
+-      function multicache($cls, $kv) {
+-              ksort($kv);
+-              $c = Memcached_DataObject::memcache();
+-              if (!$c) {
+-                      return false;
+-              } else {
+-                      $pkeys = implode(',', array_keys($kv));
+-                      $pvals = implode(',', array_values($kv));
+-                      return $c->get(Memcached_DataObject::cacheKey($cls, $pkeys, $pvals));
+-              }
+-      }
++    function multicache($cls, $kv) {
++        ksort($kv);
++        $c = Memcached_DataObject::memcache();
++        if (!$c) {
++            return false;
++        } else {
++            $pkeys = implode(',', array_keys($kv));
++            $pvals = implode(',', array_values($kv));
++            return $c->get(Memcached_DataObject::cacheKey($cls, $pkeys, $pvals));
++        }
++    }
+hunk ./classes/Message.php 29
+-      
+-      function getFrom() {
+-              return Profile::staticGet('id', $this->from_profile);
+-      }
+-      
+-      function getTo() {
+-              return Profile::staticGet('id', $this->to_profile);
+-      }
+-      
+-      static function saveNew($from, $to, $content, $source) {
+-              
+-              $msg = new Message();
+-              
+-              $msg->from_profile = $from;
+-              $msg->to_profile = $to;
+-              $msg->content = common_shorten_links($content);
+-              $msg->rendered = common_render_text($content);
+-              $msg->created = common_sql_now();
+-              $msg->source = $source;
+-              
+-              $result = $msg->insert();
+-              
+-              if (!$result) {
+-                      common_log_db_error($msg, 'INSERT', __FILE__);
+-                      return _('Could not insert message.');
+-              }
+-              
+-              $orig = clone($msg);
+-              $msg->uri = common_local_url('showmessage', array('message' => $msg->id));
+-              
+-              $result = $msg->update($orig);
+-              
+-              if (!$result) {
+-                      common_log_db_error($msg, 'UPDATE', __FILE__);
+-                      return _('Could not update message with new URI.');
+-              }
+-              
+-              return $msg;
+-      }
++    
++    function getFrom() {
++        return Profile::staticGet('id', $this->from_profile);
++    }
++    
++    function getTo() {
++        return Profile::staticGet('id', $this->to_profile);
++    }
++    
++    static function saveNew($from, $to, $content, $source) {
++        
++        $msg = new Message();
++        
++        $msg->from_profile = $from;
++        $msg->to_profile = $to;
++        $msg->content = common_shorten_links($content);
++        $msg->rendered = common_render_text($content);
++        $msg->created = common_sql_now();
++        $msg->source = $source;
++        
++        $result = $msg->insert();
++        
++        if (!$result) {
++            common_log_db_error($msg, 'INSERT', __FILE__);
++            return _('Could not insert message.');
++        }
++        
++        $orig = clone($msg);
++        $msg->uri = common_local_url('showmessage', array('message' => $msg->id));
++        
++        $result = $msg->update($orig);
++        
++        if (!$result) {
++            common_log_db_error($msg, 'UPDATE', __FILE__);
++            return _('Could not update message with new URI.');
++        }
++        
++        return $msg;
++    }
+hunk ./classes/Notice.php 13
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+hunk ./classes/Notice.php 17
+- * along with this program.    If not, see <http://www.gnu.org/licenses/>.
++ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+hunk ./classes/Notice.php 34
+-      ###START_AUTOCODE
+-      /* the code below is auto generated do not remove the above tag */
++    ###START_AUTOCODE
++    /* the code below is auto generated do not remove the above tag */
+hunk ./classes/Notice.php 37
+-      public $__table = 'notice';                                                      // table name
+-      public $id;                                                              // int(4)      primary_key not_null
+-      public $profile_id;                                              // int(4)       not_null
+-      public $uri;                                                     // varchar(255)  unique_key
+-      public $content;                                                 // varchar(140)
+-      public $rendered;                                                // text()
+-      public $url;                                                     // varchar(255)
+-      public $created;                                                 // datetime()   not_null
+-      public $modified;                                                // timestamp()   not_null default_CURRENT_TIMESTAMP
+-      public $reply_to;                                                // int(4)
+-      public $is_local;                                                // tinyint(1)
+-      public $source;                                                  // varchar(32)
++    public $__table = 'notice';                             // table name
++    public $id;                                 // int(4)    primary_key not_null
++    public $profile_id;                         // int(4)     not_null
++    public $uri;                             // varchar(255)  unique_key
++    public $content;                         // varchar(140)
++    public $rendered;                         // text()
++    public $url;                             // varchar(255)
++    public $created;                         // datetime()     not_null
++    public $modified;                         // timestamp()      not_null default_CURRENT_TIMESTAMP
++    public $reply_to;                         // int(4)
++    public $is_local;                         // tinyint(1)
++    public $source;                             // varchar(32)
+hunk ./classes/Notice.php 50
+-      /* Static get */
+-      function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Notice',$k,$v); }
++    /* Static get */
++    function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Notice',$k,$v); }
+hunk ./classes/Notice.php 53
+-      /* the code above is auto generated do not remove the tag below */
+-      ###END_AUTOCODE
++    /* the code above is auto generated do not remove the tag below */
++    ###END_AUTOCODE
+hunk ./classes/Notice.php 56
+-      function getProfile() {
+-              return Profile::staticGet('id', $this->profile_id);
+-      }
++    function getProfile() {
++        return Profile::staticGet('id', $this->profile_id);
++    }
+hunk ./classes/Notice.php 60
+-      function delete() {
+-              $this->blowCaches(true);
+-              $this->blowFavesCache(true);
+-              $this->blowInboxes();
+-              return parent::delete();
+-      }
++    function delete() {
++        $this->blowCaches(true);
++        $this->blowFavesCache(true);
++        $this->blowInboxes();
++        return parent::delete();
++    }
+hunk ./classes/Notice.php 67
+-      function saveTags() {
+-              /* extract all #hastags */
+-              $count = preg_match_all('/(?:^|\s)#([A-Za-z0-9_\-\.]{1,64})/', strtolower($this->content), $match);
+-              if (!$count) {
+-                      return true;
+-              }
++    function saveTags() {
++        /* extract all #hastags */
++        $count = preg_match_all('/(?:^|\s)#([A-Za-z0-9_\-\.]{1,64})/', strtolower($this->content), $match);
++        if (!$count) {
++            return true;
++        }
+hunk ./classes/Notice.php 74
+-              /* elide characters we don't want in the tag */
+-              $match[1] = str_replace(array('-', '_', '.'), '', $match[1]);
++        /* elide characters we don't want in the tag */
++        $match[1] = str_replace(array('-', '_', '.'), '', $match[1]);
+hunk ./classes/Notice.php 77
+-              /* Add them to the database */
+-              foreach(array_unique($match[1]) as $hashtag) {
+-                      $tag = DB_DataObject::factory('Notice_tag');
+-                      $tag->notice_id = $this->id;
+-                      $tag->tag = $hashtag;
+-                      $tag->created = $this->created;
+-                      $id = $tag->insert();
+-                      if (!$id) {
+-                              $last_error = PEAR::getStaticProperty('DB_DataObject','lastError');
+-                              common_log(LOG_ERR, 'DB error inserting hashtag: ' . $last_error->message);
+-                              common_server_error(sprintf(_('DB error inserting hashtag: %s'), $last_error->message));
+-                              return;
+-                      }
+-              }
+-              return true;
+-      }
++        /* Add them to the database */
++        foreach(array_unique($match[1]) as $hashtag) {
++            $tag = DB_DataObject::factory('Notice_tag');
++            $tag->notice_id = $this->id;
++            $tag->tag = $hashtag;
++            $tag->created = $this->created;
++            $id = $tag->insert();
++            if (!$id) {
++                $last_error = PEAR::getStaticProperty('DB_DataObject','lastError');
++                common_log(LOG_ERR, 'DB error inserting hashtag: ' . $last_error->message);
++                common_server_error(sprintf(_('DB error inserting hashtag: %s'), $last_error->message));
++                return;
++            }
++        }
++        return true;
++    }
+hunk ./classes/Notice.php 94
+-      static function saveNew($profile_id, $content, $source=NULL, $is_local=1, $reply_to=NULL, $uri=NULL) {
++    static function saveNew($profile_id, $content, $source=NULL, $is_local=1, $reply_to=NULL, $uri=NULL) {
+hunk ./classes/Notice.php 96
+-              $profile = Profile::staticGet($profile_id);
++        $profile = Profile::staticGet($profile_id);
+hunk ./classes/Notice.php 105
+-                      return _('Too many notices too fast; take a breather and post again in a few minutes.');
++            return _('Too many notices too fast; take a breather and post again in a few minutes.');
+hunk ./classes/Notice.php 108
+-              $banned = common_config('profile', 'banned');
++        $banned = common_config('profile', 'banned');
+hunk ./classes/Notice.php 110
+-              if ( in_array($profile_id, $banned) || in_array($profile->nickname, $banned)) {
+-                      common_log(LOG_WARNING, "Attempted post from banned user: $profile->nickname (user id = $profile_id).");
++        if ( in_array($profile_id, $banned) || in_array($profile->nickname, $banned)) {
++            common_log(LOG_WARNING, "Attempted post from banned user: $profile->nickname (user id = $profile_id).");
+hunk ./classes/Notice.php 113
+-              }
++        }
+hunk ./classes/Notice.php 115
+-              $notice = new Notice();
+-              $notice->profile_id = $profile_id;
++        $notice = new Notice();
++        $notice->profile_id = $profile_id;
+hunk ./classes/Notice.php 118
+-              $blacklist = common_config('public', 'blacklist');
++        $blacklist = common_config('public', 'blacklist');
+hunk ./classes/Notice.php 120
+-              # Blacklisted are non-false, but not 1, either
++        # Blacklisted are non-false, but not 1, either
+hunk ./classes/Notice.php 122
+-              if ($blacklist && in_array($profile_id, $blacklist)) {
+-                      $notice->is_local = -1;
+-              } else {
+-                      $notice->is_local = $is_local;
+-              }
++        if ($blacklist && in_array($profile_id, $blacklist)) {
++            $notice->is_local = -1;
++        } else {
++            $notice->is_local = $is_local;
++        }
+hunk ./classes/Notice.php 128
+-              $notice->reply_to = $reply_to;
+-              $notice->created = common_sql_now();
+-              $notice->content = common_shorten_links($content);
+-              $notice->rendered = common_render_content($notice->content, $notice);
+-              $notice->source = $source;
+-              $notice->uri = $uri;
++        $notice->reply_to = $reply_to;
++        $notice->created = common_sql_now();
++        $notice->content = common_shorten_links($content);
++        $notice->rendered = common_render_content($notice->content, $notice);
++        $notice->source = $source;
++        $notice->uri = $uri;
+hunk ./classes/Notice.php 135
+-              $id = $notice->insert();
++        $id = $notice->insert();
+hunk ./classes/Notice.php 137
+-              if (!$id) {
+-                      common_log_db_error($notice, 'INSERT', __FILE__);
+-                      return _('Problem saving notice.');
+-              }
++        if (!$id) {
++            common_log_db_error($notice, 'INSERT', __FILE__);
++            return _('Problem saving notice.');
++        }
+hunk ./classes/Notice.php 142
+-              # Update the URI after the notice is in the database
+-              if (!$uri) {
+-                      $orig = clone($notice);
+-                      $notice->uri = common_notice_uri($notice);
++        # Update the URI after the notice is in the database
++        if (!$uri) {
++            $orig = clone($notice);
++            $notice->uri = common_notice_uri($notice);
+hunk ./classes/Notice.php 147
+-                      if (!$notice->update($orig)) {
+-                              common_log_db_error($notice, 'UPDATE', __FILE__);
+-                              return _('Problem saving notice.');
+-                      }
+-              }
++            if (!$notice->update($orig)) {
++                common_log_db_error($notice, 'UPDATE', __FILE__);
++                return _('Problem saving notice.');
++            }
++        }
+hunk ./classes/Notice.php 153
+-              # XXX: do we need to change this for remote users?
++        # XXX: do we need to change this for remote users?
+hunk ./classes/Notice.php 155
+-              common_save_replies($notice);
+-              $notice->saveTags();
++        common_save_replies($notice);
++        $notice->saveTags();
+hunk ./classes/Notice.php 158
+-              # Clear the cache for subscribed users, so they'll update at next request
+-              # XXX: someone clever could prepend instead of clearing the cache
++        # Clear the cache for subscribed users, so they'll update at next request
++        # XXX: someone clever could prepend instead of clearing the cache
+hunk ./classes/Notice.php 161
+-              if (common_config('memcached', 'enabled')) {
+-                      $notice->blowCaches();
+-              }
++        if (common_config('memcached', 'enabled')) {
++            $notice->blowCaches();
++        }
+hunk ./classes/Notice.php 165
+-              $notice->addToInboxes();
+-              return $notice;
+-      }
++        $notice->addToInboxes();
++        return $notice;
++    }
+hunk ./classes/Notice.php 187
+-      function blowCaches($blowLast=false) {
+-              $this->blowSubsCache($blowLast);
+-              $this->blowNoticeCache($blowLast);
+-              $this->blowRepliesCache($blowLast);
+-              $this->blowPublicCache($blowLast);
+-              $this->blowTagCache($blowLast);
+-      }
++    function blowCaches($blowLast=false) {
++        $this->blowSubsCache($blowLast);
++        $this->blowNoticeCache($blowLast);
++        $this->blowRepliesCache($blowLast);
++        $this->blowPublicCache($blowLast);
++        $this->blowTagCache($blowLast);
++    }
+hunk ./classes/Notice.php 195
+-      function blowTagCache($blowLast=false) {
+-              $cache = common_memcache();
+-              if ($cache) {
+-                      $tag = new Notice_tag();
+-                      $tag->notice_id = $this->id;
+-                      if ($tag->find()) {
+-                              while ($tag->fetch()) {
+-                                      $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag));
+-                                      if ($blowLast) {
+-                                              $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag . ';last'));
+-                                      }
+-                              }
+-                      }
+-                      $tag->free();
+-                      unset($tag);
+-              }
+-      }
++    function blowTagCache($blowLast=false) {
++        $cache = common_memcache();
++        if ($cache) {
++            $tag = new Notice_tag();
++            $tag->notice_id = $this->id;
++            if ($tag->find()) {
++                while ($tag->fetch()) {
++                    $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag));
++                    if ($blowLast) {
++                        $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag . ';last'));
++                    }
++                }
++            }
++            $tag->free();
++            unset($tag);
++        }
++    }
+hunk ./classes/Notice.php 213
+-      function blowSubsCache($blowLast=false) {
+-              $cache = common_memcache();
+-              if ($cache) {
+-                      $user = new User();
++    function blowSubsCache($blowLast=false) {
++        $cache = common_memcache();
++        if ($cache) {
++            $user = new User();
+hunk ./classes/Notice.php 218
+-                      $user->query('SELECT id ' .
+-                                               'FROM user JOIN subscription ON user.id = subscription.subscriber ' .
+-                                               'WHERE subscription.subscribed = ' . $this->profile_id);
++            $user->query('SELECT id ' .
++                         'FROM user JOIN subscription ON user.id = subscription.subscriber ' .
++                         'WHERE subscription.subscribed = ' . $this->profile_id);
+hunk ./classes/Notice.php 222
+-                      while ($user->fetch()) {
+-                              $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+-                              if ($blowLast) {
+-                                      $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id . ';last'));
+-                              }
+-                      }
+-                      $user->free();
+-                      unset($user);
+-              }
+-      }
++            while ($user->fetch()) {
++                $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
++                if ($blowLast) {
++                    $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id . ';last'));
++                }
++            }
++            $user->free();
++            unset($user);
++        }
++    }
+hunk ./classes/Notice.php 233
+-      function blowNoticeCache($blowLast=false) {
+-              if ($this->is_local) {
+-                      $cache = common_memcache();
+-                      if ($cache) {
+-                              $cache->delete(common_cache_key('profile:notices:'.$this->profile_id));
+-                              if ($blowLast) {
+-                                      $cache->delete(common_cache_key('profile:notices:'.$this->profile_id.';last'));
+-                              }
+-                      }
+-              }
+-      }
++    function blowNoticeCache($blowLast=false) {
++        if ($this->is_local) {
++            $cache = common_memcache();
++            if ($cache) {
++                $cache->delete(common_cache_key('profile:notices:'.$this->profile_id));
++                if ($blowLast) {
++                    $cache->delete(common_cache_key('profile:notices:'.$this->profile_id.';last'));
++                }
++            }
++        }
++    }
+hunk ./classes/Notice.php 245
+-      function blowRepliesCache($blowLast=false) {
+-              $cache = common_memcache();
+-              if ($cache) {
+-                      $reply = new Reply();
+-                      $reply->notice_id = $this->id;
+-                      if ($reply->find()) {
+-                              while ($reply->fetch()) {
+-                                      $cache->delete(common_cache_key('user:replies:'.$reply->profile_id));
+-                                      if ($blowLast) {
+-                                              $cache->delete(common_cache_key('user:replies:'.$reply->profile_id.';last'));
+-                                      }
+-                              }
+-                      }
+-                      $reply->free();
+-                      unset($reply);
+-              }
+-      }
++    function blowRepliesCache($blowLast=false) {
++        $cache = common_memcache();
++        if ($cache) {
++            $reply = new Reply();
++            $reply->notice_id = $this->id;
++            if ($reply->find()) {
++                while ($reply->fetch()) {
++                    $cache->delete(common_cache_key('user:replies:'.$reply->profile_id));
++                    if ($blowLast) {
++                        $cache->delete(common_cache_key('user:replies:'.$reply->profile_id.';last'));
++                    }
++                }
++            }
++            $reply->free();
++            unset($reply);
++        }
++    }
+hunk ./classes/Notice.php 263
+-      function blowPublicCache($blowLast=false) {
+-              if ($this->is_local == 1) {
+-                      $cache = common_memcache();
+-                      if ($cache) {
+-                              $cache->delete(common_cache_key('public'));
+-                              if ($blowLast) {
+-                                      $cache->delete(common_cache_key('public').';last');
+-                              }
+-                      }
+-              }
+-      }
++    function blowPublicCache($blowLast=false) {
++        if ($this->is_local == 1) {
++            $cache = common_memcache();
++            if ($cache) {
++                $cache->delete(common_cache_key('public'));
++                if ($blowLast) {
++                    $cache->delete(common_cache_key('public').';last');
++                }
++            }
++        }
++    }
+hunk ./classes/Notice.php 275
+-      function blowFavesCache($blowLast=false) {
+-              $cache = common_memcache();
+-              if ($cache) {
+-                      $fave = new Fave();
+-                      $fave->notice_id = $this->id;
+-                      if ($fave->find()) {
+-                              while ($fave->fetch()) {
+-                                      $cache->delete(common_cache_key('user:faves:'.$fave->user_id));
+-                                      if ($blowLast) {
+-                                              $cache->delete(common_cache_key('user:faves:'.$fave->user_id.';last'));
+-                                      }
+-                              }
+-                      }
+-                      $fave->free();
+-                      unset($fave);
+-              }
+-      }
++    function blowFavesCache($blowLast=false) {
++        $cache = common_memcache();
++        if ($cache) {
++            $fave = new Fave();
++            $fave->notice_id = $this->id;
++            if ($fave->find()) {
++                while ($fave->fetch()) {
++                    $cache->delete(common_cache_key('user:faves:'.$fave->user_id));
++                    if ($blowLast) {
++                        $cache->delete(common_cache_key('user:faves:'.$fave->user_id.';last'));
++                    }
++                }
++            }
++            $fave->free();
++            unset($fave);
++        }
++    }
+hunk ./classes/Notice.php 293
+-      # XXX: too many args; we need to move to named params or even a separate
+-      # class for notice streams
++    # XXX: too many args; we need to move to named params or even a separate
++    # class for notice streams
+hunk ./classes/Notice.php 296
+-      static function getStream($qry, $cachekey, $offset=0, $limit=20, $since_id=0, $before_id=0, $order=NULL, $since=NULL) {
++    static function getStream($qry, $cachekey, $offset=0, $limit=20, $since_id=0, $before_id=0, $order=NULL, $since=NULL) {
+hunk ./classes/Notice.php 298
+-              if (common_config('memcached', 'enabled')) {
++        if (common_config('memcached', 'enabled')) {
+hunk ./classes/Notice.php 300
+-                      # Skip the cache if this is a since, since_id or before_id qry
+-                      if ($since_id > 0 || $before_id > 0 || $since) {
+-                              return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
+-                      } else {
+-                              return Notice::getCachedStream($qry, $cachekey, $offset, $limit, $order);
+-                      }
+-              }
++            # Skip the cache if this is a since, since_id or before_id qry
++            if ($since_id > 0 || $before_id > 0 || $since) {
++                return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
++            } else {
++                return Notice::getCachedStream($qry, $cachekey, $offset, $limit, $order);
++            }
++        }
+hunk ./classes/Notice.php 308
+-              return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
+-      }
++        return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
++    }
+hunk ./classes/Notice.php 311
+-      static function getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since) {
++    static function getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since) {
+hunk ./classes/Notice.php 313
+-              $needAnd = FALSE;
+-              $needWhere = TRUE;
++        $needAnd = FALSE;
++        $needWhere = TRUE;
+hunk ./classes/Notice.php 316
+-              if (preg_match('/\bWHERE\b/i', $qry)) {
+-                      $needWhere = FALSE;
+-                      $needAnd = TRUE;
+-              }
++        if (preg_match('/\bWHERE\b/i', $qry)) {
++            $needWhere = FALSE;
++            $needAnd = TRUE;
++        }
+hunk ./classes/Notice.php 321
+-              if ($since_id > 0) {
++        if ($since_id > 0) {
+hunk ./classes/Notice.php 323
+-                      if ($needWhere) {
+-                              $qry .= ' WHERE ';
+-                              $needWhere = FALSE;
+-                      } else {
+-                              $qry .= ' AND ';
+-                      }
++            if ($needWhere) {
++                $qry .= ' WHERE ';
++                $needWhere = FALSE;
++            } else {
++                $qry .= ' AND ';
++            }
+hunk ./classes/Notice.php 330
+-                      $qry .= ' notice.id > ' . $since_id;
+-              }
++            $qry .= ' notice.id > ' . $since_id;
++        }
+hunk ./classes/Notice.php 333
+-              if ($before_id > 0) {
++        if ($before_id > 0) {
+hunk ./classes/Notice.php 335
+-                      if ($needWhere) {
+-                              $qry .= ' WHERE ';
+-                              $needWhere = FALSE;
+-                      } else {
+-                              $qry .= ' AND ';
+-                      }
++            if ($needWhere) {
++                $qry .= ' WHERE ';
++                $needWhere = FALSE;
++            } else {
++                $qry .= ' AND ';
++            }
+hunk ./classes/Notice.php 342
+-                      $qry .= ' notice.id < ' . $before_id;
+-              }
++            $qry .= ' notice.id < ' . $before_id;
++        }
+hunk ./classes/Notice.php 345
+-              if ($since) {
++        if ($since) {
+hunk ./classes/Notice.php 347
+-                      if ($needWhere) {
+-                              $qry .= ' WHERE ';
+-                              $needWhere = FALSE;
+-                      } else {
+-                              $qry .= ' AND ';
+-                      }
++            if ($needWhere) {
++                $qry .= ' WHERE ';
++                $needWhere = FALSE;
++            } else {
++                $qry .= ' AND ';
++            }
+hunk ./classes/Notice.php 354
+-                      $qry .= ' notice.created > \'' . date('Y-m-d H:i:s', $since) . '\'';
+-              }
++            $qry .= ' notice.created > \'' . date('Y-m-d H:i:s', $since) . '\'';
++        }
+hunk ./classes/Notice.php 357
+-              # Allow ORDER override
++        # Allow ORDER override
+hunk ./classes/Notice.php 359
+-              if ($order) {
+-                      $qry .= $order;
+-              } else {
+-                      $qry .= ' ORDER BY notice.created DESC, notice.id DESC ';
+-              }
++        if ($order) {
++            $qry .= $order;
++        } else {
++            $qry .= ' ORDER BY notice.created DESC, notice.id DESC ';
++        }
+hunk ./classes/Notice.php 365
+-              if (common_config('db','type') == 'pgsql') {
+-                      $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+-              } else {
+-                      $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+-              }
++        if (common_config('db','type') == 'pgsql') {
++            $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
++        } else {
++            $qry .= ' LIMIT ' . $offset . ', ' . $limit;
++        }
+hunk ./classes/Notice.php 371
+-              $notice = new Notice();
++        $notice = new Notice();
+hunk ./classes/Notice.php 373
+-              $notice->query($qry);
++        $notice->query($qry);
+hunk ./classes/Notice.php 375
+-              return $notice;
+-      }
++        return $notice;
++    }
+hunk ./classes/Notice.php 378
+-      # XXX: this is pretty long and should probably be broken up into
+-      # some helper functions
++    # XXX: this is pretty long and should probably be broken up into
++    # some helper functions
+hunk ./classes/Notice.php 381
+-      static function getCachedStream($qry, $cachekey, $offset, $limit, $order) {
++    static function getCachedStream($qry, $cachekey, $offset, $limit, $order) {
+hunk ./classes/Notice.php 383
+-              # If outside our cache window, just go to the DB
++        # If outside our cache window, just go to the DB
+hunk ./classes/Notice.php 385
+-              if ($offset + $limit > NOTICE_CACHE_WINDOW) {
+-                      return Notice::getStreamDirect($qry, $offset, $limit, NULL, NULL, $order, NULL);
+-              }
++        if ($offset + $limit > NOTICE_CACHE_WINDOW) {
++            return Notice::getStreamDirect($qry, $offset, $limit, NULL, NULL, $order, NULL);
++        }
+hunk ./classes/Notice.php 389
+-              # Get the cache; if we can't, just go to the DB
++        # Get the cache; if we can't, just go to the DB
+hunk ./classes/Notice.php 391
+-              $cache = common_memcache();
++        $cache = common_memcache();
+hunk ./classes/Notice.php 393
+-              if (!$cache) {
+-                      return Notice::getStreamDirect($qry, $offset, $limit, NULL, NULL, $order, NULL);
+-              }
++        if (!$cache) {
++            return Notice::getStreamDirect($qry, $offset, $limit, NULL, NULL, $order, NULL);
++        }
+hunk ./classes/Notice.php 397
+-              # Get the notices out of the cache
++        # Get the notices out of the cache
+hunk ./classes/Notice.php 399
+-              $notices = $cache->get(common_cache_key($cachekey));
++        $notices = $cache->get(common_cache_key($cachekey));
+hunk ./classes/Notice.php 401
+-              # On a cache hit, return a DB-object-like wrapper
++        # On a cache hit, return a DB-object-like wrapper
+hunk ./classes/Notice.php 403
+-              if ($notices !== FALSE) {
+-                      $wrapper = new NoticeWrapper(array_slice($notices, $offset, $limit));
+-                      return $wrapper;
+-              }
++        if ($notices !== FALSE) {
++            $wrapper = new NoticeWrapper(array_slice($notices, $offset, $limit));
++            return $wrapper;
++        }
+hunk ./classes/Notice.php 408
+-              # If the cache was invalidated because of new data being
+-              # added, we can try and just get the new stuff. We keep an additional
+-              # copy of the data at the key + ';last'
++        # If the cache was invalidated because of new data being
++        # added, we can try and just get the new stuff. We keep an additional
++        # copy of the data at the key + ';last'
+hunk ./classes/Notice.php 412
+-              # No cache hit. Try to get the *last* cached version
++        # No cache hit. Try to get the *last* cached version
+hunk ./classes/Notice.php 414
+-              $last_notices = $cache->get(common_cache_key($cachekey) . ';last');
++        $last_notices = $cache->get(common_cache_key($cachekey) . ';last');
+hunk ./classes/Notice.php 416
+-              if ($last_notices) {
++        if ($last_notices) {
+hunk ./classes/Notice.php 418
+-                      # Reverse-chron order, so last ID is last.
++            # Reverse-chron order, so last ID is last.
+hunk ./classes/Notice.php 420
+-                      $last_id = $last_notices[0]->id;
++            $last_id = $last_notices[0]->id;
+hunk ./classes/Notice.php 422
+-                      # XXX: this assumes monotonically increasing IDs; a fair
+-                      # bet with our DB.
++            # XXX: this assumes monotonically increasing IDs; a fair
++            # bet with our DB.
+hunk ./classes/Notice.php 425
+-                      $new_notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW,
+-                                                                                                $last_id, NULL, $order, NULL);
++            $new_notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW,
++                                                  $last_id, NULL, $order, NULL);
+hunk ./classes/Notice.php 428
+-                      if ($new_notice) {
+-                              $new_notices = array();
+-                              while ($new_notice->fetch()) {
+-                                      $new_notices[] = clone($new_notice);
+-                              }
+-                              $new_notice->free();
+-                              $notices = array_slice(array_merge($new_notices, $last_notices),
+-                                                                         0, NOTICE_CACHE_WINDOW);
++            if ($new_notice) {
++                $new_notices = array();
++                while ($new_notice->fetch()) {
++                    $new_notices[] = clone($new_notice);
++                }
++                $new_notice->free();
++                $notices = array_slice(array_merge($new_notices, $last_notices),
++                                       0, NOTICE_CACHE_WINDOW);
+hunk ./classes/Notice.php 437
+-                              # Store the array in the cache for next time
++                # Store the array in the cache for next time
+hunk ./classes/Notice.php 439
+-                              $result = $cache->set(common_cache_key($cachekey), $notices);
+-                              $result = $cache->set(common_cache_key($cachekey) . ';last', $notices);
++                $result = $cache->set(common_cache_key($cachekey), $notices);
++                $result = $cache->set(common_cache_key($cachekey) . ';last', $notices);
+hunk ./classes/Notice.php 442
+-                              # return a wrapper of the array for use now
++                # return a wrapper of the array for use now
+hunk ./classes/Notice.php 444
+-                              return new NoticeWrapper(array_slice($notices, $offset, $limit));
+-                      }
+-              }
++                return new NoticeWrapper(array_slice($notices, $offset, $limit));
++            }
++        }
+hunk ./classes/Notice.php 448
+-              # Otherwise, get the full cache window out of the DB
++        # Otherwise, get the full cache window out of the DB
+hunk ./classes/Notice.php 450
+-              $notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW, NULL, NULL, $order, NULL);
++        $notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW, NULL, NULL, $order, NULL);
+hunk ./classes/Notice.php 452
+-              # If there are no hits, just return the value
++        # If there are no hits, just return the value
+hunk ./classes/Notice.php 454
+-              if (!$notice) {
+-                      return $notice;
+-              }
++        if (!$notice) {
++            return $notice;
++        }
+hunk ./classes/Notice.php 458
+-              # Pack results into an array
++        # Pack results into an array
+hunk ./classes/Notice.php 460
+-              $notices = array();
++        $notices = array();
+hunk ./classes/Notice.php 462
+-              while ($notice->fetch()) {
+-                      $notices[] = clone($notice);
+-              }
++        while ($notice->fetch()) {
++            $notices[] = clone($notice);
++        }
+hunk ./classes/Notice.php 466
+-              $notice->free();
++        $notice->free();
+hunk ./classes/Notice.php 468
+-              # Store the array in the cache for next time
++        # Store the array in the cache for next time
+hunk ./classes/Notice.php 470
+-              $result = $cache->set(common_cache_key($cachekey), $notices);
+-              $result = $cache->set(common_cache_key($cachekey) . ';last', $notices);
++        $result = $cache->set(common_cache_key($cachekey), $notices);
++        $result = $cache->set(common_cache_key($cachekey) . ';last', $notices);
+hunk ./classes/Notice.php 473
+-              # return a wrapper of the array for use now
++        # return a wrapper of the array for use now
+hunk ./classes/Notice.php 475
+-              $wrapper = new NoticeWrapper(array_slice($notices, $offset, $limit));
++        $wrapper = new NoticeWrapper(array_slice($notices, $offset, $limit));
+hunk ./classes/Notice.php 477
+-              return $wrapper;
+-      }
++        return $wrapper;
++    }
+hunk ./classes/Notice.php 480
+-      function publicStream($offset=0, $limit=20, $since_id=0, $before_id=0, $since=NULL) {
++    function publicStream($offset=0, $limit=20, $since_id=0, $before_id=0, $since=NULL) {
+hunk ./classes/Notice.php 482
+-              $parts = array();
++        $parts = array();
+hunk ./classes/Notice.php 484
+-              $qry = 'SELECT * FROM notice ';
++        $qry = 'SELECT * FROM notice ';
+hunk ./classes/Notice.php 486
+-              if (common_config('public', 'localonly')) {
+-                      $parts[] = 'is_local = 1';
+-              } else {
+-                      # -1 == blacklisted
+-                      $parts[] = 'is_local != -1';
+-              }
++        if (common_config('public', 'localonly')) {
++            $parts[] = 'is_local = 1';
++        } else {
++            # -1 == blacklisted
++            $parts[] = 'is_local != -1';
++        }
+hunk ./classes/Notice.php 493
+-              if ($parts) {
+-                      $qry .= ' WHERE ' . implode(' AND ', $parts);
+-              }
++        if ($parts) {
++            $qry .= ' WHERE ' . implode(' AND ', $parts);
++        }
+hunk ./classes/Notice.php 497
+-              return Notice::getStream($qry,
+-                                                               'public',
+-                                                               $offset, $limit, $since_id, $before_id, NULL, $since);
+-      }
++        return Notice::getStream($qry,
++                                 'public',
++                                 $offset, $limit, $since_id, $before_id, NULL, $since);
++    }
+hunk ./classes/Notice.php 502
+-      function addToInboxes() {
+-              $enabled = common_config('inboxes', 'enabled');
++    function addToInboxes() {
++        $enabled = common_config('inboxes', 'enabled');
+hunk ./classes/Notice.php 505
+-              if ($enabled === true || $enabled === 'transitional') {
+-                      $inbox = new Notice_inbox();
+-                      $qry = 'INSERT INTO notice_inbox (user_id, notice_id, created) ' .
+-                        'SELECT user.id, ' . $this->id . ', "' . $this->created . '" ' .
+-                        'FROM user JOIN subscription ON user.id = subscription.subscriber ' .
+-                        'WHERE subscription.subscribed = ' . $this->profile_id . ' ' .
+-                        'AND NOT EXISTS (SELECT user_id, notice_id ' .
+-                        'FROM notice_inbox ' .
+-                        'WHERE user_id = user.id ' .
+-                        'AND notice_id = ' . $this->id . ' )';
+-                      if ($enabled === 'transitional') {
+-                              $qry .= ' AND user.inboxed = 1';
+-                      }
+-                      $inbox->query($qry);
+-              }
+-              return;
+-      }
++        if ($enabled === true || $enabled === 'transitional') {
++            $inbox = new Notice_inbox();
++            $qry = 'INSERT INTO notice_inbox (user_id, notice_id, created) ' .
++              'SELECT user.id, ' . $this->id . ', "' . $this->created . '" ' .
++              'FROM user JOIN subscription ON user.id = subscription.subscriber ' .
++              'WHERE subscription.subscribed = ' . $this->profile_id . ' ' .
++              'AND NOT EXISTS (SELECT user_id, notice_id ' .
++              'FROM notice_inbox ' .
++              'WHERE user_id = user.id ' .
++              'AND notice_id = ' . $this->id . ' )';
++            if ($enabled === 'transitional') {
++                $qry .= ' AND user.inboxed = 1';
++            }
++            $inbox->query($qry);
++        }
++        return;
++    }
+hunk ./classes/Notice.php 523
+-      # Delete from inboxes if we're deleted.
++    # Delete from inboxes if we're deleted.
+hunk ./classes/Notice.php 525
+-      function blowInboxes() {
++    function blowInboxes() {
+hunk ./classes/Notice.php 527
+-              $enabled = common_config('inboxes', 'enabled');
++        $enabled = common_config('inboxes', 'enabled');
+hunk ./classes/Notice.php 529
+-              if ($enabled === true || $enabled === 'transitional') {
+-                      $inbox = new Notice_inbox();
+-                      $inbox->notice_id = $this->id;
+-                      $inbox->delete();
+-              }
++        if ($enabled === true || $enabled === 'transitional') {
++            $inbox = new Notice_inbox();
++            $inbox->notice_id = $this->id;
++            $inbox->delete();
++        }
+hunk ./classes/Notice.php 535
+-              return;
+-      }
++        return;
++    }
+hunk ./classes/NoticeWrapper.php 38
+-      var $notices = NULL;
+-      var $i = -1;
+-      
+-      function __construct($arr) {
+-              $this->notices = $arr;
+-      }
+-      
+-      function fetch() {
+-              static $fields = array('id', 'profile_id', 'uri', 'content', 'rendered',
+-                                                         'url', 'created', 'modified', 'reply_to', 'is_local', 'source');
+-              $this->i++;
+-              if ($this->i >= count($this->notices)) {
+-                      return false;
+-              } else {
+-                      $n = $this->notices[$this->i];
+-                      foreach ($fields as $f) {
+-                              $this->$f = $n->$f;
+-                      }
+-                      return true;
+-              }
+-      }
++    var $notices = NULL;
++    var $i = -1;
++    
++    function __construct($arr) {
++        $this->notices = $arr;
++    }
++    
++    function fetch() {
++        static $fields = array('id', 'profile_id', 'uri', 'content', 'rendered',
++                               'url', 'created', 'modified', 'reply_to', 'is_local', 'source');
++        $this->i++;
++        if ($this->i >= count($this->notices)) {
++            return false;
++        } else {
++            $n = $this->notices[$this->i];
++            foreach ($fields as $f) {
++                $this->$f = $n->$f;
++            }
++            return true;
++        }
++    }
+hunk ./classes/Notice_tag.php 37
+-      
+-      static function getStream($tag, $offset=0, $limit=20) {
+-              $qry = 
+-                'SELECT notice.* ' .
+-                'FROM notice JOIN notice_tag ON notice.id = notice_tag.notice_id ' .
+-                'WHERE notice_tag.tag = "%s" ';
++    
++    static function getStream($tag, $offset=0, $limit=20) {
++        $qry = 
++          'SELECT notice.* ' .
++          'FROM notice JOIN notice_tag ON notice.id = notice_tag.notice_id ' .
++          'WHERE notice_tag.tag = "%s" ';
+hunk ./classes/Notice_tag.php 44
+-              return Notice::getStream(sprintf($qry, $tag),
+-                                                               'notice_tag:notice_stream:' . common_keyize($tag),
+-                                                               $offset, $limit);
+-      }
+-      
+-      function blowCache() {
+-              $cache = common_memcache();
+-              if ($cache) {
+-                      $cache->delete(common_cache_key('notice_tag:notice_stream:' . $this->tag));
+-              }
+-      }
++        return Notice::getStream(sprintf($qry, $tag),
++                                 'notice_tag:notice_stream:' . common_keyize($tag),
++                                 $offset, $limit);
++    }
++    
++    function blowCache() {
++        $cache = common_memcache();
++        if ($cache) {
++            $cache->delete(common_cache_key('notice_tag:notice_stream:' . $this->tag));
++        }
++    }
+hunk ./classes/Profile.php 49
+-      function getAvatar($width, $height=NULL) {
+-              if (is_null($height)) {
+-                      $height = $width;
+-              }
+-              return Avatar::pkeyGet(array('profile_id' => $this->id,
+-                                                                       'width' => $width,
+-                                                                       'height' => $height));
+-      }
++    function getAvatar($width, $height=NULL) {
++        if (is_null($height)) {
++            $height = $width;
++        }
++        return Avatar::pkeyGet(array('profile_id' => $this->id,
++                                     'width' => $width,
++                                     'height' => $height));
++    }
+hunk ./classes/Profile.php 58
+-      function getOriginalAvatar() {
+-              $avatar = DB_DataObject::factory('avatar');
+-              $avatar->profile_id = $this->id;
+-              $avatar->original = true;
+-              if ($avatar->find(true)) {
+-                      return $avatar;
+-              } else {
+-                      return NULL;
+-              }
+-      }
++    function getOriginalAvatar() {
++        $avatar = DB_DataObject::factory('avatar');
++        $avatar->profile_id = $this->id;
++        $avatar->original = true;
++        if ($avatar->find(true)) {
++            return $avatar;
++        } else {
++            return NULL;
++        }
++    }
+hunk ./classes/Profile.php 69
+-      function setOriginal($source) {
++    function setOriginal($source) {
+hunk ./classes/Profile.php 71
+-              $info = @getimagesize($source);
++        $info = @getimagesize($source);
+hunk ./classes/Profile.php 73
+-              if (!$info) {
+-                      return NULL;
+-              }
++        if (!$info) {
++            return NULL;
++        }
+hunk ./classes/Profile.php 77
+-              $filename = common_avatar_filename($this->id,
+-                                                                                 image_type_to_extension($info[2]),
+-                                                                                 NULL, common_timestamp());
+-              $filepath = common_avatar_path($filename);
++        $filename = common_avatar_filename($this->id,
++                                           image_type_to_extension($info[2]),
++                                           NULL, common_timestamp());
++        $filepath = common_avatar_path($filename);
+hunk ./classes/Profile.php 82
+-              copy($source, $filepath);
++        copy($source, $filepath);
+hunk ./classes/Profile.php 84
+-              $avatar = new Avatar();
++        $avatar = new Avatar();
+hunk ./classes/Profile.php 86
+-              $avatar->profile_id = $this->id;
+-              $avatar->width = $info[0];
+-              $avatar->height = $info[1];
+-              $avatar->mediatype = image_type_to_mime_type($info[2]);
+-              $avatar->filename = $filename;
+-              $avatar->original = true;
+-              $avatar->url = common_avatar_url($filename);
+-              $avatar->created = DB_DataObject_Cast::dateTime(); # current time
++        $avatar->profile_id = $this->id;
++        $avatar->width = $info[0];
++        $avatar->height = $info[1];
++        $avatar->mediatype = image_type_to_mime_type($info[2]);
++        $avatar->filename = $filename;
++        $avatar->original = true;
++        $avatar->url = common_avatar_url($filename);
++        $avatar->created = DB_DataObject_Cast::dateTime(); # current time
+hunk ./classes/Profile.php 95
+-              # XXX: start a transaction here
++        # XXX: start a transaction here
+hunk ./classes/Profile.php 97
+-              if (!$this->delete_avatars()) {
+-                      @unlink($filepath);
+-                      return NULL;
+-              }
++        if (!$this->delete_avatars()) {
++            @unlink($filepath);
++            return NULL;
++        }
+hunk ./classes/Profile.php 102
+-              if (!$avatar->insert()) {
+-                      @unlink($filepath);
+-                      return NULL;
+-              }
++        if (!$avatar->insert()) {
++            @unlink($filepath);
++            return NULL;
++        }
+hunk ./classes/Profile.php 107
+-              foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
+-                      # We don't do a scaled one if original is our scaled size
+-                      if (!($avatar->width == $size && $avatar->height == $size)) {
+-                              $s = $avatar->scale($size);
+-                              if (!$s) {
+-                                      return NULL;
+-                              }
+-                      }
+-              }
++        foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
++            # We don't do a scaled one if original is our scaled size
++            if (!($avatar->width == $size && $avatar->height == $size)) {
++                $s = $avatar->scale($size);
++                if (!$s) {
++                    return NULL;
++                }
++            }
++        }
+hunk ./classes/Profile.php 117
+-              return $avatar;
+-      }
++        return $avatar;
++    }
+hunk ./classes/Profile.php 120
+-      function delete_avatars() {
+-              $avatar = new Avatar();
+-              $avatar->profile_id = $this->id;
+-              $avatar->find();
+-              while ($avatar->fetch()) {
+-                      $avatar->delete();
+-              }
+-              return true;
+-      }
++    function delete_avatars() {
++        $avatar = new Avatar();
++        $avatar->profile_id = $this->id;
++        $avatar->find();
++        while ($avatar->fetch()) {
++            $avatar->delete();
++        }
++        return true;
++    }
+hunk ./classes/Profile.php 130
+-      function getBestName() {
+-              return ($this->fullname) ? $this->fullname : $this->nickname;
+-      }
++    function getBestName() {
++        return ($this->fullname) ? $this->fullname : $this->nickname;
++    }
+hunk ./classes/Profile.php 135
+-      function getCurrentNotice($dt=NULL) {
+-              $notice = new Notice();
+-              $notice->profile_id = $this->id;
+-              if ($dt) {
+-                      $notice->whereAdd('created < "' . $dt . '"');
+-              }
+-              $notice->orderBy('created DESC, notice.id DESC');
+-              $notice->limit(1);
+-              if ($notice->find(true)) {
+-                      return $notice;
+-              }
+-              return NULL;
+-      }
++    function getCurrentNotice($dt=NULL) {
++        $notice = new Notice();
++        $notice->profile_id = $this->id;
++        if ($dt) {
++            $notice->whereAdd('created < "' . $dt . '"');
++        }
++        $notice->orderBy('created DESC, notice.id DESC');
++        $notice->limit(1);
++        if ($notice->find(true)) {
++            return $notice;
++        }
++        return NULL;
++    }
+hunk ./classes/Profile.php 149
+-      function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
+-              $qry =
+-                'SELECT * ' .
+-                'FROM notice ' .
+-                'WHERE profile_id = %d ';
++    function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
++        $qry =
++          'SELECT * ' .
++          'FROM notice ' .
++          'WHERE profile_id = %d ';
+hunk ./classes/Profile.php 155
+-              return Notice::getStream(sprintf($qry, $this->id),
+-                                                               'profile:notices:'.$this->id,
+-                                                               $offset, $limit, $since_id, $before_id);
+-      }
++        return Notice::getStream(sprintf($qry, $this->id),
++                                 'profile:notices:'.$this->id,
++                                 $offset, $limit, $since_id, $before_id);
++    }
+hunk ./classes/Profile_tag.php 24
+-      static function getTags($tagger, $tagged) {
+-              
+-              $tags = array();
++    static function getTags($tagger, $tagged) {
++        
++        $tags = array();
+hunk ./classes/Profile_tag.php 28
+-              # XXX: store this in memcached
+-              
+-              $profile_tag = new Profile_tag();
+-              $profile_tag->tagger = $tagger;
+-              $profile_tag->tagged = $tagged;
+-              
+-              $profile_tag->find();
+-              
+-              while ($profile_tag->fetch()) {
+-                      $tags[] = $profile_tag->tag;
+-              }
+-              
+-              $profile_tag->free();
+-              
+-              return $tags;
+-      }
+-      
+-      static function setTags($tagger, $tagged, $newtags) {
+-              
+-              $oldtags = Profile_tag::getTags($tagger, $tagged);
+-              
+-              # Delete stuff that's old that not in new
+-              
+-              $to_delete = array_diff($oldtags, $newtags);
+-              
+-              # Insert stuff that's in new and not in old
+-              
+-              $to_insert = array_diff($newtags, $oldtags);
+-              
+-              $profile_tag = new Profile_tag();
+-              
+-              $profile_tag->tagger = $tagger;
+-              $profile_tag->tagged = $tagged;
+-              
+-              $profile_tag->query('BEGIN');
+-              
+-              foreach ($to_delete as $deltag) {
+-                      $profile_tag->tag = $deltag;
+-                      $result = $profile_tag->delete();
+-                      if (!$result) {
+-                              common_log_db_error($profile_tag, 'DELETE', __FILE__);
+-                              return false;
+-                      }
+-              }
+-              
+-              foreach ($to_insert as $instag) {
+-                      $profile_tag->tag = $instag;
+-                      $result = $profile_tag->insert();
+-                      if (!$result) {
+-                              common_log_db_error($profile_tag, 'INSERT', __FILE__);
+-                              return false;
+-                      }
+-              }
+-              
+-              $profile_tag->query('COMMIT');
+-              
+-              return true;
+-      }
+-      
+-      # Return profiles with a given tag
+-      static function getTagged($tagger, $tag) {
+-              $profile = new Profile();
+-              $profile->query('SELECT profile.* ' .
+-                                              'FROM profile JOIN profile_tag ' .
+-                                              'ON profile.id = profile_tag.tagged ' .
+-                                              'WHERE profile_tag.tagger = ' . $tagger . ' ' .
+-                                              'AND profile_tag.tag = "' . $tag . '" ');
+-              $tagged = array();
+-              while ($profile->fetch()) {
+-                      $tagged[] = clone($profile);
+-              }
+-              return $tagged;
+-      }
++        # XXX: store this in memcached
++        
++        $profile_tag = new Profile_tag();
++        $profile_tag->tagger = $tagger;
++        $profile_tag->tagged = $tagged;
++        
++        $profile_tag->find();
++        
++        while ($profile_tag->fetch()) {
++            $tags[] = $profile_tag->tag;
++        }
++        
++        $profile_tag->free();
++        
++        return $tags;
++    }
++    
++    static function setTags($tagger, $tagged, $newtags) {
++        
++        $oldtags = Profile_tag::getTags($tagger, $tagged);
++        
++        # Delete stuff that's old that not in new
++        
++        $to_delete = array_diff($oldtags, $newtags);
++        
++        # Insert stuff that's in new and not in old
++        
++        $to_insert = array_diff($newtags, $oldtags);
++        
++        $profile_tag = new Profile_tag();
++        
++        $profile_tag->tagger = $tagger;
++        $profile_tag->tagged = $tagged;
++        
++        $profile_tag->query('BEGIN');
++        
++        foreach ($to_delete as $deltag) {
++            $profile_tag->tag = $deltag;
++            $result = $profile_tag->delete();
++            if (!$result) {
++                common_log_db_error($profile_tag, 'DELETE', __FILE__);
++                return false;
++            }
++        }
++        
++        foreach ($to_insert as $instag) {
++            $profile_tag->tag = $instag;
++            $result = $profile_tag->insert();
++            if (!$result) {
++                common_log_db_error($profile_tag, 'INSERT', __FILE__);
++                return false;
++            }
++        }
++        
++        $profile_tag->query('COMMIT');
++        
++        return true;
++    }
++    
++    # Return profiles with a given tag
++    static function getTagged($tagger, $tag) {
++        $profile = new Profile();
++        $profile->query('SELECT profile.* ' .
++                        'FROM profile JOIN profile_tag ' .
++                        'ON profile.id = profile_tag.tagged ' .
++                        'WHERE profile_tag.tagger = ' . $tagger . ' ' .
++                        'AND profile_tag.tag = "' . $tag . '" ');
++        $tagged = array();
++        while ($profile->fetch()) {
++            $tagged[] = clone($profile);
++        }
++        return $tagged;
++    }
+hunk ./classes/Queue_item.php 25
+-      
+-      static function top($transport) {
++    
++    static function top($transport) {
+hunk ./classes/Queue_item.php 28
+-              $qi = new Queue_item();
+-              $qi->transport = $transport;
+-              $qi->orderBy('created');
+-              $qi->whereAdd('claimed is NULL');
++        $qi = new Queue_item();
++        $qi->transport = $transport;
++        $qi->orderBy('created');
++        $qi->whereAdd('claimed is NULL');
+hunk ./classes/Queue_item.php 33
+-              $qi->limit(1);
++        $qi->limit(1);
+hunk ./classes/Queue_item.php 35
+-              $cnt = $qi->find(TRUE);
++        $cnt = $qi->find(TRUE);
+hunk ./classes/Queue_item.php 37
+-              if ($cnt) {
+-                      # XXX: potential race condition
+-                      # can we force it to only update if claimed is still NULL
+-                      # (or old)?
+-                      common_log(LOG_INFO, 'claiming queue item = ' . $qi->notice_id . ' for transport ' . $transport);
+-                      $orig = clone($qi);
+-                      $qi->claimed = common_sql_now();
+-                      $result = $qi->update($orig);
+-                      if ($result) {
+-                              common_log(LOG_INFO, 'claim succeeded.');
+-                              return $qi;
+-                      } else {
+-                              common_log(LOG_INFO, 'claim failed.');
+-                      }
+-              }
+-              $qi = NULL;
+-              return NULL;
+-      }
++        if ($cnt) {
++            # XXX: potential race condition
++            # can we force it to only update if claimed is still NULL
++            # (or old)?
++            common_log(LOG_INFO, 'claiming queue item = ' . $qi->notice_id . ' for transport ' . $transport);
++            $orig = clone($qi);
++            $qi->claimed = common_sql_now();
++            $result = $qi->update($orig);
++            if ($result) {
++                common_log(LOG_INFO, 'claim succeeded.');
++                return $qi;
++            } else {
++                common_log(LOG_INFO, 'claim failed.');
++            }
++        }
++        $qi = NULL;
++        return NULL;
++    }
+hunk ./classes/Sms_carrier.php 24
+-      
+-      function toEmailAddress($sms) {
+-              return sprintf($this->email_pattern, $sms);
+-      }
++    
++    function toEmailAddress($sms) {
++        return sprintf($this->email_pattern, $sms);
++    }
+hunk ./classes/Subscription.php 47
+-      
+-      function &pkeyGet($kv) {
+-              return Memcached_DataObject::pkeyGet('Subscription', $kv);
+-      }
++    
++    function &pkeyGet($kv) {
++        return Memcached_DataObject::pkeyGet('Subscription', $kv);
++    }
+hunk ./classes/User.php 70
+-      function getProfile() {
+-              return Profile::staticGet('id', $this->id);
+-      }
++    function getProfile() {
++        return Profile::staticGet('id', $this->id);
++    }
+hunk ./classes/User.php 74
+-      function isSubscribed($other) {
+-              assert(!is_null($other));
+-              # XXX: cache results of this query
+-              $sub = Subscription::pkeyGet(array('subscriber' => $this->id,
+-                                                                                 'subscribed' => $other->id));
+-              return (is_null($sub)) ? false : true;
+-      }
++    function isSubscribed($other) {
++        assert(!is_null($other));
++        # XXX: cache results of this query
++        $sub = Subscription::pkeyGet(array('subscriber' => $this->id,
++                                           'subscribed' => $other->id));
++        return (is_null($sub)) ? false : true;
++    }
+hunk ./classes/User.php 82
+-      # 'update' won't write key columns, so we have to do it ourselves.
++    # 'update' won't write key columns, so we have to do it ourselves.
+hunk ./classes/User.php 84
+-      function updateKeys(&$orig) {
+-              $parts = array();
+-              foreach (array('nickname', 'email', 'jabber', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) {
+-                      if (strcmp($this->$k, $orig->$k) != 0) {
+-                              $parts[] = $k . ' = ' . $this->_quote($this->$k);
+-                      }
+-              }
+-              if (count($parts) == 0) {
+-                      # No changes
+-                      return true;
+-              }
+-              $toupdate = implode(', ', $parts);
++    function updateKeys(&$orig) {
++        $parts = array();
++        foreach (array('nickname', 'email', 'jabber', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) {
++            if (strcmp($this->$k, $orig->$k) != 0) {
++                $parts[] = $k . ' = ' . $this->_quote($this->$k);
++            }
++        }
++        if (count($parts) == 0) {
++            # No changes
++            return true;
++        }
++        $toupdate = implode(', ', $parts);
+hunk ./classes/User.php 97
+-              $table = $this->tableName();
+-              if(common_config('db','quote_identifiers')) {
+-                      $table = '"' . $table . '"';
+-              }
+-              $qry = 'UPDATE ' . $table . ' SET ' . $toupdate .
+-                ' WHERE id = ' . $this->id;
+-              $orig->decache();
+-              $result = $this->query($qry);
+-              if ($result) {
+-                      $this->encache();
+-              }
+-              return $result;
+-      }
++        $table = $this->tableName();
++        if(common_config('db','quote_identifiers')) {
++            $table = '"' . $table . '"';
++        }
++        $qry = 'UPDATE ' . $table . ' SET ' . $toupdate .
++          ' WHERE id = ' . $this->id;
++        $orig->decache();
++        $result = $this->query($qry);
++        if ($result) {
++            $this->encache();
++        }
++        return $result;
++    }
+hunk ./classes/User.php 111
+-      function allowed_nickname($nickname) {
+-              # XXX: should already be validated for size, content, etc.
+-              static $blacklist = array('rss', 'xrds', 'doc', 'main',
+-                                                                'settings', 'notice', 'user',
+-                                                                'search', 'avatar', 'tag', 'tags',
+-                                                                'api', 'message');
+-              $merged = array_merge($blacklist, common_config('nickname', 'blacklist'));
+-              return !in_array($nickname, $merged);
+-      }
++    function allowed_nickname($nickname) {
++        # XXX: should already be validated for size, content, etc.
++        static $blacklist = array('rss', 'xrds', 'doc', 'main',
++                                  'settings', 'notice', 'user',
++                                  'search', 'avatar', 'tag', 'tags',
++                                  'api', 'message');
++        $merged = array_merge($blacklist, common_config('nickname', 'blacklist'));
++        return !in_array($nickname, $merged);
++    }
+hunk ./classes/User.php 121
+-      function getCurrentNotice($dt=NULL) {
+-              $profile = $this->getProfile();
+-              if (!$profile) {
+-                      return NULL;
+-              }
+-              return $profile->getCurrentNotice($dt);
+-      }
++    function getCurrentNotice($dt=NULL) {
++        $profile = $this->getProfile();
++        if (!$profile) {
++            return NULL;
++        }
++        return $profile->getCurrentNotice($dt);
++    }
+hunk ./classes/User.php 129
+-      function getCarrier() {
+-              return Sms_carrier::staticGet('id', $this->carrier);
+-      }
++    function getCarrier() {
++        return Sms_carrier::staticGet('id', $this->carrier);
++    }
+hunk ./classes/User.php 133
+-      function subscribeTo($other) {
+-              $sub = new Subscription();
+-              $sub->subscriber = $this->id;
+-              $sub->subscribed = $other->id;
++    function subscribeTo($other) {
++        $sub = new Subscription();
++        $sub->subscriber = $this->id;
++        $sub->subscribed = $other->id;
+hunk ./classes/User.php 138
+-              $sub->created = common_sql_now(); # current time
++        $sub->created = common_sql_now(); # current time
+hunk ./classes/User.php 140
+-              if (!$sub->insert()) {
+-                      return false;
+-              }
++        if (!$sub->insert()) {
++            return false;
++        }
+hunk ./classes/User.php 144
+-              return true;
+-      }
++        return true;
++    }
+hunk ./classes/User.php 161
+-      static function register($fields) {
++    static function register($fields) {
+hunk ./classes/User.php 163
+-              # MAGICALLY put fields into current scope
++        # MAGICALLY put fields into current scope
+hunk ./classes/User.php 165
+-              extract($fields);
++        extract($fields);
+hunk ./classes/User.php 167
+-              $profile = new Profile();
++        $profile = new Profile();
+hunk ./classes/User.php 169
+-              $profile->query('BEGIN');
++        $profile->query('BEGIN');
+hunk ./classes/User.php 171
+-              $profile->nickname = $nickname;
+-              $profile->profileurl = common_profile_url($nickname);
++        $profile->nickname = $nickname;
++        $profile->profileurl = common_profile_url($nickname);
+hunk ./classes/User.php 174
+-              if ($fullname) {
+-                      $profile->fullname = $fullname;
+-              }
+-              if ($homepage) {
+-                      $profile->homepage = $homepage;
+-              }
+-              if ($bio) {
+-                      $profile->bio = $bio;
+-              }
+-              if ($location) {
+-                      $profile->location = $location;
+-              }
++        if ($fullname) {
++            $profile->fullname = $fullname;
++        }
++        if ($homepage) {
++            $profile->homepage = $homepage;
++        }
++        if ($bio) {
++            $profile->bio = $bio;
++        }
++        if ($location) {
++            $profile->location = $location;
++        }
+hunk ./classes/User.php 187
+-              $profile->created = common_sql_now();
++        $profile->created = common_sql_now();
+hunk ./classes/User.php 189
+-              $id = $profile->insert();
++        $id = $profile->insert();
+hunk ./classes/User.php 191
+-              if (!$id) {
+-                      common_log_db_error($profile, 'INSERT', __FILE__);
+-                  return FALSE;
+-              }
++        if (!$id) {
++            common_log_db_error($profile, 'INSERT', __FILE__);
++            return FALSE;
++        }
+hunk ./classes/User.php 196
+-              $user = new User();
++        $user = new User();
+hunk ./classes/User.php 198
+-              $user->id = $id;
+-              $user->nickname = $nickname;
++        $user->id = $id;
++        $user->nickname = $nickname;
+hunk ./classes/User.php 201
+-              if ($password) { # may not have a password for OpenID users
+-                      $user->password = common_munge_password($password, $id);
+-              }
++        if ($password) { # may not have a password for OpenID users
++            $user->password = common_munge_password($password, $id);
++        }
+hunk ./classes/User.php 205
+-              # Users who respond to invite email have proven their ownership of that address
++        # Users who respond to invite email have proven their ownership of that address
+hunk ./classes/User.php 207
+-              if ($code) {
+-                      $invite = Invitation::staticGet($code);
+-                      if ($invite && $invite->address && $invite->address_type == 'email' && $invite->address == $email) {
+-                              $user->email = $invite->address;
+-                      }
+-              }
++        if ($code) {
++            $invite = Invitation::staticGet($code);
++            if ($invite && $invite->address && $invite->address_type == 'email' && $invite->address == $email) {
++                $user->email = $invite->address;
++            }
++        }
+hunk ./classes/User.php 214
+-              $inboxes = common_config('inboxes', 'enabled');
++        $inboxes = common_config('inboxes', 'enabled');
+hunk ./classes/User.php 216
+-              if ($inboxes === true || $inboxes == 'transitional') {
+-                      $user->inboxed = 1;
+-              }
++        if ($inboxes === true || $inboxes == 'transitional') {
++            $user->inboxed = 1;
++        }
+hunk ./classes/User.php 220
+-              $user->created = common_sql_now();
+-              $user->uri = common_user_uri($user);
++        $user->created = common_sql_now();
++        $user->uri = common_user_uri($user);
+hunk ./classes/User.php 223
+-              $result = $user->insert();
++        $result = $user->insert();
+hunk ./classes/User.php 225
+-              if (!$result) {
+-                      common_log_db_error($user, 'INSERT', __FILE__);
+-                      return FALSE;
+-              }
++        if (!$result) {
++            common_log_db_error($user, 'INSERT', __FILE__);
++            return FALSE;
++        }
+hunk ./classes/User.php 230
+-              # Everyone is subscribed to themself
++        # Everyone is subscribed to themself
+hunk ./classes/User.php 232
+-              $subscription = new Subscription();
+-              $subscription->subscriber = $user->id;
+-              $subscription->subscribed = $user->id;
+-              $subscription->created = $user->created;
++        $subscription = new Subscription();
++        $subscription->subscriber = $user->id;
++        $subscription->subscribed = $user->id;
++        $subscription->created = $user->created;
+hunk ./classes/User.php 237
+-              $result = $subscription->insert();
++        $result = $subscription->insert();
+hunk ./classes/User.php 239
+-              if (!$result) {
+-                      common_log_db_error($subscription, 'INSERT', __FILE__);
+-                      return FALSE;
+-              }
++        if (!$result) {
++            common_log_db_error($subscription, 'INSERT', __FILE__);
++            return FALSE;
++        }
+hunk ./classes/User.php 244
+-              if ($email && !$user->email) {
++        if ($email && !$user->email) {
+hunk ./classes/User.php 246
+-                      $confirm = new Confirm_address();
+-                      $confirm->code = common_confirmation_code(128);
+-                      $confirm->user_id = $user->id;
+-                      $confirm->address = $email;
+-                      $confirm->address_type = 'email';
++            $confirm = new Confirm_address();
++            $confirm->code = common_confirmation_code(128);
++            $confirm->user_id = $user->id;
++            $confirm->address = $email;
++            $confirm->address_type = 'email';
+hunk ./classes/User.php 252
+-                      $result = $confirm->insert();
+-                      if (!$result) {
+-                              common_log_db_error($confirm, 'INSERT', __FILE__);
+-                              return FALSE;
+-                      }
+-              }
++            $result = $confirm->insert();
++            if (!$result) {
++                common_log_db_error($confirm, 'INSERT', __FILE__);
++                return FALSE;
++            }
++        }
+hunk ./classes/User.php 259
+-              if ($code && $user->email) {
+-                      $user->emailChanged();
+-              }
++        if ($code && $user->email) {
++            $user->emailChanged();
++        }
+hunk ./classes/User.php 263
+-              $profile->query('COMMIT');
++        $profile->query('COMMIT');
+hunk ./classes/User.php 265
+-              if ($email && !$user->email) {
+-                      mail_confirm_address($user, $confirm->code, $profile->nickname, $email);
+-              }
++        if ($email && !$user->email) {
++            mail_confirm_address($user, $confirm->code, $profile->nickname, $email);
++        }
+hunk ./classes/User.php 269
+-              return $user;
+-      }
++        return $user;
++    }
+hunk ./classes/User.php 272
+-      # Things we do when the email changes
++    # Things we do when the email changes
+hunk ./classes/User.php 274
+-      function emailChanged() {
++    function emailChanged() {
+hunk ./classes/User.php 276
+-              $invites = new Invitation();
+-              $invites->address = $this->email;
+-              $invites->address_type = 'email';
++        $invites = new Invitation();
++        $invites->address = $this->email;
++        $invites->address_type = 'email';
+hunk ./classes/User.php 280
+-              if ($invites->find()) {
+-                      while ($invites->fetch()) {
+-                              $other = User::staticGet($invites->user_id);
+-                              subs_subscribe_to($other, $this);
+-                      }
+-              }
+-      }
++        if ($invites->find()) {
++            while ($invites->fetch()) {
++                $other = User::staticGet($invites->user_id);
++                subs_subscribe_to($other, $this);
++            }
++        }
++    }
+hunk ./classes/User.php 288
+-      function hasFave($notice) {
+-              $cache = common_memcache();
++    function hasFave($notice) {
++        $cache = common_memcache();
+hunk ./classes/User.php 291
+-              # XXX: Kind of a hack.
+-              if ($cache) {
+-                      # This is the stream of favorite notices, in rev chron
+-                      # order. This forces it into cache.
+-                      $faves = $this->favoriteNotices(0, NOTICE_CACHE_WINDOW);
+-                      $cnt = 0;
+-                      while ($faves->fetch()) {
+-                              if ($faves->id < $notice->id) {
+-                                      # If we passed it, it's not a fave
+-                                      return false;
+-                              } else if ($faves->id == $notice->id) {
+-                                      # If it matches a cached notice, then it's a fave
+-                                      return true;
+-                              }
+-                              $cnt++;
+-                      }
+-                      # If we're not past the end of the cache window,
+-                      # then the cache has all available faves, so this one
+-                      # is not a fave.
+-                      if ($cnt < NOTICE_CACHE_WINDOW) {
+-                              return false;
+-                      }
+-                      # Otherwise, cache doesn't have all faves;
+-                      # fall through to the default
+-              }
+-              $fave = Fave::pkeyGet(array('user_id' => $this->id,
+-                                                                      'notice_id' => $notice->id));
+-              return ((is_null($fave)) ? false : true);
+-      }
+-      function mutuallySubscribed($other) {
+-              return $this->isSubscribed($other) &&
+-                $other->isSubscribed($this);
+-      }
++        # XXX: Kind of a hack.
++        if ($cache) {
++            # This is the stream of favorite notices, in rev chron
++            # order. This forces it into cache.
++            $faves = $this->favoriteNotices(0, NOTICE_CACHE_WINDOW);
++            $cnt = 0;
++            while ($faves->fetch()) {
++                if ($faves->id < $notice->id) {
++                    # If we passed it, it's not a fave
++                    return false;
++                } else if ($faves->id == $notice->id) {
++                    # If it matches a cached notice, then it's a fave
++                    return true;
++                }
++                $cnt++;
++            }
++            # If we're not past the end of the cache window,
++            # then the cache has all available faves, so this one
++            # is not a fave.
++            if ($cnt < NOTICE_CACHE_WINDOW) {
++                return false;
++            }
++            # Otherwise, cache doesn't have all faves;
++            # fall through to the default
++        }
++        $fave = Fave::pkeyGet(array('user_id' => $this->id,
++                                    'notice_id' => $notice->id));
++        return ((is_null($fave)) ? false : true);
++    }
++    function mutuallySubscribed($other) {
++        return $this->isSubscribed($other) &&
++          $other->isSubscribed($this);
++    }
+hunk ./classes/User.php 327
+-              # 3-way join; probably should get cached
+-              $qry = 'SELECT user.* ' .
+-                'FROM subscription sub1 JOIN user ON sub1.subscribed = user.id ' .
+-                'JOIN subscription sub2 ON user.id = sub2.subscriber ' .
+-                'WHERE sub1.subscriber = %d and sub2.subscribed = %d ' .
+-                'ORDER BY user.nickname';
+-              $user = new User();
+-              $user->query(sprintf($qry, $this->id, $this->id));
++        # 3-way join; probably should get cached
++        $qry = 'SELECT user.* ' .
++          'FROM subscription sub1 JOIN user ON sub1.subscribed = user.id ' .
++          'JOIN subscription sub2 ON user.id = sub2.subscriber ' .
++          'WHERE sub1.subscriber = %d and sub2.subscribed = %d ' .
++          'ORDER BY user.nickname';
++        $user = new User();
++        $user->query(sprintf($qry, $this->id, $this->id));
+hunk ./classes/User.php 336
+-              return $user;
+-      }
++        return $user;
++    }
+hunk ./classes/User.php 339
+-      function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) {
+-              $qry =
+-                'SELECT notice.* ' .
+-                'FROM notice JOIN reply ON notice.id = reply.notice_id ' .
+-                'WHERE reply.profile_id = %d ';
+-              return Notice::getStream(sprintf($qry, $this->id),
+-                                                               'user:replies:'.$this->id,
+-                                                               $offset, $limit, $since_id, $before_id, NULL, $since);
+-      }
++    function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) {
++        $qry =
++          'SELECT notice.* ' .
++          'FROM notice JOIN reply ON notice.id = reply.notice_id ' .
++          'WHERE reply.profile_id = %d ';
++        return Notice::getStream(sprintf($qry, $this->id),
++                                 'user:replies:'.$this->id,
++                                 $offset, $limit, $since_id, $before_id, NULL, $since);
++    }
+hunk ./classes/User.php 356
+-      }
++    }
+hunk ./classes/User.php 359
+-              $qry =
+-                'SELECT notice.* ' .
+-                'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
+-                'WHERE fave.user_id = %d ';
+-              return Notice::getStream(sprintf($qry, $this->id),
+-                                                               'user:faves:'.$this->id,
+-                                                               $offset, $limit);
+-      }
++        $qry =
++          'SELECT notice.* ' .
++          'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
++          'WHERE fave.user_id = %d ';
++        return Notice::getStream(sprintf($qry, $this->id),
++                                 'user:faves:'.$this->id,
++                                 $offset, $limit);
++    }
+hunk ./classes/User.php 369
+-              $enabled = common_config('inboxes', 'enabled');
++        $enabled = common_config('inboxes', 'enabled');
+hunk ./classes/User.php 371
+-              # Complicated code, depending on whether we support inboxes yet
+-              # XXX: make this go away when inboxes become mandatory
++        # Complicated code, depending on whether we support inboxes yet
++        # XXX: make this go away when inboxes become mandatory
+hunk ./classes/User.php 374
+-              if ($enabled === false ||
+-                      ($enabled == 'transitional' && $this->inboxed == 0)) {
+-                      $qry =
+-                        'SELECT notice.* ' .
+-                        'FROM notice JOIN subscription ON notice.profile_id = subscription.subscribed ' .
+-                        'WHERE subscription.subscriber = %d ';
+-                      $order = NULL;
+-              } else if ($enabled === true ||
+-                         ($enabled == 'transitional' && $this->inboxed == 1)) {
++        if ($enabled === false ||
++            ($enabled == 'transitional' && $this->inboxed == 0)) {
++            $qry =
++              'SELECT notice.* ' .
++              'FROM notice JOIN subscription ON notice.profile_id = subscription.subscribed ' .
++              'WHERE subscription.subscriber = %d ';
++            $order = NULL;
++        } else if ($enabled === true ||
++               ($enabled == 'transitional' && $this->inboxed == 1)) {
+hunk ./classes/User.php 384
+-                      $qry =
+-                        'SELECT notice.* ' .
+-                        'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' .
+-                        'WHERE notice_inbox.user_id = %d ';
+-                      # NOTE: we override ORDER
+-                      $order = 'ORDER BY notice_inbox.created DESC, notice_inbox.notice_id DESC ';
+-              }
+-              return Notice::getStream(sprintf($qry, $this->id),
+-                                                               'user:notices_with_friends:' . $this->id,
+-                                                               $offset, $limit, $since_id, $before_id,
+-                                                               $order, $since);
+-      }
++            $qry =
++              'SELECT notice.* ' .
++              'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' .
++              'WHERE notice_inbox.user_id = %d ';
++            # NOTE: we override ORDER
++            $order = 'ORDER BY notice_inbox.created DESC, notice_inbox.notice_id DESC ';
++        }
++        return Notice::getStream(sprintf($qry, $this->id),
++                                 'user:notices_with_friends:' . $this->id,
++                                 $offset, $limit, $since_id, $before_id,
++                                 $order, $since);
++    }
+hunk ./classes/User.php 398
+-              $cache = common_memcache();
+-              if ($cache) {
+-                      # Faves don't happen chronologically, so we need to blow
+-                      # ;last cache, too
+-                      $cache->delete(common_cache_key('user:faves:'.$this->id));
+-                      $cache->delete(common_cache_key('user:faves:'.$this->id).';last');
+-              }
+-      }
++        $cache = common_memcache();
++        if ($cache) {
++            # Faves don't happen chronologically, so we need to blow
++            # ;last cache, too
++            $cache->delete(common_cache_key('user:faves:'.$this->id));
++            $cache->delete(common_cache_key('user:faves:'.$this->id).';last');
++        }
++    }
+hunk ./classes/User.php 408
+-              return Profile_tag::getTags($this->id, $this->id);
+-      }
++        return Profile_tag::getTags($this->id, $this->id);
++    }
+hunk ./classes/User.php 412
+-              return Profile_tag::setTags($this->id, $this->id, $newtags);
+-      }
++        return Profile_tag::setTags($this->id, $this->id, $newtags);
++    }
+hunk ./classes/User.php 437
+-              $sub = Subscription::pkeyGet(array('subscriber' => $other->id,
+-                                                                                 'subscribed' => $this->id));
++        $sub = Subscription::pkeyGet(array('subscriber' => $other->id,
++                                           'subscribed' => $this->id));
+hunk ./lib/common.php 57
+-              array('name' => 'Just another Laconica microblog',
+-                        'server' => 'localhost',
+-                        'theme' => 'default',
+-                        'path' => '/',
+-                        'logfile' => NULL,
+-                        'fancy' => false,
+-                        'locale_path' => INSTALLDIR.'/locale',
+-                        'language' => 'en_US',
+-                        'languages' => get_all_languages(),
+-                    'email' =>
+-                    array_key_exists('SERVER_ADMIN', $_SERVER) ? $_SERVER['SERVER_ADMIN'] : NULL,
+-                        'broughtby' => NULL,
+-                        'timezone' => 'UTC',
+-                        'broughtbyurl' => NULL,
+-                        'closed' => false,
+-                        'inviteonly' => false,
++        array('name' => 'Just another Laconica microblog',
++              'server' => 'localhost',
++              'theme' => 'default',
++              'path' => '/',
++              'logfile' => NULL,
++              'fancy' => false,
++              'locale_path' => INSTALLDIR.'/locale',
++              'language' => 'en_US',
++              'languages' => get_all_languages(),
++              'email' =>
++              array_key_exists('SERVER_ADMIN', $_SERVER) ? $_SERVER['SERVER_ADMIN'] : NULL,
++              'broughtby' => NULL,
++              'timezone' => 'UTC',
++              'broughtbyurl' => NULL,
++              'closed' => false,
++              'inviteonly' => false,
+hunk ./lib/common.php 74
+-              'syslog' =>
+-              array('appname' => 'laconica', # for syslog
+-                        'priority' => 'debug'), # XXX: currently ignored
+-              'queue' =>
+-              array('enabled' => false),
+-              'license' =>
+-              array('url' => 'http://creativecommons.org/licenses/by/3.0/',
+-                        'title' => 'Creative Commons Attribution 3.0',
+-                        'image' => 'http://i.creativecommons.org/l/by/3.0/88x31.png'),
+-              'mail' =>
+-              array('backend' => 'mail',
+-                        'params' => NULL),
+-              'nickname' =>
+-              array('blacklist' => array(),
+-                        'featured' => array()),
+-              'profile' =>
+-              array('banned' => array()),
+-              'avatar' =>
+-              array('server' => NULL),
+-              'public' =>
+-              array('localonly' => true,
+-                        'blacklist' => array()),
+-              'theme' =>
+-              array('server' => NULL),
+-              'throttle' =>
++        'syslog' =>
++        array('appname' => 'laconica', # for syslog
++              'priority' => 'debug'), # XXX: currently ignored
++        'queue' =>
++        array('enabled' => false),
++        'license' =>
++        array('url' => 'http://creativecommons.org/licenses/by/3.0/',
++              'title' => 'Creative Commons Attribution 3.0',
++              'image' => 'http://i.creativecommons.org/l/by/3.0/88x31.png'),
++        'mail' =>
++        array('backend' => 'mail',
++              'params' => NULL),
++        'nickname' =>
++        array('blacklist' => array(),
++              'featured' => array()),
++        'profile' =>
++        array('banned' => array()),
++        'avatar' =>
++        array('server' => NULL),
++        'public' =>
++        array('localonly' => true,
++              'blacklist' => array()),
++        'theme' =>
++        array('server' => NULL),
++        'throttle' =>
+hunk ./lib/common.php 102
+-              'xmpp' =>
+-              array('enabled' => false,
+-                        'server' => 'INVALID SERVER',
+-                        'port' => 5222,
+-                        'user' => 'update',
+-                        'encryption' => true,
+-                        'resource' => 'uniquename',
+-                        'password' => 'blahblahblah',
+-                        'host' => NULL, # only set if != server
+-                        'debug' => false, # print extra debug info
+-                        'public' => array()), # JIDs of users who want to receive the public stream
++        'xmpp' =>
++        array('enabled' => false,
++              'server' => 'INVALID SERVER',
++              'port' => 5222,
++              'user' => 'update',
++              'encryption' => true,
++              'resource' => 'uniquename',
++              'password' => 'blahblahblah',
++              'host' => NULL, # only set if != server
++              'debug' => false, # print extra debug info
++              'public' => array()), # JIDs of users who want to receive the public stream
+hunk ./lib/common.php 117
+-              'tag' =>
+-              array('dropoff' => 864000.0),
+-              'popular' =>
+-              array('dropoff' => 864000.0),
+-              'daemon' =>
+-              array('piddir' => '/var/run',
+-                        'user' => false,
+-                        'group' => false),
+-              'integration' =>
+-              array('source' => 'Laconica'), # source attribute for Twitter
+-              'memcached' =>
+-              array('enabled' => false,
+-                        'server' => 'localhost',
+-                        'port' => 11211),
+-              'inboxes' =>
+-              array('enabled' => true), # on by default for new sites
+-              );
++        'tag' =>
++        array('dropoff' => 864000.0),
++        'popular' =>
++        array('dropoff' => 864000.0),
++        'daemon' =>
++        array('piddir' => '/var/run',
++              'user' => false,
++              'group' => false),
++        'integration' =>
++        array('source' => 'Laconica'), # source attribute for Twitter
++        'memcached' =>
++        array('enabled' => false,
++              'server' => 'localhost',
++              'port' => 11211),
++        'inboxes' =>
++        array('enabled' => true), # on by default for new sites
++        );
+hunk ./lib/common.php 139
+-          'schema_location' => INSTALLDIR . '/classes',
+-              'class_location' => INSTALLDIR . '/classes',
+-              'require_prefix' => 'classes/',
+-              'class_prefix' => '',
+-              'mirror' => NULL,
++        'schema_location' => INSTALLDIR . '/classes',
++        'class_location' => INSTALLDIR . '/classes',
++        'require_prefix' => 'classes/',
++        'class_prefix' => '',
++        'mirror' => NULL,
+hunk ./lib/common.php 145
+-              'quote_identifiers' => false,
+-              'type' => 'mysql' );
++        'quote_identifiers' => false,
++        'type' => 'mysql' );
+hunk ./lib/common.php 149
+-      /* Work internally in UTC */
+-      date_default_timezone_set('UTC');
++    /* Work internally in UTC */
++    date_default_timezone_set('UTC');
+hunk ./lib/common.php 167
+-      if ($class == 'OAuthRequest') {
+-              require_once('OAuth.php');
+-      } else if (file_exists(INSTALLDIR.'/classes/' . $class . '.php')) {
++    if ($class == 'OAuthRequest') {
++        require_once('OAuth.php');
++    } else if (file_exists(INSTALLDIR.'/classes/' . $class . '.php')) {
+hunk ./lib/deleteaction.php 24
+-      function handle($args) {
+-              parent::handle($args);
+-              $user = common_current_user();
+-              $notice_id = $this->trimmed('notice');
+-              $notice = Notice::staticGet($notice_id);
+-              if (!$notice) {
+-                      common_user_error(_('No such notice.'));
+-                      exit;
+-              }
++    function handle($args) {
++        parent::handle($args);
++        $user = common_current_user();
++        $notice_id = $this->trimmed('notice');
++        $notice = Notice::staticGet($notice_id);
++        if (!$notice) {
++            common_user_error(_('No such notice.'));
++            exit;
++        }
+hunk ./lib/deleteaction.php 34
+-              $profile = $notice->getProfile();
+-              $user_profile = $user->getProfile();
++        $profile = $notice->getProfile();
++        $user_profile = $user->getProfile();
+hunk ./lib/deleteaction.php 37
+-              if (!common_logged_in()) {
+-                      common_user_error(_('Not logged in.'));
+-                      exit;
+-              } else if ($notice->profile_id != $user_profile->id) {
+-                      common_user_error(_('Can\'t delete this notice.'));
+-                      exit;
+-              }
+-      }
++        if (!common_logged_in()) {
++            common_user_error(_('Not logged in.'));
++            exit;
++        } else if ($notice->profile_id != $user_profile->id) {
++            common_user_error(_('Can\'t delete this notice.'));
++            exit;
++        }
++    }
+hunk ./lib/deleteaction.php 46
+-      function show_top($arr=NULL) {
+-              $instr = $this->get_instructions();
+-              $output = common_markup_to_html($instr);
+-              common_element_start('div', 'instructions');
+-              common_raw($output);
+-              common_element_end('div');
+-      }
++    function show_top($arr=NULL) {
++        $instr = $this->get_instructions();
++        $output = common_markup_to_html($instr);
++        common_element_start('div', 'instructions');
++        common_raw($output);
++        common_element_end('div');
++    }
+hunk ./lib/deleteaction.php 54
+-      function get_title() {
+-              return NULL;
+-      }
++    function get_title() {
++        return NULL;
++    }
+hunk ./lib/deleteaction.php 58
+-      function show_header() {
+-              return;
+-      }
++    function show_header() {
++        return;
++    }
+hunk ./lib/facebookaction.php 13
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+hunk ./lib/facebookaction.php 17
+- * along with this program.    If not, see <http://www.gnu.org/licenses/>.
++ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+hunk ./lib/facebookaction.php 26
+-      function handle($args) {
+-              parent::handle($args);
+-      }
++    function handle($args) {
++        parent::handle($args);
++    }
+hunk ./lib/facebookaction.php 30
+-      function get_facebook() {
+-              $apikey = common_config('facebook', 'apikey');
+-              $secret = common_config('facebook', 'secret');
+-              return new Facebook($apikey, $secret);
+-      }
++    function get_facebook() {
++        $apikey = common_config('facebook', 'apikey');
++        $secret = common_config('facebook', 'secret');
++        return new Facebook($apikey, $secret);
++    }
+hunk ./lib/facebookaction.php 36
+-      function update_profile_box($facebook, $fbuid, $user) {
++    function update_profile_box($facebook, $fbuid, $user) {
+hunk ./lib/facebookaction.php 38
+-              $notice = $user->getCurrentNotice();
++        $notice = $user->getCurrentNotice();
+hunk ./lib/facebookaction.php 40
+-              # Need to include inline CSS for styling the Profile box
++        # Need to include inline CSS for styling the Profile box
+hunk ./lib/facebookaction.php 42
+-              $style = '<style>
+-              #notices {
+-              clear: both;
+-              margin: 0 auto;
+-              padding: 0;
+-              list-style-type: none;
+-              width: 600px;
+-              border-top: 1px solid #dec5b5;
+-              }
+-              #notices a:hover {
+-              text-decoration: underline;
+-              }
+-              .notice_single {
+-              clear: both;
+-              display: block;
+-              margin: 0;
+-              padding: 5px 5px 5px 0;
+-              min-height: 48px;
+-              font-family: Georgia, "Times New Roman", Times, serif;
+-              font-size: 13px;
+-              line-height: 16px;
+-              border-bottom: 1px solid #dec5b5;
+-              background-color:#FCFFF5;
+-              opacity:1;
+-              }
+-              .notice_single:hover {
+-              background-color: #f7ebcc;
+-              }
+-              .notice_single p {
+-              display: inline;
+-              margin: 0;
+-              padding: 0;
+-              }
+-              </style>';
++        $style = '<style>
++        #notices {
++        clear: both;
++        margin: 0 auto;
++        padding: 0;
++        list-style-type: none;
++        width: 600px;
++        border-top: 1px solid #dec5b5;
++        }
++        #notices a:hover {
++        text-decoration: underline;
++        }
++        .notice_single {
++        clear: both;
++        display: block;
++        margin: 0;
++        padding: 5px 5px 5px 0;
++        min-height: 48px;
++        font-family: Georgia, "Times New Roman", Times, serif;
++        font-size: 13px;
++        line-height: 16px;
++        border-bottom: 1px solid #dec5b5;
++        background-color:#FCFFF5;
++        opacity:1;
++        }
++        .notice_single:hover {
++        background-color: #f7ebcc;
++        }
++        .notice_single p {
++        display: inline;
++        margin: 0;
++        padding: 0;
++        }
++        </style>';
+hunk ./lib/facebookaction.php 77
+-              $html = $this->render_notice($notice);
++        $html = $this->render_notice($notice);
+hunk ./lib/facebookaction.php 79
+-              $fbml = "<fb:wide>$content $html</fb:wide>";
+-              $fbml .= "<fb:narrow>$content $html</fb:narrow>";
++        $fbml = "<fb:wide>$content $html</fb:wide>";
++        $fbml .= "<fb:narrow>$content $html</fb:narrow>";
+hunk ./lib/facebookaction.php 82
+-              $fbml_main = "<fb:narrow>$content $html</fb:narrow>";
++        $fbml_main = "<fb:narrow>$content $html</fb:narrow>";
+hunk ./lib/facebookaction.php 84
+-              $facebook->api_client->profile_setFBML(NULL, $fbuid, $fbml, NULL, NULL, $fbml_main);
+-      }
++        $facebook->api_client->profile_setFBML(NULL, $fbuid, $fbml, NULL, NULL, $fbml_main);
++    }
+hunk ./lib/facebookaction.php 87
+-      # Display methods
++    # Display methods
+hunk ./lib/facebookaction.php 89
+-      function show_header($selected ='Home') {
++    function show_header($selected ='Home') {
+hunk ./lib/facebookaction.php 91
+-              # Add a timestamp to the CSS file so Facebook cache wont ignore our changes
+-              $ts = filemtime(theme_file('facebookapp.css'));
+-              $cssurl = theme_path('facebookapp.css') . "?ts=$ts";
++        # Add a timestamp to the CSS file so Facebook cache wont ignore our changes
++        $ts = filemtime(theme_file('facebookapp.css'));
++        $cssurl = theme_path('facebookapp.css') . "?ts=$ts";
+hunk ./lib/facebookaction.php 95
+-              $header = '<link rel="stylesheet" type="text/css" href="'. $cssurl . '" />';
+-              # $header .='<script src="" ></script>';
+-              $header .= '<fb:dashboard/>';
++         $header = '<link rel="stylesheet" type="text/css" href="'. $cssurl . '" />';
++         # $header .='<script src="" ></script>';
++          $header .= '<fb:dashboard/>';
+hunk ./lib/facebookaction.php 99
+-              $header .=
+-                      '<fb:tabs>'
+-                      .'<fb:tab-item title="Home" href="index.php" selected="' . ($selected == 'Home') .'" />'
+-                      .'<fb:tab-item title="Invite Friends"  href="invite.php" selected="' . ($selected == 'Invite') . '" />'
+-                      .'<fb:tab-item title="Settings"  href="settings.php" selected="' . ($selected == 'Settings') . '" />'
+-                      .'</fb:tabs>';
+-              $header .= '<div id="main_body">';
++          $header .=
++            '<fb:tabs>'
++            .'<fb:tab-item title="Home" href="index.php" selected="' . ($selected == 'Home') .'" />'
++            .'<fb:tab-item title="Invite Friends"  href="invite.php" selected="' . ($selected == 'Invite') . '" />'
++            .'<fb:tab-item title="Settings"     href="settings.php" selected="' . ($selected == 'Settings') . '" />'
++            .'</fb:tabs>';
++          $header .= '<div id="main_body">';
+hunk ./lib/facebookaction.php 107
+-        echo $header;
++      echo $header;
+hunk ./lib/facebookaction.php 109
+-      }
++    }
+hunk ./lib/facebookaction.php 111
+-      function show_footer() {
+-        $footer = '</div>';
+-        echo $footer;
+-      }
++    function show_footer() {
++      $footer = '</div>';
++      echo $footer;
++    }
+hunk ./lib/facebookaction.php 116
+-      function show_login_form() {
++    function show_login_form() {
+hunk ./lib/facebookaction.php 118
+-              $loginform =
+-                      ' <h2>To add the Identi.ca application, you need to log into your Identi.ca account.</h2>'
+-                      .'<a href="http://identi.ca/">'
+-                      .'      <img src="http://theme.identi.ca/identica/logo.png" alt="Identi.ca" id="logo"/>'
+-                      .'</a>'
+-                      .'<h1 class="pagetitle">Login</h1>'
+-                      .'<div class="instructions">'
+-                      .'      <p>Login with your username and password. Don\'t have a username yet?'
+-                      .'        <a href="http://identi.ca/main/register">Register</a> a new account.'
+-                      .'      </p>'
+-                      .'</div>'
+-                      .'<div id="content">'
+-                      .'      <form method="post" id="login">'
+-                      .'        <p>'
+-                      .'              <label for="nickname">Nickname</label>'
+-                      .'              <input name="nickname" type="text" class="input_text" id="nickname"/>'
+-                      .'        </p>'
+-                      .'        <p>'
+-                      .'                <label for="password">Password</label>'
+-                      .'              <input name="password" type="password" class="password" id="password"/>'
+-                      .'        </p>'
+-                      .'        <p>'
+-                      .'              <input type="submit" id="submit" name="submit" class="submit" value="Login"/>'
+-                      .'        </p>'
+-                      .'      </form>'
+-                      .'      <p>'
+-                      .'        <a href="http://identi.ca/main/recoverpassword">Lost or forgotten password?</a>'
+-                      .'      </p>'
+-                      .'</div';
++        $loginform =
++            ' <h2>To add the Identi.ca application, you need to log into your Identi.ca account.</h2>'
++            .'<a href="http://identi.ca/">'
++            .'    <img src="http://theme.identi.ca/identica/logo.png" alt="Identi.ca" id="logo"/>'
++            .'</a>'
++            .'<h1 class="pagetitle">Login</h1>'
++            .'<div class="instructions">'
++            .'    <p>Login with your username and password. Don\'t have a username yet?'
++            .'      <a href="http://identi.ca/main/register">Register</a> a new account.'
++            .'    </p>'
++            .'</div>'
++            .'<div id="content">'
++            .'    <form method="post" id="login">'
++            .'      <p>'
++            .'        <label for="nickname">Nickname</label>'
++            .'        <input name="nickname" type="text" class="input_text" id="nickname"/>'
++            .'      </p>'
++            .'      <p>'
++            .'          <label for="password">Password</label>'
++            .'        <input name="password" type="password" class="password" id="password"/>'
++            .'      </p>'
++            .'      <p>'
++            .'        <input type="submit" id="submit" name="submit" class="submit" value="Login"/>'
++            .'      </p>'
++            .'    </form>'
++            .'    <p>'
++            .'      <a href="http://identi.ca/main/recoverpassword">Lost or forgotten password?</a>'
++            .'    </p>'
++            .'</div';
+hunk ./lib/facebookaction.php 148
+-                      echo $loginform;
+-      }
++            echo $loginform;
++    }
+hunk ./lib/facebookaction.php 151
+-      function render_notice($notice) {
++    function render_notice($notice) {
+hunk ./lib/facebookaction.php 153
+-              global $config;
++        global $config;
+hunk ./lib/facebookaction.php 155
+-              $profile = $notice->getProfile();
+-              $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
++        $profile = $notice->getProfile();
++        $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
+hunk ./lib/facebookaction.php 158
+-              $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
++        $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
+hunk ./lib/facebookaction.php 160
+-              # XXX: we need to figure this out better. Is this right?
+-              if (strcmp($notice->uri, $noticeurl) != 0 && preg_match('/^http/', $notice->uri)) {
+-                      $noticeurl = $notice->uri;
+-              }
++        # XXX: we need to figure this out better. Is this right?
++        if (strcmp($notice->uri, $noticeurl) != 0 && preg_match('/^http/', $notice->uri)) {
++            $noticeurl = $notice->uri;
++        }
+hunk ./lib/facebookaction.php 165
+-              $html =
+-              '<li class="notice_single" id="' . $notice->id . '">'
+-              .'<a href="' . $profile->profileurl . '">'
+-              .'<img src="';
++        $html =
++        '<li class="notice_single" id="' . $notice->id . '">'
++        .'<a href="' . $profile->profileurl . '">'
++        .'<img src="';
+hunk ./lib/facebookaction.php 170
+-              if ($avatar) {
+-                      $html .= common_avatar_display_url($avatar);
+-              } else {
+-                      $html .= common_default_avatar(AVATAR_STREAM_SIZE);
+-              }
++        if ($avatar) {
++            $html .= common_avatar_display_url($avatar);
++        } else {
++            $html .= common_default_avatar(AVATAR_STREAM_SIZE);
++        }
+hunk ./lib/facebookaction.php 176
+-              $html .=
+-              '" class="avatar stream" width="'
+-              . AVATAR_STREAM_SIZE . '" height="' . AVATAR_STREAM_SIZE .'"'
+-              .' alt="';
++        $html .=
++        '" class="avatar stream" width="'
++        . AVATAR_STREAM_SIZE . '" height="' . AVATAR_STREAM_SIZE .'"'
++        .' alt="';
+hunk ./lib/facebookaction.php 181
+-              if ($profile->fullname) {
+-                      $html .= $profile->fullname;
+-              } else {
+-                      $html .= $profile->nickname;
+-              }
++        if ($profile->fullname) {
++            $html .= $profile->fullname;
++        } else {
++            $html .= $profile->nickname;
++        }
+hunk ./lib/facebookaction.php 187
+-              $html .=
+-              '"></a>'
+-              .'<a href="' .  $profile->profileurl . '" class="nickname">' . $profile->nickname . '</a>'
+-              .'<p class="content">' . $notice->rendered . '</p>'
+-              .'<p class="time">'
+-              .'<a class="permalink" href="' . $noticeurl . '" title="' . common_exact_date($notice->created) . '">' . common_date_string($notice->created) . '</a>';
++        $html .=
++        '"></a>'
++        .'<a href="' .    $profile->profileurl . '" class="nickname">' . $profile->nickname . '</a>'
++        .'<p class="content">' . $notice->rendered . '</p>'
++        .'<p class="time">'
++        .'<a class="permalink" href="' . $noticeurl . '" title="' . common_exact_date($notice->created) . '">' . common_date_string($notice->created) . '</a>';
+hunk ./lib/facebookaction.php 194
+-              if ($notice->source) {
+-                      $html .= _(' from ');
+-                      $html .= $this->source_link($notice->source);
+-              }
++        if ($notice->source) {
++            $html .= _(' from ');
++            $html .= $this->source_link($notice->source);
++        }
+hunk ./lib/facebookaction.php 199
+-              if ($notice->reply_to) {
+-                      $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to));
+-                      $html .=
+-                      ' (<a class="inreplyto" href="' . $replyurl . '">' . _('in reply to...') . ')';
+-              }
++        if ($notice->reply_to) {
++            $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to));
++            $html .=
++            ' (<a class="inreplyto" href="' . $replyurl . '">' . _('in reply to...') . ')';
++        }
+hunk ./lib/facebookaction.php 205
+-              $html .= '</p></li>';
++        $html .= '</p></li>';
+hunk ./lib/facebookaction.php 207
+-              return $html;
+-      }
++        return $html;
++    }
+hunk ./lib/facebookaction.php 210
+-      function source_link($source) {
+-              $source_name = _($source);
++    function source_link($source) {
++        $source_name = _($source);
+hunk ./lib/facebookaction.php 213
+-              $html = '<span class="noticesource">';
++        $html = '<span class="noticesource">';
+hunk ./lib/facebookaction.php 215
+-              switch ($source) {
+-               case 'web':
+-               case 'xmpp':
+-               case 'mail':
+-               case 'omb':
+-               case 'api':
+-                      $html .= $source_name;
+-                      break;
+-               default:
+-                      $ns = Notice_source::staticGet($source);
+-                      if ($ns) {
+-                              $html .= '<a href="' . $ns->url . '">' . $ns->name . '</a>';
+-                      } else {
+-                              $html .= $source_name;
+-                      }
+-                      break;
+-              }
++        switch ($source) {
++         case 'web':
++         case 'xmpp':
++         case 'mail':
++         case 'omb':
++         case 'api':
++            $html .= $source_name;
++            break;
++         default:
++            $ns = Notice_source::staticGet($source);
++            if ($ns) {
++                $html .= '<a href="' . $ns->url . '">' . $ns->name . '</a>';
++            } else {
++                $html .= $source_name;
++            }
++            break;
++        }
+hunk ./lib/facebookaction.php 233
+-              $html .= '</span>';
++        $html .= '</span>';
+hunk ./lib/facebookaction.php 235
+-              return $html;
+-      }
++        return $html;
++    }
+hunk ./lib/facebookaction.php 238
+-      function pagination($have_before, $have_after, $page, $fbaction, $args=NULL) {
++    function pagination($have_before, $have_after, $page, $fbaction, $args=NULL) {
+hunk ./lib/facebookaction.php 240
+-              $html = '';
++        $html = '';
+hunk ./lib/facebookaction.php 242
+-              if ($have_before || $have_after) {
+-                      $html = '<div id="pagination">';
+-                      $html .'<ul id="nav_pagination">';
+-              }
++        if ($have_before || $have_after) {
++            $html = '<div id="pagination">';
++            $html .'<ul id="nav_pagination">';
++        }
+hunk ./lib/facebookaction.php 247
+-              if ($have_before) {
+-                      $pargs = array('page' => $page-1);
+-                      $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
+-                      $html .= '<li class="before">';
+-                      $html .'<a href="' . $this->pagination_url($fbaction, $newargs) . '">' . _('« After') . '</a>';
+-                      $html .'</li>';
+-              }
++        if ($have_before) {
++            $pargs = array('page' => $page-1);
++            $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
++            $html .= '<li class="before">';
++            $html .'<a href="' . $this->pagination_url($fbaction, $newargs) . '">' . _('« After') . '</a>';
++            $html .'</li>';
++        }
+hunk ./lib/facebookaction.php 255
+-              if ($have_after) {
+-                      $pargs = array('page' => $page+1);
+-                      $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
+-                      $html .= '<li class="after">';
+-                      $html .'<a href="' . $this->pagination_url($fbaction, $newargs) . '">' . _('Before Â»') . '</a>';
+-                      $html .'</li>';
+-              }
++        if ($have_after) {
++            $pargs = array('page' => $page+1);
++            $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
++            $html .= '<li class="after">';
++            $html .'<a href="' . $this->pagination_url($fbaction, $newargs) . '">' . _('Before Â»') . '</a>';
++            $html .'</li>';
++        }
+hunk ./lib/facebookaction.php 263
+-              if ($have_before || $have_after) {
+-                      $html .= '<ul>';
+-                      $html .'<div>';
+-              }
+-      }
++        if ($have_before || $have_after) {
++            $html .= '<ul>';
++            $html .'<div>';
++        }
++    }
+hunk ./lib/facebookaction.php 269
+-      function pagination_url($fbaction, $args=NULL) {
+-              global $config;
++    function pagination_url($fbaction, $args=NULL) {
++        global $config;
+hunk ./lib/facebookaction.php 272
+-              $extra = '';
++        $extra = '';
+hunk ./lib/facebookaction.php 274
+-              if ($args) {
+-                      foreach ($args as $key => $value) {
+-                              $extra .= "&${key}=${value}";
+-                      }
+-              }
++        if ($args) {
++            foreach ($args as $key => $value) {
++                $extra .= "&${key}=${value}";
++            }
++        }
+hunk ./lib/facebookaction.php 280
+-              return "$fbaction?${extra}";
+-      }
++        return "$fbaction?${extra}";
++    }
+hunk ./lib/oauthstore.php 26
+-      # We keep a record of who's contacted us
++    # We keep a record of who's contacted us
+hunk ./lib/oauthstore.php 28
+-      function lookup_consumer($consumer_key) {
+-              $con = Consumer::staticGet('consumer_key', $consumer_key);
+-              if (!$con) {
+-                      $con = new Consumer();
+-                      $con->consumer_key = $consumer_key;
+-                      $con->seed = common_good_rand(16);
+-                      $con->created = DB_DataObject_Cast::dateTime();
+-                      if (!$con->insert()) {
+-                              return NULL;
+-                      }
+-              }
+-              return new OAuthConsumer($con->consumer_key, '');
+-      }
++    function lookup_consumer($consumer_key) {
++        $con = Consumer::staticGet('consumer_key', $consumer_key);
++        if (!$con) {
++            $con = new Consumer();
++            $con->consumer_key = $consumer_key;
++            $con->seed = common_good_rand(16);
++            $con->created = DB_DataObject_Cast::dateTime();
++            if (!$con->insert()) {
++                return NULL;
++            }
++        }
++        return new OAuthConsumer($con->consumer_key, '');
++    }
+hunk ./lib/oauthstore.php 42
+-      function lookup_token($consumer, $token_type, $token_key) {
+-              $t = new Token();
+-              $t->consumer_key = $consumer->key;
+-              $t->tok = $token_key;
+-              $t->type = ($token_type == 'access') ? 1 : 0;
+-              if ($t->find(true)) {
+-                      return new OAuthToken($t->tok, $t->secret);
+-              } else {
+-                      return NULL;
+-              }
+-      }
++    function lookup_token($consumer, $token_type, $token_key) {
++        $t = new Token();
++        $t->consumer_key = $consumer->key;
++        $t->tok = $token_key;
++        $t->type = ($token_type == 'access') ? 1 : 0;
++        if ($t->find(true)) {
++            return new OAuthToken($t->tok, $t->secret);
++        } else {
++            return NULL;
++        }
++    }
+hunk ./lib/oauthstore.php 54
+-      function lookup_nonce($consumer, $token, $nonce, $timestamp) {
+-              $n = new Nonce();
+-              $n->consumer_key = $consumer->key;
+-              $n->tok = $token->key;
+-              $n->nonce = $nonce;
+-              if ($n->find(TRUE)) {
+-                      return TRUE;
+-              } else {
+-                      $n->timestamp = $timestamp;
+-                      $n->created = DB_DataObject_Cast::dateTime();
+-                      $n->insert();
+-                      return FALSE;
+-              }
+-      }
++    function lookup_nonce($consumer, $token, $nonce, $timestamp) {
++        $n = new Nonce();
++        $n->consumer_key = $consumer->key;
++        $n->tok = $token->key;
++        $n->nonce = $nonce;
++        if ($n->find(TRUE)) {
++            return TRUE;
++        } else {
++            $n->timestamp = $timestamp;
++            $n->created = DB_DataObject_Cast::dateTime();
++            $n->insert();
++            return FALSE;
++        }
++    }
+hunk ./lib/oauthstore.php 69
+-      function new_request_token($consumer) {
+-              $t = new Token();
+-              $t->consumer_key = $consumer->key;
+-              $t->tok = common_good_rand(16);
+-              $t->secret = common_good_rand(16);
+-              $t->type = 0; # request
+-              $t->state = 0; # unauthorized
+-              $t->created = DB_DataObject_Cast::dateTime();
+-              if (!$t->insert()) {
+-                      return NULL;
+-              } else {
+-                      return new OAuthToken($t->tok, $t->secret);
+-              }
+-      }
++    function new_request_token($consumer) {
++        $t = new Token();
++        $t->consumer_key = $consumer->key;
++        $t->tok = common_good_rand(16);
++        $t->secret = common_good_rand(16);
++        $t->type = 0; # request
++        $t->state = 0; # unauthorized
++        $t->created = DB_DataObject_Cast::dateTime();
++        if (!$t->insert()) {
++            return NULL;
++        } else {
++            return new OAuthToken($t->tok, $t->secret);
++        }
++    }
+hunk ./lib/oauthstore.php 84
+-      # defined in OAuthDataStore, but not implemented anywhere
++    # defined in OAuthDataStore, but not implemented anywhere
+hunk ./lib/oauthstore.php 86
+-      function fetch_request_token($consumer) {
+-              return $this->new_request_token($consumer);
+-      }
++    function fetch_request_token($consumer) {
++        return $this->new_request_token($consumer);
++    }
+hunk ./lib/oauthstore.php 90
+-      function new_access_token($token, $consumer) {
+-              common_debug('new_access_token("'.$token->key.'","'.$consumer->key.'")', __FILE__);
+-              $rt = new Token();
+-              $rt->consumer_key = $consumer->key;
+-              $rt->tok = $token->key;
+-              $rt->type = 0; # request
+-              if ($rt->find(TRUE) && $rt->state == 1) { # authorized
+-                      common_debug('request token found.', __FILE__);
+-                      $at = new Token();
+-                      $at->consumer_key = $consumer->key;
+-                      $at->tok = common_good_rand(16);
+-                      $at->secret = common_good_rand(16);
+-                      $at->type = 1; # access
+-                      $at->created = DB_DataObject_Cast::dateTime();
+-                      if (!$at->insert()) {
+-                              $e = $at->_lastError;
+-                              common_debug('access token "'.$at->tok.'" not inserted: "'.$e->message.'"', __FILE__);
+-                              return NULL;
+-                      } else {
+-                              common_debug('access token "'.$at->tok.'" inserted', __FILE__);
+-                              # burn the old one
+-                              $orig_rt = clone($rt);
+-                              $rt->state = 2; # used
+-                              if (!$rt->update($orig_rt)) {
+-                                      return NULL;
+-                              }
+-                              common_debug('request token "'.$rt->tok.'" updated', __FILE__);
+-                              # Update subscription
+-                              # XXX: mixing levels here
+-                              $sub = Subscription::staticGet('token', $rt->tok);
+-                              if (!$sub) {
+-                                      return NULL;
+-                              }
+-                              common_debug('subscription for request token found', __FILE__);
+-                              $orig_sub = clone($sub);
+-                              $sub->token = $at->tok;
+-                              $sub->secret = $at->secret;
+-                              if (!$sub->update($orig_sub)) {
+-                                      return NULL;
+-                              } else {
+-                                      common_debug('subscription updated to use access token', __FILE__);
+-                                      return new OAuthToken($at->tok, $at->secret);
+-                              }
+-                      }
+-              } else {
+-                      return NULL;
+-              }
+-      }
++    function new_access_token($token, $consumer) {
++        common_debug('new_access_token("'.$token->key.'","'.$consumer->key.'")', __FILE__);
++        $rt = new Token();
++        $rt->consumer_key = $consumer->key;
++        $rt->tok = $token->key;
++        $rt->type = 0; # request
++        if ($rt->find(TRUE) && $rt->state == 1) { # authorized
++            common_debug('request token found.', __FILE__);
++            $at = new Token();
++            $at->consumer_key = $consumer->key;
++            $at->tok = common_good_rand(16);
++            $at->secret = common_good_rand(16);
++            $at->type = 1; # access
++            $at->created = DB_DataObject_Cast::dateTime();
++            if (!$at->insert()) {
++                $e = $at->_lastError;
++                common_debug('access token "'.$at->tok.'" not inserted: "'.$e->message.'"', __FILE__);
++                return NULL;
++            } else {
++                common_debug('access token "'.$at->tok.'" inserted', __FILE__);
++                # burn the old one
++                $orig_rt = clone($rt);
++                $rt->state = 2; # used
++                if (!$rt->update($orig_rt)) {
++                    return NULL;
++                }
++                common_debug('request token "'.$rt->tok.'" updated', __FILE__);
++                # Update subscription
++                # XXX: mixing levels here
++                $sub = Subscription::staticGet('token', $rt->tok);
++                if (!$sub) {
++                    return NULL;
++                }
++                common_debug('subscription for request token found', __FILE__);
++                $orig_sub = clone($sub);
++                $sub->token = $at->tok;
++                $sub->secret = $at->secret;
++                if (!$sub->update($orig_sub)) {
++                    return NULL;
++                } else {
++                    common_debug('subscription updated to use access token', __FILE__);
++                    return new OAuthToken($at->tok, $at->secret);
++                }
++            }
++        } else {
++            return NULL;
++        }
++    }
+hunk ./lib/oauthstore.php 139
+-      # defined in OAuthDataStore, but not implemented anywhere
++    # defined in OAuthDataStore, but not implemented anywhere
+hunk ./lib/oauthstore.php 141
+-      function fetch_access_token($consumer) {
+-              return $this->new_access_token($consumer);
+-      }
++    function fetch_access_token($consumer) {
++        return $this->new_access_token($consumer);
++    }
+hunk ./lib/omb.php 47
+-      static $con = NULL;
+-      if (!$con) {
+-              $con = new OAuthConsumer(common_root_url(), '');
+-      }
+-      return $con;
++    static $con = NULL;
++    if (!$con) {
++        $con = new OAuthConsumer(common_root_url(), '');
++    }
++    return $con;
+hunk ./lib/omb.php 55
+-      static $server = null;
+-      if (!$server) {
+-              $server = new OAuthServer(omb_oauth_datastore());
+-              $server->add_signature_method(omb_hmac_sha1());
+-      }
+-      return $server;
++    static $server = null;
++    if (!$server) {
++        $server = new OAuthServer(omb_oauth_datastore());
++        $server->add_signature_method(omb_hmac_sha1());
++    }
++    return $server;
+hunk ./lib/omb.php 64
+-      static $store = NULL;
+-      if (!$store) {
+-              $store = new LaconicaOAuthDataStore();
+-      }
+-      return $store;
++    static $store = NULL;
++    if (!$store) {
++        $store = new LaconicaOAuthDataStore();
++    }
++    return $store;
+hunk ./lib/omb.php 72
+-      static $hmac_method = NULL;
+-      if (!$hmac_method) {
+-              $hmac_method = new OAuthSignatureMethod_HMAC_SHA1();
+-      }
+-      return $hmac_method;
++    static $hmac_method = NULL;
++    if (!$hmac_method) {
++        $hmac_method = new OAuthSignatureMethod_HMAC_SHA1();
++    }
++    return $hmac_method;
+hunk ./lib/omb.php 80
+-      return $xrd->services(array(omb_service_filter($type)));
++    return $xrd->services(array(omb_service_filter($type)));
+hunk ./lib/omb.php 84
+-      return create_function('$s',
+-                                                 'return omb_match_service($s, \''.$type.'\');');
++    return create_function('$s',
++                           'return omb_match_service($s, \''.$type.'\');');
+hunk ./lib/omb.php 89
+-      return in_array($type, $service->getTypes());
++    return in_array($type, $service->getTypes());
+hunk ./lib/omb.php 93
+-      if (!$service) {
+-              return NULL;
+-      }
+-      $uris = $service->getURIs();
+-      if (!$uris) {
+-              return NULL;
+-      }
+-      return $uris[0];
++    if (!$service) {
++        return NULL;
++    }
++    $uris = $service->getURIs();
++    if (!$uris) {
++        return NULL;
++    }
++    return $uris[0];
+hunk ./lib/omb.php 104
+-      if (!$service) {
+-              return NULL;
+-      }
+-      $els = $service->getElements('xrd:LocalID');
+-      if (!$els) {
+-              return NULL;
+-      }
+-      $el = $els[0];
+-      return $service->parser->content($el);
++    if (!$service) {
++        return NULL;
++    }
++    $els = $service->getElements('xrd:LocalID');
++    if (!$els) {
++        return NULL;
++    }
++    $el = $els[0];
++    return $service->parser->content($el);
+hunk ./lib/omb.php 117
+-      # First, get remote users subscribed to this profile
+-      $rp = new Remote_profile();
++    # First, get remote users subscribed to this profile
++    $rp = new Remote_profile();
+hunk ./lib/omb.php 120
+-      $rp->query('SELECT postnoticeurl, token, secret ' .
+-                         'FROM subscription JOIN remote_profile ' .
+-                         'ON subscription.subscriber = remote_profile.id ' .
+-                         'WHERE subscription.subscribed = ' . $notice->profile_id . ' ');
++    $rp->query('SELECT postnoticeurl, token, secret ' .
++               'FROM subscription JOIN remote_profile ' .
++               'ON subscription.subscriber = remote_profile.id ' .
++               'WHERE subscription.subscribed = ' . $notice->profile_id . ' ');
+hunk ./lib/omb.php 125
+-      $posted = array();
++    $posted = array();
+hunk ./lib/omb.php 127
+-      while ($rp->fetch()) {
+-              if (!$posted[$rp->postnoticeurl]) {
+-                      common_log(LOG_DEBUG, 'Posting to ' . $rp->postnoticeurl);
+-                      if (omb_post_notice_keys($notice, $rp->postnoticeurl, $rp->token, $rp->secret)) {
+-                              common_log(LOG_DEBUG, 'Finished to ' . $rp->postnoticeurl);
+-                              $posted[$rp->postnoticeurl] = TRUE;
+-                      } else {
+-                              common_log(LOG_DEBUG, 'Failed posting to ' . $rp->postnoticeurl);
+-                      }
+-              }
+-      }
++    while ($rp->fetch()) {
++        if (!$posted[$rp->postnoticeurl]) {
++            common_log(LOG_DEBUG, 'Posting to ' . $rp->postnoticeurl);
++            if (omb_post_notice_keys($notice, $rp->postnoticeurl, $rp->token, $rp->secret)) {
++                common_log(LOG_DEBUG, 'Finished to ' . $rp->postnoticeurl);
++                $posted[$rp->postnoticeurl] = TRUE;
++            } else {
++                common_log(LOG_DEBUG, 'Failed posting to ' . $rp->postnoticeurl);
++            }
++        }
++    }
+hunk ./lib/omb.php 139
+-      $rp->free();
+-      unset($rp);
++    $rp->free();
++    unset($rp);
+hunk ./lib/omb.php 142
+-      return true;
++    return true;
+hunk ./lib/omb.php 146
+-      return omb_post_notice_keys($notice, $remote_profile->postnoticeurl, $subscription->token, $subscription->secret);
++    return omb_post_notice_keys($notice, $remote_profile->postnoticeurl, $subscription->token, $subscription->secret);
+hunk ./lib/omb.php 151
+-      common_debug('Posting notice ' . $notice->id . ' to ' . $postnoticeurl, __FILE__);
++    common_debug('Posting notice ' . $notice->id . ' to ' . $postnoticeurl, __FILE__);
+hunk ./lib/omb.php 153
+-      $user = User::staticGet('id', $notice->profile_id);
++    $user = User::staticGet('id', $notice->profile_id);
+hunk ./lib/omb.php 155
+-      if (!$user) {
+-              common_debug('Failed to get user for notice ' . $notice->id . ', profile = ' . $notice->profile_id, __FILE__);
+-              return false;
+-      }
++    if (!$user) {
++        common_debug('Failed to get user for notice ' . $notice->id . ', profile = ' . $notice->profile_id, __FILE__);
++        return false;
++    }
+hunk ./lib/omb.php 160
+-      $con = omb_oauth_consumer();
++    $con = omb_oauth_consumer();
+hunk ./lib/omb.php 162
+-      $token = new OAuthToken($tk, $secret);
++    $token = new OAuthToken($tk, $secret);
+hunk ./lib/omb.php 164
+-      $url = $postnoticeurl;
+-      $parsed = parse_url($url);
+-      $params = array();
+-      parse_str($parsed['query'], $params);
++    $url = $postnoticeurl;
++    $parsed = parse_url($url);
++    $params = array();
++    parse_str($parsed['query'], $params);
+hunk ./lib/omb.php 169
+-      $req = OAuthRequest::from_consumer_and_token($con, $token,
+-                                                                                               'POST', $url, $params);
++    $req = OAuthRequest::from_consumer_and_token($con, $token,
++                                                 'POST', $url, $params);
+hunk ./lib/omb.php 172
+-      $req->set_parameter('omb_version', OMB_VERSION_01);
+-      $req->set_parameter('omb_listenee', $user->uri);
+-      $req->set_parameter('omb_notice', $notice->uri);
+-      $req->set_parameter('omb_notice_content', $notice->content);
+-      $req->set_parameter('omb_notice_url', common_local_url('shownotice',
+-                                                                                                                 array('notice' =>
+-                                                                                                                               $notice->id)));
+-      $req->set_parameter('omb_notice_license', common_config('license', 'url'));
++    $req->set_parameter('omb_version', OMB_VERSION_01);
++    $req->set_parameter('omb_listenee', $user->uri);
++    $req->set_parameter('omb_notice', $notice->uri);
++    $req->set_parameter('omb_notice_content', $notice->content);
++    $req->set_parameter('omb_notice_url', common_local_url('shownotice',
++                                                           array('notice' =>
++                                                                 $notice->id)));
++    $req->set_parameter('omb_notice_license', common_config('license', 'url'));
+hunk ./lib/omb.php 181
+-      $user->free();
+-      unset($user);
++    $user->free();
++    unset($user);
+hunk ./lib/omb.php 184
+-      $req->sign_request(omb_hmac_sha1(), $con, $token);
++    $req->sign_request(omb_hmac_sha1(), $con, $token);
+hunk ./lib/omb.php 186
+-      # We re-use this tool's fetcher, since it's pretty good
++    # We re-use this tool's fetcher, since it's pretty good
+hunk ./lib/omb.php 188
+-      $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
++    $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+hunk ./lib/omb.php 190
+-      if (!$fetcher) {
+-              common_log(LOG_WARNING, 'Failed to initialize Yadis fetcher.', __FILE__);
+-              return false;
+-      }
++    if (!$fetcher) {
++        common_log(LOG_WARNING, 'Failed to initialize Yadis fetcher.', __FILE__);
++        return false;
++    }
+hunk ./lib/omb.php 195
+-      $result = $fetcher->post($req->get_normalized_http_url(),
+-                                                       $req->to_postdata(),
++    $result = $fetcher->post($req->get_normalized_http_url(),
++                             $req->to_postdata(),
+hunk ./lib/omb.php 199
+-      common_debug('Got HTTP result "'.print_r($result,TRUE).'"', __FILE__);
++    common_debug('Got HTTP result "'.print_r($result,TRUE).'"', __FILE__);
+hunk ./lib/omb.php 201
+-      if ($result->status == 403) { # not authorized, don't send again
+-              common_debug('403 result, deleting subscription', __FILE__);
+-              # FIXME: figure out how to delete this
+-              # $subscription->delete();
+-              return false;
+-      } else if ($result->status != 200) {
+-              common_debug('Error status '.$result->status, __FILE__);
+-              return false;
+-      } else { # success!
+-              parse_str($result->body, $return);
+-              if ($return['omb_version'] == OMB_VERSION_01) {
+-                      return true;
+-              } else {
+-                      return false;
+-              }
+-      }
++    if ($result->status == 403) { # not authorized, don't send again
++        common_debug('403 result, deleting subscription', __FILE__);
++        # FIXME: figure out how to delete this
++        # $subscription->delete();
++        return false;
++    } else if ($result->status != 200) {
++        common_debug('Error status '.$result->status, __FILE__);
++        return false;
++    } else { # success!
++        parse_str($result->body, $return);
++        if ($return['omb_version'] == OMB_VERSION_01) {
++            return true;
++        } else {
++            return false;
++        }
++    }
+hunk ./lib/omb.php 220
+-      # First, get remote users subscribed to this profile
+-      # XXX: use a join here rather than looping through results
+-      $sub = new Subscription();
+-      $sub->subscribed = $profile->id;
+-      if ($sub->find()) {
+-              $updated = array();
+-              while ($sub->fetch()) {
+-                      $rp = Remote_profile::staticGet('id', $sub->subscriber);
+-                      if ($rp) {
+-                              if (!$updated[$rp->updateprofileurl]) {
+-                                      if (omb_update_profile($profile, $rp, $sub)) {
+-                                              $updated[$rp->updateprofileurl] = TRUE;
+-                                      }
+-                              }
+-                      }
+-              }
+-      }
++    # First, get remote users subscribed to this profile
++    # XXX: use a join here rather than looping through results
++    $sub = new Subscription();
++    $sub->subscribed = $profile->id;
++    if ($sub->find()) {
++        $updated = array();
++        while ($sub->fetch()) {
++            $rp = Remote_profile::staticGet('id', $sub->subscriber);
++            if ($rp) {
++                if (!$updated[$rp->updateprofileurl]) {
++                    if (omb_update_profile($profile, $rp, $sub)) {
++                        $updated[$rp->updateprofileurl] = TRUE;
++                    }
++                }
++            }
++        }
++    }
+hunk ./lib/omb.php 240
+-      global $config; # for license URL
+-      $user = User::staticGet($profile->id);
+-      $con = omb_oauth_consumer();
+-      $token = new OAuthToken($subscription->token, $subscription->secret);
+-      $url = $remote_profile->updateprofileurl;
+-      $parsed = parse_url($url);
+-      $params = array();
+-      parse_str($parsed['query'], $params);
+-      $req = OAuthRequest::from_consumer_and_token($con, $token,
+-                                                                                               "POST", $url, $params);
+-      $req->set_parameter('omb_version', OMB_VERSION_01);
+-      $req->set_parameter('omb_listenee', $user->uri);
+-      $req->set_parameter('omb_listenee_profile', common_profile_url($profile->nickname));
+-      $req->set_parameter('omb_listenee_nickname', $profile->nickname);
++    global $config; # for license URL
++    $user = User::staticGet($profile->id);
++    $con = omb_oauth_consumer();
++    $token = new OAuthToken($subscription->token, $subscription->secret);
++    $url = $remote_profile->updateprofileurl;
++    $parsed = parse_url($url);
++    $params = array();
++    parse_str($parsed['query'], $params);
++    $req = OAuthRequest::from_consumer_and_token($con, $token,
++                                                 "POST", $url, $params);
++    $req->set_parameter('omb_version', OMB_VERSION_01);
++    $req->set_parameter('omb_listenee', $user->uri);
++    $req->set_parameter('omb_listenee_profile', common_profile_url($profile->nickname));
++    $req->set_parameter('omb_listenee_nickname', $profile->nickname);
+hunk ./lib/omb.php 255
+-      # We use blanks to force emptying any existing values in these optional fields
++    # We use blanks to force emptying any existing values in these optional fields
+hunk ./lib/omb.php 257
+-      $req->set_parameter('omb_listenee_fullname',
+-                                              ($profile->fullname) ? $profile->fullname : '');
+-      $req->set_parameter('omb_listenee_homepage',
+-                                              ($profile->homepage) ? $profile->homepage : '');
+-      $req->set_parameter('omb_listenee_bio',
+-                                              ($profile->bio) ? $profile->bio : '');
+-      $req->set_parameter('omb_listenee_location',
+-                                              ($profile->location) ? $profile->location : '');
++    $req->set_parameter('omb_listenee_fullname',
++                        ($profile->fullname) ? $profile->fullname : '');
++    $req->set_parameter('omb_listenee_homepage',
++                        ($profile->homepage) ? $profile->homepage : '');
++    $req->set_parameter('omb_listenee_bio',
++                        ($profile->bio) ? $profile->bio : '');
++    $req->set_parameter('omb_listenee_location',
++                        ($profile->location) ? $profile->location : '');
+hunk ./lib/omb.php 266
+-      $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+-      $req->set_parameter('omb_listenee_avatar',
+-                                              ($avatar) ? $avatar->url : '');
++    $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
++    $req->set_parameter('omb_listenee_avatar',
++                        ($avatar) ? $avatar->url : '');
+hunk ./lib/omb.php 270
+-      $req->sign_request(omb_hmac_sha1(), $con, $token);
++    $req->sign_request(omb_hmac_sha1(), $con, $token);
+hunk ./lib/omb.php 272
+-      # We re-use this tool's fetcher, since it's pretty good
++    # We re-use this tool's fetcher, since it's pretty good
+hunk ./lib/omb.php 274
+-      $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
++    $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+hunk ./lib/omb.php 276
+-      common_debug('request URL = '.$req->get_normalized_http_url(), __FILE__);
+-      common_debug('postdata = '.$req->to_postdata(), __FILE__);
+-      $result = $fetcher->post($req->get_normalized_http_url(),
+-                                                       $req->to_postdata(),
++    common_debug('request URL = '.$req->get_normalized_http_url(), __FILE__);
++    common_debug('postdata = '.$req->to_postdata(), __FILE__);
++    $result = $fetcher->post($req->get_normalized_http_url(),
++                             $req->to_postdata(),
+hunk ./lib/omb.php 282
+-      common_debug('Got HTTP result "'.print_r($result,TRUE).'"', __FILE__);
++    common_debug('Got HTTP result "'.print_r($result,TRUE).'"', __FILE__);
+hunk ./lib/omb.php 284
+-      if ($result->status == 403) { # not authorized, don't send again
+-              common_debug('403 result, deleting subscription', __FILE__);
+-              $subscription->delete();
+-              return false;
+-      } else if ($result->status != 200) {
+-              common_debug('Error status '.$result->status, __FILE__);
+-              return false;
+-      } else { # success!
+-              parse_str($result->body, $return);
+-              if ($return['omb_version'] == OMB_VERSION_01) {
+-                      return true;
+-              } else {
+-                      return false;
+-              }
+-      }
++    if ($result->status == 403) { # not authorized, don't send again
++        common_debug('403 result, deleting subscription', __FILE__);
++        $subscription->delete();
++        return false;
++    } else if ($result->status != 200) {
++        common_debug('Error status '.$result->status, __FILE__);
++        return false;
++    } else { # success!
++        parse_str($result->body, $return);
++        if ($return['omb_version'] == OMB_VERSION_01) {
++            return true;
++        } else {
++            return false;
++        }
++    }
+hunk ./lib/openid.php 36
+-      if (!$store) {
+-              # Can't be called statically
+-              $user = new User();
+-              $conn = $user->getDatabaseConnection();
+-              $store = new Auth_OpenID_MySQLStore($conn);
+-      }
+-      return $store;
++    if (!$store) {
++        # Can't be called statically
++        $user = new User();
++        $conn = $user->getDatabaseConnection();
++        $store = new Auth_OpenID_MySQLStore($conn);
++    }
++    return $store;
+hunk ./lib/openid.php 46
+-      $store = oid_store();
+-      $consumer = new Auth_OpenID_Consumer($store);
+-      return $consumer;
++    $store = oid_store();
++    $consumer = new Auth_OpenID_Consumer($store);
++    return $consumer;
+hunk ./lib/openid.php 52
+-      oid_set_last('');
++    oid_set_last('');
+hunk ./lib/openid.php 56
+-      common_set_cookie(OPENID_COOKIE_KEY,
+-                               $openid_url,
+-                               time() + OPENID_COOKIE_EXPIRY);
++    common_set_cookie(OPENID_COOKIE_KEY,
++                     $openid_url,
++                     time() + OPENID_COOKIE_EXPIRY);
+hunk ./lib/openid.php 62
+-      $openid_url = $_COOKIE[OPENID_COOKIE_KEY];
+-      if ($openid_url && strlen($openid_url) > 0) {
+-              return $openid_url;
+-      } else {
+-              return NULL;
+-      }
++    $openid_url = $_COOKIE[OPENID_COOKIE_KEY];
++    if ($openid_url && strlen($openid_url) > 0) {
++        return $openid_url;
++    } else {
++        return NULL;
++    }
+hunk ./lib/openid.php 72
+-      $oid = new User_openid();
+-      $oid->user_id = $id;
+-      $oid->canonical = $canonical;
+-      $oid->display = $display;
+-      $oid->created = DB_DataObject_Cast::dateTime();
++    $oid = new User_openid();
++    $oid->user_id = $id;
++    $oid->canonical = $canonical;
++    $oid->display = $display;
++    $oid->created = DB_DataObject_Cast::dateTime();
+hunk ./lib/openid.php 78
+-      if (!$oid->insert()) {
+-              $err = PEAR::getStaticProperty('DB_DataObject','lastError');
+-              common_debug('DB error ' . $err->code . ': ' . $err->message, __FILE__);
+-              return false;
+-      }
++    if (!$oid->insert()) {
++        $err = PEAR::getStaticProperty('DB_DataObject','lastError');
++        common_debug('DB error ' . $err->code . ': ' . $err->message, __FILE__);
++        return false;
++    }
+hunk ./lib/openid.php 84
+-      return true;
++    return true;
+hunk ./lib/openid.php 88
+-      $user = NULL;
+-      $oid = User_openid::staticGet('canonical', $openid_url);
+-      if ($oid) {
+-              $user = User::staticGet('id', $oid->user_id);
+-      }
+-      return $user;
++    $user = NULL;
++    $oid = User_openid::staticGet('canonical', $openid_url);
++    if ($oid) {
++        $user = User::staticGet('id', $oid->user_id);
++    }
++    return $user;
+hunk ./lib/openid.php 97
+-      if (!$backto) {
+-              $action = $_REQUEST['action'];
+-              $args = common_copy_args($_GET);
+-              unset($args['action']);
+-              $backto = common_local_url($action, $args);
+-      }
+-      common_debug('going back to "' . $backto . '"', __FILE__);
++    if (!$backto) {
++        $action = $_REQUEST['action'];
++        $args = common_copy_args($_GET);
++        unset($args['action']);
++        $backto = common_local_url($action, $args);
++    }
++    common_debug('going back to "' . $backto . '"', __FILE__);
+hunk ./lib/openid.php 105
+-      common_ensure_session();
++    common_ensure_session();
+hunk ./lib/openid.php 107
+-      $_SESSION['openid_immediate_backto'] = $backto;
+-      common_debug('passed-in variable is "' . $backto . '"', __FILE__);
+-      common_debug('session variable is "' . $_SESSION['openid_immediate_backto'] . '"', __FILE__);
++    $_SESSION['openid_immediate_backto'] = $backto;
++    common_debug('passed-in variable is "' . $backto . '"', __FILE__);
++    common_debug('session variable is "' . $_SESSION['openid_immediate_backto'] . '"', __FILE__);
+hunk ./lib/openid.php 111
+-      oid_authenticate($openid_url,
+-                                       'finishimmediate',
+-                                       true);
++    oid_authenticate($openid_url,
++                     'finishimmediate',
++                     true);
+hunk ./lib/openid.php 118
+-      $consumer = oid_consumer();
++    $consumer = oid_consumer();
+hunk ./lib/openid.php 120
+-      if (!$consumer) {
+-              common_server_error(_('Cannot instantiate OpenID consumer object.'));
+-              return false;
+-      }
++    if (!$consumer) {
++        common_server_error(_('Cannot instantiate OpenID consumer object.'));
++        return false;
++    }
+hunk ./lib/openid.php 125
+-      common_ensure_session();
++    common_ensure_session();
+hunk ./lib/openid.php 127
+-      $auth_request = $consumer->begin($openid_url);
++    $auth_request = $consumer->begin($openid_url);
+hunk ./lib/openid.php 129
+-      // Handle failure status return values.
+-      if (!$auth_request) {
+-              return _('Not a valid OpenID.');
+-      } else if (Auth_OpenID::isFailure($auth_request)) {
+-              return sprintf(_('OpenID failure: %s'), $auth_request->message);
+-      }
++    // Handle failure status return values.
++    if (!$auth_request) {
++        return _('Not a valid OpenID.');
++    } else if (Auth_OpenID::isFailure($auth_request)) {
++        return sprintf(_('OpenID failure: %s'), $auth_request->message);
++    }
+hunk ./lib/openid.php 136
+-      $sreg_request = Auth_OpenID_SRegRequest::build(// Required
+-                                                                                                 array(),
+-                                                                                                 // Optional
+-                                                                                                 array('nickname',
+-                                                                                                               'email',
+-                                                                                                               'fullname',
+-                                                                                                               'language',
+-                                                                                                               'timezone',
+-                                                                                                               'postcode',
+-                                                                                                               'country'));
++    $sreg_request = Auth_OpenID_SRegRequest::build(// Required
++                                                   array(),
++                                                   // Optional
++                                                   array('nickname',
++                                                         'email',
++                                                         'fullname',
++                                                         'language',
++                                                         'timezone',
++                                                         'postcode',
++                                                         'country'));
+hunk ./lib/openid.php 147
+-      if ($sreg_request) {
+-              $auth_request->addExtension($sreg_request);
+-      }
++    if ($sreg_request) {
++        $auth_request->addExtension($sreg_request);
++    }
+hunk ./lib/openid.php 151
+-      $trust_root = common_local_url('public');
+-      $process_url = common_local_url($returnto);
++    $trust_root = common_local_url('public');
++    $process_url = common_local_url($returnto);
+hunk ./lib/openid.php 154
+-      if ($auth_request->shouldSendRedirect()) {
+-              $redirect_url = $auth_request->redirectURL($trust_root,
+-                                                                                                 $process_url,
+-                                                                                                 $immediate);
+-              if (!$redirect_url) {
+-              } else if (Auth_OpenID::isFailure($redirect_url)) {
+-                      return sprintf(_('Could not redirect to server: %s'), $redirect_url->message);
+-              } else {
+-                      common_redirect($redirect_url);
+-              }
+-      } else {
+-              // Generate form markup and render it.
+-              $form_id = 'openid_message';
+-              $form_html = $auth_request->formMarkup($trust_root, $process_url,
+-                                                                                         $immediate, array('id' => $form_id));
++    if ($auth_request->shouldSendRedirect()) {
++        $redirect_url = $auth_request->redirectURL($trust_root,
++                                                   $process_url,
++                                                   $immediate);
++        if (!$redirect_url) {
++        } else if (Auth_OpenID::isFailure($redirect_url)) {
++            return sprintf(_('Could not redirect to server: %s'), $redirect_url->message);
++        } else {
++            common_redirect($redirect_url);
++        }
++    } else {
++        // Generate form markup and render it.
++        $form_id = 'openid_message';
++        $form_html = $auth_request->formMarkup($trust_root, $process_url,
++                                               $immediate, array('id' => $form_id));
+hunk ./lib/openid.php 170
+-              # XXX: This is cheap, but things choke if we don't escape ampersands
+-              # in the HTML attributes
++        # XXX: This is cheap, but things choke if we don't escape ampersands
++        # in the HTML attributes
+hunk ./lib/openid.php 173
+-              $form_html = preg_replace('/&/', '&amp;', $form_html);
++        $form_html = preg_replace('/&/', '&amp;', $form_html);
+hunk ./lib/openid.php 175
+-              // Display an error if the form markup couldn't be generated;
+-              // otherwise, render the HTML.
+-              if (Auth_OpenID::isFailure($form_html)) {
+-                      $this->show_form(sprintf(_('Could not create OpenID form: %s'), $form_html->message));
+-              } else {
+-                      common_show_header(_('OpenID Auto-Submit'), NULL, NULL, '_oid_print_instructions');
+-                      common_raw($form_html);
+-                      common_element('script', NULL,
+-                                                 '$(document).ready(function() { ' .
+-                                                 '    $("#'. $form_id .'").submit(); '.
+-                                                 '});');
+-                      common_show_footer();
+-              }
+-      }
++        // Display an error if the form markup couldn't be generated;
++        // otherwise, render the HTML.
++        if (Auth_OpenID::isFailure($form_html)) {
++            $this->show_form(sprintf(_('Could not create OpenID form: %s'), $form_html->message));
++        } else {
++            common_show_header(_('OpenID Auto-Submit'), NULL, NULL, '_oid_print_instructions');
++            common_raw($form_html);
++            common_element('script', NULL,
++                           '$(document).ready(function() { ' .
++                           '    $("#'. $form_id .'").submit(); '.
++                           '});');
++            common_show_footer();
++        }
++    }
+hunk ./lib/openid.php 194
+-      common_element('div', 'instructions',
+-                                 _('This form should automatically submit itself. '.
+-                                        'If not, click the submit button to go to your '.
+-                                        'OpenID provider.'));
++    common_element('div', 'instructions',
++                   _('This form should automatically submit itself. '.
++                      'If not, click the submit button to go to your '.
++                      'OpenID provider.'));
+hunk ./lib/openid.php 204
+-      $profile = $user->getProfile();
++    $profile = $user->getProfile();
+hunk ./lib/openid.php 206
+-      $orig_profile = clone($profile);
++    $orig_profile = clone($profile);
+hunk ./lib/openid.php 208
+-      if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
+-              $profile->fullname = $sreg['fullname'];
+-      }
++    if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
++        $profile->fullname = $sreg['fullname'];
++    }
+hunk ./lib/openid.php 212
+-      if ($sreg['country']) {
+-              if ($sreg['postcode']) {
+-                      # XXX: use postcode to get city and region
+-                      # XXX: also, store postcode somewhere -- it's valuable!
+-                      $profile->location = $sreg['postcode'] . ', ' . $sreg['country'];
+-              } else {
+-                      $profile->location = $sreg['country'];
+-              }
+-      }
++    if ($sreg['country']) {
++        if ($sreg['postcode']) {
++            # XXX: use postcode to get city and region
++            # XXX: also, store postcode somewhere -- it's valuable!
++            $profile->location = $sreg['postcode'] . ', ' . $sreg['country'];
++        } else {
++            $profile->location = $sreg['country'];
++        }
++    }
+hunk ./lib/openid.php 222
+-      # XXX save language if it's passed
+-      # XXX save timezone if it's passed
++    # XXX save language if it's passed
++    # XXX save timezone if it's passed
+hunk ./lib/openid.php 225
+-      if (!$profile->update($orig_profile)) {
+-              common_server_error(_('Error saving the profile.'));
+-              return false;
+-      }
++    if (!$profile->update($orig_profile)) {
++        common_server_error(_('Error saving the profile.'));
++        return false;
++    }
+hunk ./lib/openid.php 230
+-      $orig_user = clone($user);
++    $orig_user = clone($user);
+hunk ./lib/openid.php 232
+-      if ($sreg['email'] && Validate::email($sreg['email'], true)) {
+-              $user->email = $sreg['email'];
+-      }
++    if ($sreg['email'] && Validate::email($sreg['email'], true)) {
++        $user->email = $sreg['email'];
++    }
+hunk ./lib/openid.php 236
+-      if (!$user->update($orig_user)) {
+-              common_server_error(_('Error saving the user.'));
+-              return false;
+-      }
++    if (!$user->update($orig_user)) {
++        common_server_error(_('Error saving the user.'));
++        return false;
++    }
+hunk ./lib/openid.php 241
+-      return true;
++    return true;
+hunk ./lib/personal.php 23
+-      
+-      function is_readonly() {
+-              return true;
+-      }
+-      
+-      function handle($args) {
+-              parent::handle($args);
+-          common_set_returnto($this->self_url());
+-      }
++    
++    function is_readonly() {
++        return true;
++    }
++    
++    function handle($args) {
++        parent::handle($args);
++        common_set_returnto($this->self_url());
++    }
+hunk ./lib/personal.php 33
+-      function views_menu() {
++    function views_menu() {
+hunk ./lib/personal.php 35
+-              $user = NULL;
+-              $action = $this->trimmed('action');
+-              $nickname = $this->trimmed('nickname');
++        $user = NULL;
++        $action = $this->trimmed('action');
++        $nickname = $this->trimmed('nickname');
+hunk ./lib/personal.php 39
+-              if ($nickname) {
+-                      $user = User::staticGet('nickname', $nickname);
+-                      $user_profile = $user->getProfile();
+-              } else {
+-                      $user_profile = false;
+-              }
++        if ($nickname) {
++            $user = User::staticGet('nickname', $nickname);
++            $user_profile = $user->getProfile();
++        } else {
++            $user_profile = false;
++        }
+hunk ./lib/personal.php 46
+-              common_element_start('ul', array('id' => 'nav_views'));
++        common_element_start('ul', array('id' => 'nav_views'));
+hunk ./lib/personal.php 48
+-              common_menu_item(common_local_url('all', array('nickname' =>
+-                                                                                                         $nickname)),
+-                                               _('Personal'),
+-                                               sprintf(_('%s and friends'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
+-                                               $action == 'all');
+-              common_menu_item(common_local_url('replies', array('nickname' =>
+-                                                                                                                        $nickname)),
+-                                               _('Replies'),
+-                                               sprintf(_('Replies to %s'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
+-                                               $action == 'replies');
+-              common_menu_item(common_local_url('showstream', array('nickname' =>
+-                                                                                                                        $nickname)),
+-                                               _('Profile'),
+-                                               ($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname,
+-                                               $action == 'showstream');
+-              common_menu_item(common_local_url('showfavorites', array('nickname' =>
+-                                                                                                                        $nickname)),
+-                                               _('Favorites'),
+-                                               sprintf(_('%s\'s favorite notices'), ($user_profile) ? $user_profile->getBestName() : _('User')),
+-                                               $action == 'showfavorites');
+-              
+-              $cur = common_current_user();
+-              
+-              if ($cur && $cur->id == $user->id) {
+-                      
+-                      common_menu_item(common_local_url('inbox', array('nickname' =>
+-                                                                                                                                       $nickname)),
+-                                                       _('Inbox'),
+-                                                       _('Your incoming messages'),
+-                                                       $action == 'inbox');
+-                      common_menu_item(common_local_url('outbox', array('nickname' =>
+-                                                                                                                                       $nickname)),
+-                                                       _('Outbox'),
+-                                                       _('Your sent messages'),
+-                                                       $action == 'outbox');
+-              }
+-              
+-              common_element_end('ul');
+-      }
++        common_menu_item(common_local_url('all', array('nickname' =>
++                                                       $nickname)),
++                         _('Personal'),
++                         sprintf(_('%s and friends'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
++                         $action == 'all');
++        common_menu_item(common_local_url('replies', array('nickname' =>
++                                                              $nickname)),
++                         _('Replies'),
++                         sprintf(_('Replies to %s'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
++                         $action == 'replies');
++        common_menu_item(common_local_url('showstream', array('nickname' =>
++                                                              $nickname)),
++                         _('Profile'),
++                         ($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname,
++                         $action == 'showstream');
++        common_menu_item(common_local_url('showfavorites', array('nickname' =>
++                                                              $nickname)),
++                         _('Favorites'),
++                         sprintf(_('%s\'s favorite notices'), ($user_profile) ? $user_profile->getBestName() : _('User')),
++                         $action == 'showfavorites');
++        
++        $cur = common_current_user();
++        
++        if ($cur && $cur->id == $user->id) {
++            
++            common_menu_item(common_local_url('inbox', array('nickname' =>
++                                                                     $nickname)),
++                             _('Inbox'),
++                             _('Your incoming messages'),
++                             $action == 'inbox');
++            common_menu_item(common_local_url('outbox', array('nickname' =>
++                                                                     $nickname)),
++                             _('Outbox'),
++                             _('Your sent messages'),
++                             $action == 'outbox');
++        }
++        
++        common_element_end('ul');
++    }
+hunk ./lib/personal.php 88
+-      function show_feeds_list($feeds) {
+-              common_element_start('div', array('class' => 'feeds'));
+-              common_element('p', null, 'Feeds:');
+-              common_element_start('ul', array('class' => 'xoxo'));
++    function show_feeds_list($feeds) {
++        common_element_start('div', array('class' => 'feeds'));
++        common_element('p', null, 'Feeds:');
++        common_element_start('ul', array('class' => 'xoxo'));
+hunk ./lib/personal.php 93
+-              foreach ($feeds as $key => $value) {
+-                      $this->common_feed_item($feeds[$key]);
+-              }
+-              common_element_end('ul');
+-              common_element_end('div');
+-      }
++        foreach ($feeds as $key => $value) {
++            $this->common_feed_item($feeds[$key]);
++        }
++        common_element_end('ul');
++        common_element_end('div');
++    }
+hunk ./lib/personal.php 100
+-      function common_feed_item($feed) {
+-              $nickname = $this->trimmed('nickname');
++    function common_feed_item($feed) {
++        $nickname = $this->trimmed('nickname');
+hunk ./lib/personal.php 103
+-              switch($feed['item']) {
+-                      case 'notices': default:
+-                              $feed_classname = $feed['type'];
+-                              $feed_mimetype = "application/".$feed['type']."+xml";
+-                              $feed_title = "$nickname's ".$feed['version']." notice feed";
+-                              $feed['textContent'] = "RSS";
+-                              break;
++        switch($feed['item']) {
++            case 'notices': default:
++                $feed_classname = $feed['type'];
++                $feed_mimetype = "application/".$feed['type']."+xml";
++                $feed_title = "$nickname's ".$feed['version']." notice feed";
++                $feed['textContent'] = "RSS";
++                break;
+hunk ./lib/personal.php 111
+-                      case 'allrss':
+-                              $feed_classname = $feed['type'];
+-                              $feed_mimetype = "application/".$feed['type']."+xml";
+-                              $feed_title = $feed['version']." feed for $nickname and friends";
+-                              $feed['textContent'] = "RSS";
+-                              break;
++            case 'allrss':
++                $feed_classname = $feed['type'];
++                $feed_mimetype = "application/".$feed['type']."+xml";
++                $feed_title = $feed['version']." feed for $nickname and friends";
++                $feed['textContent'] = "RSS";
++                break;
+hunk ./lib/personal.php 118
+-                      case 'repliesrss':
+-                              $feed_classname = $feed['type'];
+-                              $feed_mimetype = "application/".$feed['type']."+xml";
+-                              $feed_title = $feed['version']." feed for replies to $nickname";
+-                              $feed['textContent'] = "RSS";
+-                              break;
++            case 'repliesrss':
++                $feed_classname = $feed['type'];
++                $feed_mimetype = "application/".$feed['type']."+xml";
++                $feed_title = $feed['version']." feed for replies to $nickname";
++                $feed['textContent'] = "RSS";
++                break;
+hunk ./lib/personal.php 125
+-                      case 'publicrss':
+-                              $feed_classname = $feed['type'];
+-                              $feed_mimetype = "application/".$feed['type']."+xml";
+-                              $feed_title = "Public timeline ".$feed['version']." feed";
+-                              $feed['textContent'] = "RSS";
+-                              break;
++            case 'publicrss':
++                $feed_classname = $feed['type'];
++                $feed_mimetype = "application/".$feed['type']."+xml";
++                $feed_title = "Public timeline ".$feed['version']." feed";
++                $feed['textContent'] = "RSS";
++                break;
+hunk ./lib/personal.php 132
+-                      case 'publicatom':
+-                              $feed_classname = "atom";
+-                              $feed_mimetype = "application/".$feed['type']."+xml";
+-                              $feed_title = "Public timeline ".$feed['version']." feed";
+-                              $feed['textContent'] = "Atom";
+-                              break;
++            case 'publicatom':
++                $feed_classname = "atom";
++                $feed_mimetype = "application/".$feed['type']."+xml";
++                $feed_title = "Public timeline ".$feed['version']." feed";
++                $feed['textContent'] = "Atom";
++                break;
+hunk ./lib/personal.php 139
+-                      case 'tagrss':
+-                              $feed_classname = $feed['type'];
+-                              $feed_mimetype = "application/".$feed['type']."+xml";
+-                              $feed_title = $feed['version']." feed for this tag";
+-                              $feed['textContent'] = "RSS";
+-                              break;
++            case 'tagrss':
++                $feed_classname = $feed['type'];
++                $feed_mimetype = "application/".$feed['type']."+xml";
++                $feed_title = $feed['version']." feed for this tag";
++                $feed['textContent'] = "RSS";
++                break;
+hunk ./lib/personal.php 146
+-                      case 'favoritedrss':
+-                              $feed_classname = $feed['type'];
+-                              $feed_mimetype = "application/".$feed['type']."+xml";
+-                              $feed_title = "Favorited ".$feed['version']." feed";
+-                              $feed['textContent'] = "RSS";
+-                              break;
++            case 'favoritedrss':
++                $feed_classname = $feed['type'];
++                $feed_mimetype = "application/".$feed['type']."+xml";
++                $feed_title = "Favorited ".$feed['version']." feed";
++                $feed['textContent'] = "RSS";
++                break;
+hunk ./lib/personal.php 153
+-                      case 'foaf':
+-                              $feed_classname = "foaf";
+-                              $feed_mimetype = "application/".$feed['type']."+xml";
+-                              $feed_title = "$nickname's FOAF file";
+-                              $feed['textContent'] = "FOAF";
+-                              break;
++            case 'foaf':
++                $feed_classname = "foaf";
++                $feed_mimetype = "application/".$feed['type']."+xml";
++                $feed_title = "$nickname's FOAF file";
++                $feed['textContent'] = "FOAF";
++                break;
+hunk ./lib/personal.php 160
+-                      case 'favoritesrss':
+-                              $feed_classname = "favorites";
+-                              $feed_mimetype = "application/".$feed['type']."+xml";
+-                              $feed_title = "Feed for favorites of $nickname";
+-                              $feed['textContent'] = "RSS";
+-                              break;
++            case 'favoritesrss':
++                $feed_classname = "favorites";
++                $feed_mimetype = "application/".$feed['type']."+xml";
++                $feed_title = "Feed for favorites of $nickname";
++                $feed['textContent'] = "RSS";
++                break;
+hunk ./lib/personal.php 167
+-                      case 'usertimeline':
+-                              $feed_classname = "atom";
+-                              $feed_mimetype = "application/".$feed['type']."+xml";
+-                              $feed_title = "$nickname's ".$feed['version']." notice feed";
+-                              $feed['textContent'] = "Atom";
+-                              break;
+-              }
+-              common_element_start('li');
+-              common_element('a', array('href' => $feed['href'],
+-                                                                'class' => $feed_classname,
+-                                                                'type' => $feed_mimetype,
+-                                                                'title' => $feed_title),
+-                                                      $feed['textContent']);
+-              common_element_end('li');
+-      }
++            case 'usertimeline':
++                $feed_classname = "atom";
++                $feed_mimetype = "application/".$feed['type']."+xml";
++                $feed_title = "$nickname's ".$feed['version']." notice feed";
++                $feed['textContent'] = "Atom";
++                break;
++        }
++        common_element_start('li');
++        common_element('a', array('href' => $feed['href'],
++                                  'class' => $feed_classname,
++                                  'type' => $feed_mimetype,
++                                  'title' => $feed_title),
++                            $feed['textContent']);
++        common_element_end('li');
++    }
+hunk ./lib/personal.php 183
+-      
+-      function source_link($source) {
+-              $source_name = _($source);
+-              switch ($source) {
+-               case 'web':
+-               case 'xmpp':
+-               case 'mail':
+-               case 'omb':
+-               case 'api':
+-                      common_element('span', 'noticesource', $source_name);
+-                      break;
+-               default:
+-                      $ns = Notice_source::staticGet($source);
+-                      if ($ns) {
+-                              common_element('a', array('href' => $ns->url),
+-                                                         $ns->name);
+-                      } else {
+-                              common_element('span', 'noticesource', $source_name);
+-                      }
+-                      break;
+-              }
+-              return;
+-      }
++    
++    function source_link($source) {
++        $source_name = _($source);
++        switch ($source) {
++         case 'web':
++         case 'xmpp':
++         case 'mail':
++         case 'omb':
++         case 'api':
++            common_element('span', 'noticesource', $source_name);
++            break;
++         default:
++            $ns = Notice_source::staticGet($source);
++            if ($ns) {
++                common_element('a', array('href' => $ns->url),
++                               $ns->name);
++            } else {
++                common_element('span', 'noticesource', $source_name);
++            }
++            break;
++        }
++        return;
++    }
+hunk ./lib/profilelist.php 27
+-      var $profile = NULL;
+-      var $owner = NULL;
+-      var $action = NULL;
++    var $profile = NULL;
++    var $owner = NULL;
++    var $action = NULL;
+hunk ./lib/profilelist.php 31
+-      function __construct($profile, $owner=NULL, $action=NULL) {
+-              $this->profile = $profile;
+-              $this->owner = $owner;
+-              $this->action = $action;
+-      }
++    function __construct($profile, $owner=NULL, $action=NULL) {
++        $this->profile = $profile;
++        $this->owner = $owner;
++        $this->action = $action;
++    }
+hunk ./lib/profilelist.php 37
+-      function show_list() {
++    function show_list() {
+hunk ./lib/profilelist.php 39
+-              common_element_start('ul', array('id' => 'profiles', 'class' => 'profile_list'));
++        common_element_start('ul', array('id' => 'profiles', 'class' => 'profile_list'));
+hunk ./lib/profilelist.php 41
+-              $cnt = 0;
++        $cnt = 0;
+hunk ./lib/profilelist.php 43
+-              while ($this->profile->fetch()) {
+-                      $cnt++;
+-                      if($cnt > PROFILES_PER_PAGE) {
+-                              break;
+-                      }
+-                      $this->show();
+-              }
++        while ($this->profile->fetch()) {
++            $cnt++;
++            if($cnt > PROFILES_PER_PAGE) {
++                break;
++            }
++            $this->show();
++        }
+hunk ./lib/profilelist.php 51
+-              common_element_end('ul');
++        common_element_end('ul');
+hunk ./lib/profilelist.php 53
+-              return $cnt;
+-      }
++        return $cnt;
++    }
+hunk ./lib/profilelist.php 56
+-      function show() {
++    function show() {
+hunk ./lib/profilelist.php 58
+-              common_element_start('li', array('class' => 'profile_single',
+-                                                                               'id' => 'profile-' . $this->profile->id));
++        common_element_start('li', array('class' => 'profile_single',
++                                         'id' => 'profile-' . $this->profile->id));
+hunk ./lib/profilelist.php 61
+-              $user = common_current_user();
++        $user = common_current_user();
+hunk ./lib/profilelist.php 63
+-              if ($user && $user->id != $this->profile->id) {
+-                      # XXX: special-case for user looking at own
+-                      # subscriptions page
+-                      if ($user->isSubscribed($this->profile)) {
+-                              common_unsubscribe_form($this->profile);
+-                      } else {
+-                              common_subscribe_form($this->profile);
+-                      }
+-              }
++        if ($user && $user->id != $this->profile->id) {
++            # XXX: special-case for user looking at own
++            # subscriptions page
++            if ($user->isSubscribed($this->profile)) {
++                common_unsubscribe_form($this->profile);
++            } else {
++                common_subscribe_form($this->profile);
++            }
++        }
+hunk ./lib/profilelist.php 73
+-              $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
+-              common_element_start('a', array('href' => $this->profile->profileurl));
+-              common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
+-                                                                      'class' => 'avatar stream',
+-                                                                      'width' => AVATAR_STREAM_SIZE,
+-                                                                      'height' => AVATAR_STREAM_SIZE,
+-                                                                      'alt' =>
+-                                                                      ($this->profile->fullname) ? $this->profile->fullname :
+-                                                                      $this->profile->nickname));
+-              common_element_end('a');
+-              common_element_start('p');
+-              common_element_start('a', array('href' => $this->profile->profileurl,
+-                                                                              'class' => 'nickname'));
+-              common_raw($this->highlight($this->profile->nickname));
+-              common_element_end('a');
+-              if ($this->profile->fullname) {
+-                      common_text(' | ');
+-                      common_element_start('span', 'fullname');
+-                      common_raw($this->highlight($this->profile->fullname));
+-                      common_element_end('span');
+-              }
+-              if ($this->profile->location) {
+-                      common_text(' | ');
+-                      common_element_start('span', 'location');
+-                      common_raw($this->highlight($this->profile->location));
+-                      common_element_end('span');
+-              }
+-              common_element_end('p');
+-              if ($this->profile->homepage) {
+-                      common_element_start('p', 'website');
+-                      common_element_start('a', array('href' => $this->profile->homepage));
+-                      common_raw($this->highlight($this->profile->homepage));
+-                      common_element_end('a');
+-                      common_element_end('p');
+-              }
+-              if ($this->profile->bio) {
+-                      common_element_start('p', 'bio');
+-                      common_raw($this->highlight($this->profile->bio));
+-                      common_element_end('p');
+-              }
++        $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
++        common_element_start('a', array('href' => $this->profile->profileurl));
++        common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
++                                    'class' => 'avatar stream',
++                                    'width' => AVATAR_STREAM_SIZE,
++                                    'height' => AVATAR_STREAM_SIZE,
++                                    'alt' =>
++                                    ($this->profile->fullname) ? $this->profile->fullname :
++                                    $this->profile->nickname));
++        common_element_end('a');
++        common_element_start('p');
++        common_element_start('a', array('href' => $this->profile->profileurl,
++                                        'class' => 'nickname'));
++        common_raw($this->highlight($this->profile->nickname));
++        common_element_end('a');
++        if ($this->profile->fullname) {
++            common_text(' | ');
++            common_element_start('span', 'fullname');
++            common_raw($this->highlight($this->profile->fullname));
++            common_element_end('span');
++        }
++        if ($this->profile->location) {
++            common_text(' | ');
++            common_element_start('span', 'location');
++            common_raw($this->highlight($this->profile->location));
++            common_element_end('span');
++        }
++        common_element_end('p');
++        if ($this->profile->homepage) {
++            common_element_start('p', 'website');
++            common_element_start('a', array('href' => $this->profile->homepage));
++            common_raw($this->highlight($this->profile->homepage));
++            common_element_end('a');
++            common_element_end('p');
++        }
++        if ($this->profile->bio) {
++            common_element_start('p', 'bio');
++            common_raw($this->highlight($this->profile->bio));
++            common_element_end('p');
++        }
+hunk ./lib/profilelist.php 114
+-              # If we're on a list with an owner (subscriptions or subscribers)...
++        # If we're on a list with an owner (subscriptions or subscribers)...
+hunk ./lib/profilelist.php 116
+-              if ($this->owner) {
+-                      # Get tags
+-                      $tags = Profile_tag::getTags($this->owner->id, $this->profile->id);
++        if ($this->owner) {
++            # Get tags
++            $tags = Profile_tag::getTags($this->owner->id, $this->profile->id);
+hunk ./lib/profilelist.php 120
+-                      common_element_start('div', 'tags_user');
+-                      common_element_start('dl');
+-                      common_element_start('dt');
+-                      if ($user->id == $this->owner->id) {
+-                              common_element('a', array('href' => common_local_url('tagother',
+-                                                                                                                                       array('id' => $this->profile->id))),
+-                                                         _('Tags'));
+-                      } else {
+-                              common_text(_('Tags'));
+-                      }
+-                      common_text(":");
+-                      common_element_end('dt');
+-                      common_element_start('dd');
+-                      if ($tags) {
+-                              common_element_start('ul', 'tags xoxo');
+-                              foreach ($tags as $tag) {
+-                                      common_element_start('li');
+-                                      common_element('a', array('rel' => 'tag',
+-                                                                                        'href' => common_local_url($this->action,
+-                                                                                                                                               array('nickname' => $this->owner->nickname,
+-                                                                                                                                                         'tag' => $tag))),
+-                                                                 $tag);
+-                                      common_element_end('li');
+-                              }
+-                              common_element_end('ul');
+-                      } else {
+-                              common_text(_('(none)'));
+-                      }
+-                      common_element_end('dd');
+-                      common_element_end('dl');
+-                      common_element_end('div');
+-              }
++            common_element_start('div', 'tags_user');
++            common_element_start('dl');
++            common_element_start('dt');
++            if ($user->id == $this->owner->id) {
++                common_element('a', array('href' => common_local_url('tagother',
++                                                                     array('id' => $this->profile->id))),
++                               _('Tags'));
++            } else {
++                common_text(_('Tags'));
++            }
++            common_text(":");
++            common_element_end('dt');
++            common_element_start('dd');
++            if ($tags) {
++                common_element_start('ul', 'tags xoxo');
++                foreach ($tags as $tag) {
++                    common_element_start('li');
++                    common_element('a', array('rel' => 'tag',
++                                              'href' => common_local_url($this->action,
++                                                                         array('nickname' => $this->owner->nickname,
++                                                                               'tag' => $tag))),
++                                   $tag);
++                    common_element_end('li');
++                }
++                common_element_end('ul');
++            } else {
++                common_text(_('(none)'));
++            }
++            common_element_end('dd');
++            common_element_end('dl');
++            common_element_end('div');
++        }
+hunk ./lib/profilelist.php 157
+-              common_element_end('li');
+-      }
++        common_element_end('li');
++    }
+hunk ./lib/profilelist.php 166
+-      function highlight($text) {
+-              return htmlspecialchars($text);
+-      }
++    function highlight($text) {
++        return htmlspecialchars($text);
++    }
+hunk ./lib/queuehandler.php 30
+-      var $_id = 'generic';
++    var $_id = 'generic';
+hunk ./lib/queuehandler.php 32
+-      function QueueHandler($id=NULL) {
+-              if ($id) {
+-                      $this->set_id($id);
+-              }
+-      }
+-      
+-      function class_name() {
+-              return ucfirst($this->transport()) . 'Handler';
+-      }
++    function QueueHandler($id=NULL) {
++        if ($id) {
++            $this->set_id($id);
++        }
++    }
++    
++    function class_name() {
++        return ucfirst($this->transport()) . 'Handler';
++    }
+hunk ./lib/queuehandler.php 42
+-      function name() {
+-              return strtolower($this->class_name().'.'.$this->get_id());
+-      }
+-      
+-      function get_id() {
+-              return $this->_id;
+-      }
++    function name() {
++        return strtolower($this->class_name().'.'.$this->get_id());
++    }
++    
++    function get_id() {
++        return $this->_id;
++    }
+hunk ./lib/queuehandler.php 50
+-      function set_id($id) {
+-              $this->_id = $id;
+-      }
+-      
+-      function transport() {
+-              return NULL;
+-      }
+-      
+-      function start() {
+-      }
+-      
+-      function finish() {
+-      }
++    function set_id($id) {
++        $this->_id = $id;
++    }
++    
++    function transport() {
++        return NULL;
++    }
++    
++    function start() {
++    }
++    
++    function finish() {
++    }
+hunk ./lib/queuehandler.php 64
+-      function handle_notice($notice) {
+-              return true;
+-      }
+-      
+-      function run() {
+-              if (!$this->start()) {
+-                      return false;
+-              }
+-              $this->log(LOG_INFO, 'checking for queued notices');
+-              $transport = $this->transport();
+-              do {
+-                      $qi = Queue_item::top($transport);
+-                      if ($qi) {
+-                              $this->log(LOG_INFO, 'Got item enqueued '.common_exact_date($qi->created));
+-                              $notice = Notice::staticGet($qi->notice_id);
+-                              if ($notice) {
+-                                      $this->log(LOG_INFO, 'broadcasting notice ID = ' . $notice->id);
+-                                      # XXX: what to do if broadcast fails?
+-                                      $result = $this->handle_notice($notice);
+-                                      if (!$result) {
+-                                              $this->log(LOG_WARNING, 'Failed broadcast for notice ID = ' . $notice->id);
+-                                              $orig = $qi;
+-                                              $qi->claimed = NULL;
+-                                              $qi->update($orig);
+-                                              $this->log(LOG_WARNING, 'Abandoned claim for notice ID = ' . $notice->id);
+-                                              continue;
+-                                      }
+-                                      $this->log(LOG_INFO, 'finished broadcasting notice ID = ' . $notice->id);
+-                                      $notice->free();
+-                                      unset($notice);
+-                                      $notice = NULL;
+-                              } else {
+-                                      $this->log(LOG_WARNING, 'queue item for notice that does not exist');
+-                              }
+-                              $qi->delete();
+-                              $qi->free();
+-                              unset($qi);
+-                              $this->idle(0);
+-                      } else {
+-                              $this->clear_old_claims();
+-                              $this->idle(5);
+-                      }       
+-              } while (true);
+-              if (!$this->finish()) {
+-                      return false;
+-              }
+-              return true;
+-      }
++    function handle_notice($notice) {
++        return true;
++    }
++    
++    function run() {
++        if (!$this->start()) {
++            return false;
++        }
++        $this->log(LOG_INFO, 'checking for queued notices');
++        $transport = $this->transport();
++        do {
++            $qi = Queue_item::top($transport);
++            if ($qi) {
++                $this->log(LOG_INFO, 'Got item enqueued '.common_exact_date($qi->created));
++                $notice = Notice::staticGet($qi->notice_id);
++                if ($notice) {
++                    $this->log(LOG_INFO, 'broadcasting notice ID = ' . $notice->id);
++                    # XXX: what to do if broadcast fails?
++                    $result = $this->handle_notice($notice);
++                    if (!$result) {
++                        $this->log(LOG_WARNING, 'Failed broadcast for notice ID = ' . $notice->id);
++                        $orig = $qi;
++                        $qi->claimed = NULL;
++                        $qi->update($orig);
++                        $this->log(LOG_WARNING, 'Abandoned claim for notice ID = ' . $notice->id);
++                        continue;
++                    }
++                    $this->log(LOG_INFO, 'finished broadcasting notice ID = ' . $notice->id);
++                    $notice->free();
++                    unset($notice);
++                    $notice = NULL;
++                } else {
++                    $this->log(LOG_WARNING, 'queue item for notice that does not exist');
++                }
++                $qi->delete();
++                $qi->free();
++                unset($qi);
++                $this->idle(0);
++            } else {
++                $this->clear_old_claims();
++                $this->idle(5);
++            }    
++        } while (true);
++        if (!$this->finish()) {
++            return false;
++        }
++        return true;
++    }
+hunk ./lib/queuehandler.php 113
+-      function idle($timeout=0) {
+-              if ($timeout>0) {
+-                      sleep($timeout);
+-              }
+-      }
+-      
+-      function clear_old_claims() {
+-              $qi = new Queue_item();
+-              $qi->transport = $this->transport();
+-              $qi->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
+-              $qi->update(DB_DATAOBJECT_WHEREADD_ONLY);
+-              $qi->free();
+-              unset($qi);
+-      }
+-      
+-      function log($level, $msg) {
+-              common_log($level, $this->class_name() . ' ('. $this->get_id() .'): '.$msg);
+-      }
++    function idle($timeout=0) {
++        if ($timeout>0) {
++            sleep($timeout);
++        }
++    }
++    
++    function clear_old_claims() {
++        $qi = new Queue_item();
++        $qi->transport = $this->transport();
++        $qi->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
++        $qi->update(DB_DATAOBJECT_WHEREADD_ONLY);
++        $qi->free();
++        unset($qi);
++    }
++    
++    function log($level, $msg) {
++        common_log($level, $this->class_name() . ' ('. $this->get_id() .'): '.$msg);
++    }
+hunk ./lib/queuehandler.php 132
+-      
++    
+hunk ./lib/rssaction.php 26
+-      # This will contain the details of each feed item's author and be used to generate SIOC data.
+-      var $creators = array();
++    # This will contain the details of each feed item's author and be used to generate SIOC data.
++    var $creators = array();
+hunk ./lib/rssaction.php 29
+-      function is_readonly() {
+-              return true;
+-      }
++    function is_readonly() {
++        return true;
++    }
+hunk ./lib/rssaction.php 33
+-      function handle($args) {
+-              parent::handle($args);
+-              $limit = (int) $this->trimmed('limit');
+-              if ($limit == 0) {
+-                      $limit = DEFAULT_RSS_LIMIT;
+-              }
+-              $this->show_rss($limit);
+-      }
++    function handle($args) {
++        parent::handle($args);
++        $limit = (int) $this->trimmed('limit');
++        if ($limit == 0) {
++            $limit = DEFAULT_RSS_LIMIT;
++        }
++        $this->show_rss($limit);
++    }
+hunk ./lib/rssaction.php 42
+-      function init() {
+-              return true;
+-      }
++    function init() {
++        return true;
++    }
+hunk ./lib/rssaction.php 46
+-      function get_notices() {
+-              return array();
+-      }
++    function get_notices() {
++        return array();
++    }
+hunk ./lib/rssaction.php 50
+-      function get_channel() {
+-              return array('url' => '',
+-                                       'title' => '',
+-                                       'link' => '',
+-                                       'description' => '');
+-      }
++    function get_channel() {
++        return array('url' => '',
++                     'title' => '',
++                     'link' => '',
++                     'description' => '');
++    }
+hunk ./lib/rssaction.php 57
+-      function get_image() {
+-              return NULL;
+-      }
++    function get_image() {
++        return NULL;
++    }
+hunk ./lib/rssaction.php 61
+-      function show_rss($limit=0) {
++    function show_rss($limit=0) {
+hunk ./lib/rssaction.php 63
+-              if (!$this->init()) {
+-                      return;
+-              }
++        if (!$this->init()) {
++            return;
++        }
+hunk ./lib/rssaction.php 67
+-              $notices = $this->get_notices($limit);
++        $notices = $this->get_notices($limit);
+hunk ./lib/rssaction.php 69
+-              $this->init_rss();
+-              $this->show_channel($notices);
+-              $this->show_image();
++        $this->init_rss();
++        $this->show_channel($notices);
++        $this->show_image();
+hunk ./lib/rssaction.php 73
+-              foreach ($notices as $n) {
+-                      $this->show_item($n);
+-              }
++        foreach ($notices as $n) {
++            $this->show_item($n);
++        }
+hunk ./lib/rssaction.php 77
+-              $this->show_creators();
+-              $this->end_rss();
+-      }
++        $this->show_creators();
++        $this->end_rss();
++    }
+hunk ./lib/rssaction.php 81
+-      function show_channel($notices) {
++    function show_channel($notices) {
+hunk ./lib/rssaction.php 83
+-              $channel = $this->get_channel();
+-              $image = $this->get_image();
++        $channel = $this->get_channel();
++        $image = $this->get_image();
+hunk ./lib/rssaction.php 86
+-              common_element_start('channel', array('rdf:about' => $channel['url']));
+-              common_element('title', NULL, $channel['title']);
+-              common_element('link', NULL, $channel['link']);
+-              common_element('description', NULL, $channel['description']);
+-              common_element('cc:licence', array('rdf:resource' => common_config('license','url')));
++        common_element_start('channel', array('rdf:about' => $channel['url']));
++        common_element('title', NULL, $channel['title']);
++        common_element('link', NULL, $channel['link']);
++        common_element('description', NULL, $channel['description']);
++        common_element('cc:licence', array('rdf:resource' => common_config('license','url')));
+hunk ./lib/rssaction.php 92
+-              if ($image) {
+-                      common_element('image', array('rdf:resource' => $image));
+-              }
++        if ($image) {
++            common_element('image', array('rdf:resource' => $image));
++        }
+hunk ./lib/rssaction.php 96
+-              common_element_start('items');
+-              common_element_start('rdf:Seq');
++        common_element_start('items');
++        common_element_start('rdf:Seq');
+hunk ./lib/rssaction.php 99
+-              foreach ($notices as $notice) {
+-                      common_element('sioct:MicroblogPost', array('rdf:resource' => $notice->uri));
+-              }
++        foreach ($notices as $notice) {
++            common_element('sioct:MicroblogPost', array('rdf:resource' => $notice->uri));
++        }
+hunk ./lib/rssaction.php 103
+-              common_element_end('rdf:Seq');
+-              common_element_end('items');
++        common_element_end('rdf:Seq');
++        common_element_end('items');
+hunk ./lib/rssaction.php 106
+-              common_element_end('channel');
+-      }
++        common_element_end('channel');
++    }
+hunk ./lib/rssaction.php 109
+-      function show_image() {
+-              $image = $this->get_image();
+-              if ($image) {
+-                      $channel = $this->get_channel();
+-                      common_element_start('image', array('rdf:about' => $image));
+-                      common_element('title', NULL, $channel['title']);
+-                      common_element('link', NULL, $channel['link']);
+-                      common_element('url', NULL, $image);
+-                      common_element_end('image');
+-              }
+-      }
++    function show_image() {
++        $image = $this->get_image();
++        if ($image) {
++            $channel = $this->get_channel();
++            common_element_start('image', array('rdf:about' => $image));
++            common_element('title', NULL, $channel['title']);
++            common_element('link', NULL, $channel['link']);
++            common_element('url', NULL, $image);
++            common_element_end('image');
++        }
++    }
+hunk ./lib/rssaction.php 121
+-      function show_item($notice) {
+-              $profile = Profile::staticGet($notice->profile_id);
+-              $nurl = common_local_url('shownotice', array('notice' => $notice->id));
+-              $creator_uri = common_profile_uri($profile);
+-              common_element_start('item', array('rdf:about' => $notice->uri));
+-              $title = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
+-              common_element('title', NULL, $title);
+-              common_element('link', NULL, $nurl);
+-              common_element('description', NULL, $profile->nickname."'s status on ".common_exact_date($notice->created));
+-              common_element('dc:date', NULL, common_date_w3dtf($notice->created));
+-              common_element('dc:creator', NULL, ($profile->fullname) ? $profile->fullname : $profile->nickname);
+-              common_element('sioc:has_creator', array('rdf:resource' => $creator_uri));
+-              common_element('laconica:postIcon', array('rdf:resource' => common_profile_avatar_url($profile)));
+-              common_element('cc:licence', array('rdf:resource' => common_config('license', 'url')));
+-              common_element_end('item');
+-              $this->creators[$creator_uri] = $profile;
+-      }
++    function show_item($notice) {
++        $profile = Profile::staticGet($notice->profile_id);
++        $nurl = common_local_url('shownotice', array('notice' => $notice->id));
++        $creator_uri = common_profile_uri($profile);
++        common_element_start('item', array('rdf:about' => $notice->uri));
++        $title = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
++        common_element('title', NULL, $title);
++        common_element('link', NULL, $nurl);
++        common_element('description', NULL, $profile->nickname."'s status on ".common_exact_date($notice->created));
++        common_element('dc:date', NULL, common_date_w3dtf($notice->created));
++        common_element('dc:creator', NULL, ($profile->fullname) ? $profile->fullname : $profile->nickname);
++        common_element('sioc:has_creator', array('rdf:resource' => $creator_uri));
++        common_element('laconica:postIcon', array('rdf:resource' => common_profile_avatar_url($profile)));
++        common_element('cc:licence', array('rdf:resource' => common_config('license', 'url')));
++        common_element_end('item');
++        $this->creators[$creator_uri] = $profile;
++    }
+hunk ./lib/rssaction.php 139
+-      function show_creators() {
+-              foreach ($this->creators as $uri => $profile) {
+-                      $id = $profile->id;
+-                      $nickname = $profile->nickname;
+-                      common_element_start('sioc:User', array('rdf:about' => $uri));
+-                      common_element('foaf:nick', NULL, $nickname);
+-                      if ($profile->fullname) {
+-                              common_element('foaf:name', NULL, $profile->fullname);
+-                      }
+-                      common_element('sioc:id', NULL, $id);
+-                      $avatar = common_profile_avatar_url($profile);
+-                      common_element('sioc:avatar', array('rdf:resource' => $avatar));
+-                      common_element_end('sioc:User');
+-              }
+-      }
++    function show_creators() {
++        foreach ($this->creators as $uri => $profile) {
++            $id = $profile->id;
++            $nickname = $profile->nickname;
++            common_element_start('sioc:User', array('rdf:about' => $uri));
++            common_element('foaf:nick', NULL, $nickname);
++            if ($profile->fullname) {
++                common_element('foaf:name', NULL, $profile->fullname);
++            }
++            common_element('sioc:id', NULL, $id);
++            $avatar = common_profile_avatar_url($profile);
++            common_element('sioc:avatar', array('rdf:resource' => $avatar));
++            common_element_end('sioc:User');
++        }
++    }
+hunk ./lib/rssaction.php 155
+-      function init_rss() {
+-              $channel = $this->get_channel();
+-              header('Content-Type: application/rdf+xml');
++    function init_rss() {
++        $channel = $this->get_channel();
++        header('Content-Type: application/rdf+xml');
+hunk ./lib/rssaction.php 159
+-              common_start_xml();
+-              common_element_start('rdf:RDF', array('xmlns:rdf' =>
+-                                                                                        'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
+-                                                                                        'xmlns:dc' =>
+-                                                                                        'http://purl.org/dc/elements/1.1/',
+-                                                                                        'xmlns:cc' =>
+-                                                                                        'http://web.resource.org/cc/',
++        common_start_xml();
++        common_element_start('rdf:RDF', array('xmlns:rdf' =>
++                                              'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
++                                              'xmlns:dc' =>
++                                              'http://purl.org/dc/elements/1.1/',
++                                              'xmlns:cc' =>
++                                              'http://web.resource.org/cc/',
+hunk ./lib/rssaction.php 168
+-                                                                                        'xmlns:foaf' =>
+-                                                                                        'http://xmlns.com/foaf/0.1/',
+-                                                                                        'xmlns:sioc' =>
+-                                                                                        'http://rdfs.org/sioc/ns#',
+-                                                    'xmlns:sioct' =>
+-                                                    'http://rdfs.org/sioc/types#',
+-                                                    'xmlns:laconica' =>
+-                                                    'http://laconi.ca/ont/',
+-                                                                                        'xmlns' => 'http://purl.org/rss/1.0/'));
+-              common_element_start('sioc:Site', array('rdf:about' => common_root_url()));
+-              common_element('sioc:name', NULL, common_config('site', 'name'));
+-              common_element_start('sioc:container_of');
+-              common_element('sioc:Container', array('rdf:about' =>
+-                                                     $channel['url']));
+-              common_element_end('sioc:container_of');
+-              common_element_end('sioc:Site');
+-      }
++                                              'xmlns:foaf' =>
++                                              'http://xmlns.com/foaf/0.1/',
++                                              'xmlns:sioc' =>
++                                              'http://rdfs.org/sioc/ns#',
++                                              'xmlns:sioct' =>
++                                              'http://rdfs.org/sioc/types#',
++                                              'xmlns:laconica' =>
++                                              'http://laconi.ca/ont/',
++                                              'xmlns' => 'http://purl.org/rss/1.0/'));
++        common_element_start('sioc:Site', array('rdf:about' => common_root_url()));
++        common_element('sioc:name', NULL, common_config('site', 'name'));
++        common_element_start('sioc:container_of');
++        common_element('sioc:Container', array('rdf:about' =>
++                                               $channel['url']));
++        common_element_end('sioc:container_of');
++        common_element_end('sioc:Site');
++    }
+hunk ./lib/rssaction.php 186
+-      function end_rss() {
+-              common_element_end('rdf:RDF');
+-      }
++    function end_rss() {
++        common_element_end('rdf:RDF');
++    }
+hunk ./lib/search_engines.php 101
+-                                                 'against (\''.addslashes($q).'\')');
++                           'against (\''.addslashes($q).'\')');
+hunk ./lib/search_engines.php 104
+-                                                 'against (\''.addslashes($q).'\')');
++                           'against (\''.addslashes($q).'\')');
+hunk ./lib/searchaction.php 24
+-      function is_readonly() {
+-              return true;
+-      }
++    function is_readonly() {
++        return true;
++    }
+hunk ./lib/searchaction.php 28
+-      function handle($args) {
+-              parent::handle($args);
+-              $this->show_form();
+-      }
++    function handle($args) {
++        parent::handle($args);
++        $this->show_form();
++    }
+hunk ./lib/searchaction.php 33
+-      function show_top($arr=NULL) {
+-              if ($arr) {
+-                      $error = $arr[1];
+-              }
+-              if ($error) {
+-                      common_element('p', 'error', $error);
+-              } else {
+-                      $instr = $this->get_instructions();
+-                      $output = common_markup_to_html($instr);
+-                      common_element_start('div', 'instructions');
+-                      common_raw($output);
+-                      common_element_end('div');
+-              }
+-              $this->search_menu();
+-      }
++    function show_top($arr=NULL) {
++        if ($arr) {
++            $error = $arr[1];
++        }
++        if ($error) {
++            common_element('p', 'error', $error);
++        } else {
++            $instr = $this->get_instructions();
++            $output = common_markup_to_html($instr);
++            common_element_start('div', 'instructions');
++            common_raw($output);
++            common_element_end('div');
++        }
++        $this->search_menu();
++    }
+hunk ./lib/searchaction.php 49
+-      function get_title() {
+-              return NULL;
+-      }
++    function get_title() {
++        return NULL;
++    }
+hunk ./lib/searchaction.php 53
+-      function show_header($arr) {
+-              return;
+-      }
++    function show_header($arr) {
++        return;
++    }
+hunk ./lib/searchaction.php 57
+-      function show_form($error=NULL) {
+-              global $config;
++    function show_form($error=NULL) {
++        global $config;
+hunk ./lib/searchaction.php 60
+-              $q = $this->trimmed('q');
+-              $page = $this->trimmed('page', 1);
++        $q = $this->trimmed('q');
++        $page = $this->trimmed('page', 1);
+hunk ./lib/searchaction.php 63
+-              common_show_header($this->get_title(), array($this, 'show_header'), array($q, $error),
+-                                                 array($this, 'show_top'));
+-              common_element_start('form', array('method' => 'get',
+-                                                                                 'id' => 'login',
+-                                                                                 'action' => common_local_url($this->trimmed('action'))));
+-              common_element_start('p');
+-              if (!isset($config['site']['fancy']) || !$config['site']['fancy']) {
+-                      common_element('input', array('name' => 'action',
+-                                                                                'type' => 'hidden',
+-                                                                                'value' => $this->trimmed('action')));
+-              }
+-              common_element('input', array('name' => 'q',
+-                                                                        'id' => 'q',
+-                                                                        'type' => 'text',
+-                                                                        'class' => 'input_text',
+-                                                                        'value' => ($q) ? $q : ''));
+-              common_text(' ');
+-              common_element('input', array('type' => 'submit',
+-                                                                        'id' => 'search',
+-                                                                        'name' => 'search',
+-                                                                        'class' => 'submit',
+-                                                                        'value' => _('Search')));
++        common_show_header($this->get_title(), array($this, 'show_header'), array($q, $error),
++                           array($this, 'show_top'));
++        common_element_start('form', array('method' => 'get',
++                                           'id' => 'login',
++                                           'action' => common_local_url($this->trimmed('action'))));
++        common_element_start('p');
++        if (!isset($config['site']['fancy']) || !$config['site']['fancy']) {
++            common_element('input', array('name' => 'action',
++                                          'type' => 'hidden',
++                                          'value' => $this->trimmed('action')));
++        }
++        common_element('input', array('name' => 'q',
++                                      'id' => 'q',
++                                      'type' => 'text',
++                                      'class' => 'input_text',
++                                      'value' => ($q) ? $q : ''));
++        common_text(' ');
++        common_element('input', array('type' => 'submit',
++                                      'id' => 'search',
++                                      'name' => 'search',
++                                      'class' => 'submit',
++                                      'value' => _('Search')));
+hunk ./lib/searchaction.php 86
+-              common_element_end('p');
+-              common_element_end('form');
+-              if ($q) {
+-                      $this->show_results($q, $page);
+-              }
+-              common_show_footer();
+-      }
++        common_element_end('p');
++        common_element_end('form');
++        if ($q) {
++            $this->show_results($q, $page);
++        }
++        common_show_footer();
++    }
+hunk ./lib/searchaction.php 94
+-      function search_menu() {
+-              # action => array('prompt', 'title', $args)
+-              $action = $this->trimmed('action');
+-              $menu =
+-                array('peoplesearch' =>
+-                              array(
+-                                        _('People'),
+-                                        _('Find people on this site'),
+-                                        ($action != 'peoplesearch' && $this->trimmed('q')) ? array('q' => $this->trimmed('q')) : NULL),
+-                              'noticesearch' =>
+-                              array( _('Text'),
+-                                         _('Find content of notices'),
+-                                         ($action != 'noticesearch' && $this->trimmed('q')) ? array('q' => $this->trimmed('q')) : NULL)
+-                              );
+-              $this->nav_menu($menu);
+-      }
++    function search_menu() {
++        # action => array('prompt', 'title', $args)
++        $action = $this->trimmed('action');
++        $menu =
++          array('peoplesearch' =>
++                array(
++                      _('People'),
++                      _('Find people on this site'),
++                      ($action != 'peoplesearch' && $this->trimmed('q')) ? array('q' => $this->trimmed('q')) : NULL),
++                'noticesearch' =>
++                array( _('Text'),
++                       _('Find content of notices'),
++                       ($action != 'noticesearch' && $this->trimmed('q')) ? array('q' => $this->trimmed('q')) : NULL)
++                );
++        $this->nav_menu($menu);
++    }
+hunk ./lib/settingsaction.php 30
+-              # Cookie theft means that automatic logins can't
+-              # change important settings or see private info, and
+-              # _all_ our settings are important
++            # Cookie theft means that automatic logins can't
++            # change important settings or see private info, and
++            # _all_ our settings are important
+hunk ./lib/settingsaction.php 58
+-      function form_header($title, $msg=NULL, $success=false) {
+-              common_show_header($title,
+-                                 NULL,
+-                                 array($msg, $success),
+-                                                 array($this, 'show_top'));
+-      }
++    function form_header($title, $msg=NULL, $success=false) {
++        common_show_header($title,
++                           NULL,
++                           array($msg, $success),
++                           array($this, 'show_top'));
++    }
+hunk ./lib/settingsaction.php 65
+-      function show_top($arr) {
+-              $msg = $arr[0];
+-              $success = $arr[1];
+-              if ($msg) {
+-                      $this->message($msg, $success);
+-              } else {
+-                      $inst = $this->get_instructions();
+-                      $output = common_markup_to_html($inst);
+-                      common_element_start('div', 'instructions');
+-                      common_raw($output);
+-                      common_element_end('div');
+-              }
+-              $this->settings_menu();
+-      }
++    function show_top($arr) {
++        $msg = $arr[0];
++        $success = $arr[1];
++        if ($msg) {
++            $this->message($msg, $success);
++        } else {
++            $inst = $this->get_instructions();
++            $output = common_markup_to_html($inst);
++            common_element_start('div', 'instructions');
++            common_raw($output);
++            common_element_end('div');
++        }
++        $this->settings_menu();
++    }
+hunk ./lib/settingsaction.php 82
+-              $menu =
+-                array('profilesettings' =>
+-                              array(_('Profile'),
+-                                        _('Change your profile settings')),
+-                              'emailsettings' =>
+-                              array(_('Email'),
+-                                        _('Change email handling')),
+-                              'openidsettings' =>
+-                              array(_('OpenID'),
+-                                        _('Add or remove OpenIDs')),
+-                              'smssettings' =>
+-                              array(_('SMS'),
+-                                        _('Updates by SMS')),
+-                              'imsettings' =>
+-                              array(_('IM'),
+-                                        _('Updates by instant messenger (IM)')),
+-                              'twittersettings' =>
+-                              array(_('Twitter'),
+-                                        _('Twitter integration options')),
+-                              'othersettings' =>
+-                              array(_('Other'),
+-                                        _('Other options')));
+-              
++        $menu =
++          array('profilesettings' =>
++                array(_('Profile'),
++                      _('Change your profile settings')),
++                'emailsettings' =>
++                array(_('Email'),
++                      _('Change email handling')),
++                'openidsettings' =>
++                array(_('OpenID'),
++                      _('Add or remove OpenIDs')),
++                'smssettings' =>
++                array(_('SMS'),
++                      _('Updates by SMS')),
++                'imsettings' =>
++                array(_('IM'),
++                      _('Updates by instant messenger (IM)')),
++                'twittersettings' =>
++                array(_('Twitter'),
++                      _('Twitter integration options')),
++                'othersettings' =>
++                array(_('Other'),
++                      _('Other options')));
++        
+hunk ./lib/settingsaction.php 108
+-                      if ($menuaction == 'imsettings' &&
+-                              !common_config('xmpp', 'enabled')) {
+-                              continue;
+-                      }
++            if ($menuaction == 'imsettings' &&
++                !common_config('xmpp', 'enabled')) {
++                continue;
++            }
+hunk ./lib/stream.php 13
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+hunk ./lib/stream.php 17
+- * along with this program.    If not, see <http://www.gnu.org/licenses/>.
++ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+hunk ./lib/stream.php 27
+-      function public_views_menu() {
++    function public_views_menu() {
+hunk ./lib/stream.php 29
+-              $action = $this->trimmed('action');
++        $action = $this->trimmed('action');
+hunk ./lib/stream.php 31
+-              common_element_start('ul', array('id' => 'nav_views'));
++        common_element_start('ul', array('id' => 'nav_views'));
+hunk ./lib/stream.php 33
+-              common_menu_item(common_local_url('public'), _('Public'),
+-                      _('Public timeline'), $action == 'public');
++        common_menu_item(common_local_url('public'), _('Public'),
++            _('Public timeline'), $action == 'public');
+hunk ./lib/stream.php 36
+-              common_menu_item(common_local_url('tag'), _('Recent tags'),
+-                      _('Recent tags'), $action == 'tag');
++        common_menu_item(common_local_url('tag'), _('Recent tags'),
++            _('Recent tags'), $action == 'tag');
+hunk ./lib/stream.php 39
+-              if (count(common_config('nickname', 'featured')) > 0) {
+-                      common_menu_item(common_local_url('featured'), _('Featured'),
+-                              _('Featured users'), $action == 'featured');
+-              }
++        if (count(common_config('nickname', 'featured')) > 0) {
++            common_menu_item(common_local_url('featured'), _('Featured'),
++                _('Featured users'), $action == 'featured');
++        }
+hunk ./lib/stream.php 44
+-              common_menu_item(common_local_url('favorited'), _('Popular'),
+-                      _("Popular notices"), $action == 'favorited');
++        common_menu_item(common_local_url('favorited'), _('Popular'),
++            _("Popular notices"), $action == 'favorited');
+hunk ./lib/stream.php 47
+-              common_element_end('ul');
++        common_element_end('ul');
+hunk ./lib/stream.php 49
+-      }
++    }
+hunk ./lib/subs.php 30
+-      $other = User::staticGet('nickname', $other_nickname);
++    $other = User::staticGet('nickname', $other_nickname);
+hunk ./lib/subs.php 32
+-      if (!$other) {
+-              return _('No such user.');
+-      }
++    if (!$other) {
++        return _('No such user.');
++    }
+hunk ./lib/subs.php 36
+-      return subs_subscribe_to($user, $other);
++    return subs_subscribe_to($user, $other);
+hunk ./lib/subs.php 46
+-      if ($user->isSubscribed($other)) {
+-              return _('Already subscribed!.');
+-      }
++    if ($user->isSubscribed($other)) {
++        return _('Already subscribed!.');
++    }
+hunk ./lib/subs.php 51
+-              return _('User has blocked you.');
++        return _('User has blocked you.');
+hunk ./lib/subs.php 54
+-      if (!$user->subscribeTo($other)) {
+-              return _('Could not subscribe.');
+-              return;
+-      }
++    if (!$user->subscribeTo($other)) {
++        return _('Could not subscribe.');
++        return;
++    }
+hunk ./lib/subs.php 61
+-      if (common_config('memcached', 'enabled')) {
+-              $cache = new Memcache();
+-              if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
+-                      $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+-              }
+-      }
++    if (common_config('memcached', 'enabled')) {
++        $cache = new Memcache();
++        if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
++            $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
++        }
++    }
+hunk ./lib/subs.php 68
+-      if ($other->autosubscribe && !$other->isSubscribed($user) && !$user->hasBlocked($other)) {
+-              if (!$other->subscribeTo($user)) {
+-                      return _('Could not subscribe other to you.');
+-              }
+-              if (common_config('memcached', 'enabled')) {
+-                      $cache = new Memcache();
+-                      if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
+-                              $cache->delete(common_cache_key('user:notices_with_friends:' . $other->id));
+-                      }
+-              }
++    if ($other->autosubscribe && !$other->isSubscribed($user) && !$user->hasBlocked($other)) {
++        if (!$other->subscribeTo($user)) {
++            return _('Could not subscribe other to you.');
++        }
++        if (common_config('memcached', 'enabled')) {
++            $cache = new Memcache();
++            if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
++                $cache->delete(common_cache_key('user:notices_with_friends:' . $other->id));
++            }
++        }
+hunk ./lib/subs.php 79
+-              subs_notify($user, $other);
+-      }
++        subs_notify($user, $other);
++    }
+hunk ./lib/subs.php 82
+-      return true;
++    return true;
+hunk ./lib/subs.php 86
+-      # XXX: add other notifications (Jabber, SMS) here
+-      # XXX: queue this and handle it offline
+-      # XXX: Whatever happens, do it in Twitter-like API, too
+-      subs_notify_email($listenee, $listener);
++    # XXX: add other notifications (Jabber, SMS) here
++    # XXX: queue this and handle it offline
++    # XXX: Whatever happens, do it in Twitter-like API, too
++    subs_notify_email($listenee, $listener);
+hunk ./lib/subs.php 93
+-      mail_subscribe_notify($listenee, $listener);
++    mail_subscribe_notify($listenee, $listener);
+hunk ./lib/subs.php 102
+-      $other = User::staticGet('nickname', $other_nickname);
++    $other = User::staticGet('nickname', $other_nickname);
+hunk ./lib/subs.php 104
+-      if (!$other) {
+-              return _('No such user.');
+-      }
++    if (!$other) {
++        return _('No such user.');
++    }
+hunk ./lib/subs.php 108
+-      return subs_unsubscribe_to($user, $other->getProfile());
++    return subs_unsubscribe_to($user, $other->getProfile());
+hunk ./lib/subs.php 116
+-      if (!$user->isSubscribed($other))
+-              return _('Not subscribed!.');
++    if (!$user->isSubscribed($other))
++        return _('Not subscribed!.');
+hunk ./lib/subs.php 119
+-      $sub = DB_DataObject::factory('subscription');
++    $sub = DB_DataObject::factory('subscription');
+hunk ./lib/subs.php 121
+-      $sub->subscriber = $user->id;
+-      $sub->subscribed = $other->id;
++    $sub->subscriber = $user->id;
++    $sub->subscribed = $other->id;
+hunk ./lib/subs.php 124
+-      $sub->find(true);
++    $sub->find(true);
+hunk ./lib/subs.php 126
+-      // note we checked for existence above
++    // note we checked for existence above
+hunk ./lib/subs.php 128
+-      if (!$sub->delete())
+-              return _('Couldn\'t delete subscription.');
++    if (!$sub->delete())
++        return _('Couldn\'t delete subscription.');
+hunk ./lib/subs.php 131
+-      if (common_config('memcached', 'enabled')) {
+-              $cache = new Memcache();
+-              if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
+-                      $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+-              }
+-      }
++    if (common_config('memcached', 'enabled')) {
++        $cache = new Memcache();
++        if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
++            $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
++        }
++    }
+hunk ./lib/subs.php 138
+-      return true;
++    return true;
+hunk ./lib/theme.php 23
+-      $theme = common_config('site', 'theme');
+-      return INSTALLDIR.'/theme/'.$theme.'/'.$relative;
++    $theme = common_config('site', 'theme');
++    return INSTALLDIR.'/theme/'.$theme.'/'.$relative;
+hunk ./lib/theme.php 28
+-      $theme = common_config('site', 'theme');
+-      $server = common_config('theme', 'server');
+-      if ($server) {
+-              return 'http://'.$server.'/'.$theme.'/'.$relative;
+-      } else {
+-              return common_path('theme/'.$theme.'/'.$relative);
+-      }
++    $theme = common_config('site', 'theme');
++    $server = common_config('theme', 'server');
++    if ($server) {
++        return 'http://'.$server.'/'.$theme.'/'.$relative;
++    } else {
++        return common_path('theme/'.$theme.'/'.$relative);
++    }
+hunk ./lib/twitter.php 24
+-      $options = array(
+-                      CURLOPT_USERPWD => sprintf("%s:%s", $screen_name, $password),
+-                      CURLOPT_RETURNTRANSFER  => true,
+-                      CURLOPT_FAILONERROR             => true,
+-                      CURLOPT_HEADER                  => false,
+-                      CURLOPT_FOLLOWLOCATION  => true,
+-                      // CURLOPT_USERAGENT            => "identi.ca",
+-                      CURLOPT_CONNECTTIMEOUT  => 120,
+-                      CURLOPT_TIMEOUT                 => 120
+-      );
++    $options = array(
++            CURLOPT_USERPWD => sprintf("%s:%s", $screen_name, $password),
++            CURLOPT_RETURNTRANSFER    => true,
++            CURLOPT_FAILONERROR        => true,
++            CURLOPT_HEADER            => false,
++            CURLOPT_FOLLOWLOCATION    => true,
++            // CURLOPT_USERAGENT        => "identi.ca",
++            CURLOPT_CONNECTTIMEOUT    => 120,
++            CURLOPT_TIMEOUT            => 120
++    );
+hunk ./lib/twitter.php 36
+-      $ch = curl_init($uri);
++    $ch = curl_init($uri);
+hunk ./lib/twitter.php 41
+-      if ($errmsg) {
+-              common_debug("Twitter bridge - cURL error: $errmsg - trying to load: $uri with user $twit_user.",
+-                      __FILE__);
+-      }
++    if ($errmsg) {
++        common_debug("Twitter bridge - cURL error: $errmsg - trying to load: $uri with user $twit_user.",
++            __FILE__);
++    }
+hunk ./lib/twitter.php 46
+-      curl_close($ch);
++    curl_close($ch);
+hunk ./lib/twitter.php 48
+-      return $data;
++    return $data;
+hunk ./lib/twitter.php 53
+-      $uri = "http://twitter.com/users/show/$screen_name.json";
+-      $data = get_twitter_data($uri, $screen_name, $password);
++    $uri = "http://twitter.com/users/show/$screen_name.json";
++    $data = get_twitter_data($uri, $screen_name, $password);
+hunk ./lib/twitter.php 56
+-      if (!$data) {
+-              return false;
+-      }
++    if (!$data) {
++        return false;
++    }
+hunk ./lib/twitter.php 60
+-      $twit_user = json_decode($data);
++    $twit_user = json_decode($data);
+hunk ./lib/twitter.php 62
+-      if (!$twit_user) {
+-              return false;
+-      }
++    if (!$twit_user) {
++        return false;
++    }
+hunk ./lib/twitter.php 66
+-      return $twit_user;
++    return $twit_user;
+hunk ./lib/twitter.php 71
+-      $original = clone($fuser);
+-      $fuser->nickname = $screen_name;
+-      $fuser->uri = 'http://twitter.com/' . $screen_name;
+-      $result = $fuser->updateKeys($original);
++    $original = clone($fuser);
++    $fuser->nickname = $screen_name;
++    $fuser->uri = 'http://twitter.com/' . $screen_name;
++    $result = $fuser->updateKeys($original);
+hunk ./lib/twitter.php 76
+-      if (!$result) {
+-              common_log_db_error($fuser, 'UPDATE', __FILE__);
+-              return false;
+-      }
++    if (!$result) {
++        common_log_db_error($fuser, 'UPDATE', __FILE__);
++        return false;
++    }
+hunk ./lib/twitter.php 81
+-      return true;
++    return true;
+hunk ./lib/twitter.php 86
+-      // Otherwise, create a new Twitter user
+-      $fuser = DB_DataObject::factory('foreign_user');
++    // Otherwise, create a new Twitter user
++    $fuser = DB_DataObject::factory('foreign_user');
+hunk ./lib/twitter.php 89
+-      $fuser->nickname = $screen_name;
+-      $fuser->uri = 'http://twitter.com/' . $screen_name;
+-      $fuser->id = $twitter_id;
+-      $fuser->service = 1; // Twitter
+-      $fuser->created = common_sql_now();
+-      $result = $fuser->insert();
++    $fuser->nickname = $screen_name;
++    $fuser->uri = 'http://twitter.com/' . $screen_name;
++    $fuser->id = $twitter_id;
++    $fuser->service = 1; // Twitter
++    $fuser->created = common_sql_now();
++    $result = $fuser->insert();
+hunk ./lib/twitter.php 96
+-      if (!$result) {
+-              common_debug("Twitter bridge - failed to add new Twitter user: $twitter_id - $screen_name.");
+-              common_log_db_error($fuser, 'INSERT', __FILE__);
+-              return false;
+-      }
++    if (!$result) {
++        common_debug("Twitter bridge - failed to add new Twitter user: $twitter_id - $screen_name.");
++        common_log_db_error($fuser, 'INSERT', __FILE__);
++        return false;
++    }
+hunk ./lib/twitter.php 102
+-      common_debug("Twitter bridge - Added new Twitter user: $screen_name ($twitter_id).");
++    common_debug("Twitter bridge - Added new Twitter user: $screen_name ($twitter_id).");
+hunk ./lib/twitter.php 104
+-      return true;
++    return true;
+hunk ./lib/twitter.php 110
+-      // Check to see whether the Twitter user is already in the system,
+-      // and update its screen name and uri if so.
+-      $fuser = Foreign_user::getForeignUser($twitter_id, 1);
++    // Check to see whether the Twitter user is already in the system,
++    // and update its screen name and uri if so.
++    $fuser = Foreign_user::getForeignUser($twitter_id, 1);
+hunk ./lib/twitter.php 114
+-      if ($fuser) {
++    if ($fuser) {
+hunk ./lib/twitter.php 116
+-              // Only update if Twitter screen name has changed
+-              if ($fuser->nickname != $screen_name) {
++        // Only update if Twitter screen name has changed
++        if ($fuser->nickname != $screen_name) {
+hunk ./lib/twitter.php 119
+-                      common_debug('Twitter bridge - Updated nickname (and URI) for Twitter user ' .
+-                              "$fuser->id to $screen_name, was $fuser->nickname");
++            common_debug('Twitter bridge - Updated nickname (and URI) for Twitter user ' .
++                "$fuser->id to $screen_name, was $fuser->nickname");
+hunk ./lib/twitter.php 122
+-                      return update_twitter_user($fuser, $twitter_id, $screen_name);
+-              }
++            return update_twitter_user($fuser, $twitter_id, $screen_name);
++        }
+hunk ./lib/twitter.php 125
+-      } else {
+-              return add_twitter_user($twitter_id, $screen_name);
+-      }
++    } else {
++        return add_twitter_user($twitter_id, $screen_name);
++    }
+hunk ./lib/twitter.php 129
+-      return true;
++    return true;
+hunk ./lib/twitter.php 134
+-      $uri = "http://twitter.com/statuses/friends/$twitter_id.json?page=";
+-      $twitter_user = twitter_user_info($screen_name, $password);
++    $uri = "http://twitter.com/statuses/friends/$twitter_id.json?page=";
++    $twitter_user = twitter_user_info($screen_name, $password);
+hunk ./lib/twitter.php 137
+-      // Calculate how many pages to get...
+-      $pages = ceil($twitter_user->friends_count / 100);
++    // Calculate how many pages to get...
++    $pages = ceil($twitter_user->friends_count / 100);
+hunk ./lib/twitter.php 140
+-      if ($pages == 0) {
+-              common_debug("Twitter bridge - Twitter user $screen_name has no friends! Lame.");
+-      }
++    if ($pages == 0) {
++        common_debug("Twitter bridge - Twitter user $screen_name has no friends! Lame.");
++    }
+hunk ./lib/twitter.php 144
+-      $friends = array();
++    $friends = array();
+hunk ./lib/twitter.php 146
+-      for ($i = 1; $i <= $pages; $i++) {
++    for ($i = 1; $i <= $pages; $i++) {
+hunk ./lib/twitter.php 148
+-              $data = get_twitter_data($uri . $i, $screen_name, $password);
++        $data = get_twitter_data($uri . $i, $screen_name, $password);
+hunk ./lib/twitter.php 150
+-              if (!$data) {
+-                      return NULL;
+-              }
++        if (!$data) {
++            return NULL;
++        }
+hunk ./lib/twitter.php 154
+-              $more_friends = json_decode($data);
++        $more_friends = json_decode($data);
+hunk ./lib/twitter.php 156
+-              if (!$more_friends) {
+-                      return NULL;
+-              }
++        if (!$more_friends) {
++            return NULL;
++        }
+hunk ./lib/twitter.php 160
+-              $friends = array_merge($friends, $more_friends);
+-      }
++         $friends = array_merge($friends, $more_friends);
++    }
+hunk ./lib/twitter.php 163
+-      return $friends;
++    return $friends;
+hunk ./lib/twitter.php 168
+-      $friends = retreive_twitter_friends($twitter_id, $screen_name, $password);
++    $friends = retreive_twitter_friends($twitter_id, $screen_name, $password);
+hunk ./lib/twitter.php 170
+-      if (is_null($friends)) {
+-              common_debug("Twitter bridge - Couldn't get friends data from Twitter.");
+-              return false;
+-      }
++    if (is_null($friends)) {
++        common_debug("Twitter bridge - Couldn't get friends data from Twitter.");
++        return false;
++    }
+hunk ./lib/twitter.php 177
+-              $friend_name = $friend->screen_name;
+-              $friend_id = $friend->id;
++        $friend_name = $friend->screen_name;
++        $friend_id = $friend->id;
+hunk ./lib/twitter.php 180
+-              // Update or create the Foreign_user record
+-              if (!save_twitter_user($friend_id, $friend_name)) {
+-                      return false;
+-              }
++        // Update or create the Foreign_user record
++        if (!save_twitter_user($friend_id, $friend_name)) {
++            return false;
++        }
+hunk ./lib/twitter.php 185
+-              // Check to see if there's a related local user
+-              $flink = Foreign_link::getByForeignID($friend_id, 1);
++        // Check to see if there's a related local user
++        $flink = Foreign_link::getByForeignID($friend_id, 1);
+hunk ./lib/twitter.php 188
+-              if ($flink) {
++        if ($flink) {
+hunk ./lib/twitter.php 190
+-                      // Get associated user and subscribe her
+-                      $friend_user = User::staticGet('id', $flink->user_id);
+-                      subs_subscribe_to($user, $friend_user);
+-                      common_debug("Twitter bridge - subscribed $friend_user->nickname to $user->nickname.");
+-              }
+-      }
++            // Get associated user and subscribe her
++            $friend_user = User::staticGet('id', $flink->user_id);
++            subs_subscribe_to($user, $friend_user);
++            common_debug("Twitter bridge - subscribed $friend_user->nickname to $user->nickname.");
++        }
++    }
+hunk ./lib/twitter.php 197
+-      return true;
++    return true;
+hunk ./lib/twitterapi.php 24
+-      var $auth_user;
++    var $auth_user;
+hunk ./lib/twitterapi.php 26
+-      function handle($args) {
+-              parent::handle($args);
+-      }
++    function handle($args) {
++        parent::handle($args);
++    }
+hunk ./lib/twitterapi.php 30
+-      function twitter_user_array($profile, $get_notice=false) {
++    function twitter_user_array($profile, $get_notice=false) {
+hunk ./lib/twitterapi.php 32
+-              $twitter_user = array();
++        $twitter_user = array();
+hunk ./lib/twitterapi.php 34
+-              $twitter_user['name'] = $profile->getBestName();
+-              $twitter_user['followers_count'] = $this->count_subscriptions($profile);
+-              $twitter_user['screen_name'] = $profile->nickname;
+-              $twitter_user['description'] = ($profile->bio) ? $profile->bio : NULL;
+-              $twitter_user['location'] = ($profile->location) ? $profile->location : NULL;
+-              $twitter_user['id'] = intval($profile->id);
++        $twitter_user['name'] = $profile->getBestName();
++        $twitter_user['followers_count'] = $this->count_subscriptions($profile);
++        $twitter_user['screen_name'] = $profile->nickname;
++        $twitter_user['description'] = ($profile->bio) ? $profile->bio : NULL;
++        $twitter_user['location'] = ($profile->location) ? $profile->location : NULL;
++        $twitter_user['id'] = intval($profile->id);
+hunk ./lib/twitterapi.php 41
+-              $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
++        $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
+hunk ./lib/twitterapi.php 43
+-              $twitter_user['profile_image_url'] = ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE);
+-              $twitter_user['protected'] = 'false'; # not supported by Laconica yet
+-              $twitter_user['url'] = ($profile->homepage) ? $profile->homepage : NULL;
++        $twitter_user['profile_image_url'] = ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE);
++        $twitter_user['protected'] = 'false'; # not supported by Laconica yet
++        $twitter_user['url'] = ($profile->homepage) ? $profile->homepage : NULL;
+hunk ./lib/twitterapi.php 47
+-              if ($get_notice) {
+-                      $notice = $profile->getCurrentNotice();
+-                      if ($notice) {
+-                              # don't get user!
+-                              $twitter_user['status'] = $this->twitter_status_array($notice, false);
+-                      }
+-              }
++        if ($get_notice) {
++            $notice = $profile->getCurrentNotice();
++            if ($notice) {
++                # don't get user!
++                $twitter_user['status'] = $this->twitter_status_array($notice, false);
++            }
++        }
+hunk ./lib/twitterapi.php 55
+-              return $twitter_user;
+-      }
++        return $twitter_user;
++    }
+hunk ./lib/twitterapi.php 58
+-      function twitter_status_array($notice, $include_user=true) {
++    function twitter_status_array($notice, $include_user=true) {
+hunk ./lib/twitterapi.php 60
+-              $profile = $notice->getProfile();
++        $profile = $notice->getProfile();
+hunk ./lib/twitterapi.php 62
+-              $twitter_status = array();
+-              $twitter_status['text'] = $notice->content;
+-              $twitter_status['truncated'] = 'false'; # Not possible on Laconica
+-              $twitter_status['created_at'] = $this->date_twitter($notice->created);
+-              $twitter_status['in_reply_to_status_id'] = ($notice->reply_to) ? intval($notice->reply_to) : NULL;
+-              $twitter_status['source'] = $this->source_link($notice->source);
+-              $twitter_status['id'] = intval($notice->id);
+-              $twitter_status['in_reply_to_user_id'] = ($notice->reply_to) ? $this->replier_by_reply(intval($notice->reply_to)) : NULL;
++        $twitter_status = array();
++        $twitter_status['text'] = $notice->content;
++        $twitter_status['truncated'] = 'false'; # Not possible on Laconica
++        $twitter_status['created_at'] = $this->date_twitter($notice->created);
++        $twitter_status['in_reply_to_status_id'] = ($notice->reply_to) ? intval($notice->reply_to) : NULL;
++        $twitter_status['source'] = $this->source_link($notice->source);
++        $twitter_status['id'] = intval($notice->id);
++        $twitter_status['in_reply_to_user_id'] = ($notice->reply_to) ? $this->replier_by_reply(intval($notice->reply_to)) : NULL;
+hunk ./lib/twitterapi.php 71
+-              if (isset($this->auth_user)) {
+-                      $twitter_status['favorited'] = ($this->auth_user->hasFave($notice)) ? 'true' : 'false';
+-              } else {
+-                      $twitter_status['favorited'] = 'false';
+-              }
++        if (isset($this->auth_user)) {
++            $twitter_status['favorited'] = ($this->auth_user->hasFave($notice)) ? 'true' : 'false';
++        } else {
++            $twitter_status['favorited'] = 'false';
++        }
+hunk ./lib/twitterapi.php 77
+-              if ($include_user) {
+-                      # Don't get notice (recursive!)
+-                      $twitter_user = $this->twitter_user_array($profile, false);
+-                      $twitter_status['user'] = $twitter_user;
+-              }
++        if ($include_user) {
++            # Don't get notice (recursive!)
++            $twitter_user = $this->twitter_user_array($profile, false);
++            $twitter_status['user'] = $twitter_user;
++        }
+hunk ./lib/twitterapi.php 83
+-              return $twitter_status;
+-      }
++        return $twitter_status;
++    }
+hunk ./lib/twitterapi.php 86
+-      function twitter_rss_entry_array($notice) {
++    function twitter_rss_entry_array($notice) {
+hunk ./lib/twitterapi.php 88
+-              $profile = $notice->getProfile();
++        $profile = $notice->getProfile();
+hunk ./lib/twitterapi.php 90
+-              $server = common_config('site', 'server');
+-              $entry = array();
++        $server = common_config('site', 'server');
++        $entry = array();
+hunk ./lib/twitterapi.php 95
+-              $entry['content'] = common_xml_safe_str(trim($notice->rendered));
+-              $entry['title'] = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
+-              $entry['link'] = common_local_url('shownotice', array('notice' => $notice->id));
+-              $entry['published'] = common_date_iso8601($notice->created);
+-              $entry['id'] = "tag:$server,2008:$entry[link]";
+-              $entry['updated'] = $entry['published'];
++        $entry['content'] = common_xml_safe_str(trim($notice->rendered));
++        $entry['title'] = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
++        $entry['link'] = common_local_url('shownotice', array('notice' => $notice->id));
++        $entry['published'] = common_date_iso8601($notice->created);
++        $entry['id'] = "tag:$server,2008:$entry[link]";
++        $entry['updated'] = $entry['published'];
+hunk ./lib/twitterapi.php 102
+-              # RSS Item specific
+-              $entry['description'] = $entry['content'];
+-              $entry['pubDate'] = common_date_rfc2822($notice->created);
+-              $entry['guid'] = $entry['link'];
++        # RSS Item specific
++        $entry['description'] = $entry['content'];
++        $entry['pubDate'] = common_date_rfc2822($notice->created);
++        $entry['guid'] = $entry['link'];
+hunk ./lib/twitterapi.php 107
+-              return $entry;
+-      }
++        return $entry;
++    }
+hunk ./lib/twitterapi.php 110
+-      function twitter_rss_dmsg_array($message) {
++    function twitter_rss_dmsg_array($message) {
+hunk ./lib/twitterapi.php 112
+-              $server = common_config('site', 'server');
+-              $entry = array();
++        $server = common_config('site', 'server');
++        $entry = array();
+hunk ./lib/twitterapi.php 115
+-              $entry['title'] = sprintf('Message from %s to %s',
+-                      $message->getFrom()->nickname, $message->getTo()->nickname);
++        $entry['title'] = sprintf('Message from %s to %s',
++            $message->getFrom()->nickname, $message->getTo()->nickname);
+hunk ./lib/twitterapi.php 118
+-              $entry['content'] = common_xml_safe_str(trim($message->content));
+-              $entry['link'] = common_local_url('showmessage', array('message' => $message->id));
+-              $entry['published'] = common_date_iso8601($message->created);
+-              $entry['id'] = "tag:$server,2008:$entry[link]";
+-              $entry['updated'] = $entry['published'];
++        $entry['content'] = common_xml_safe_str(trim($message->content));
++        $entry['link'] = common_local_url('showmessage', array('message' => $message->id));
++        $entry['published'] = common_date_iso8601($message->created);
++        $entry['id'] = "tag:$server,2008:$entry[link]";
++        $entry['updated'] = $entry['published'];
+hunk ./lib/twitterapi.php 124
+-              # RSS Item specific
+-              $entry['description'] = $entry['content'];
+-              $entry['pubDate'] = common_date_rfc2822($message->created);
+-              $entry['guid'] = $entry['link'];
++        # RSS Item specific
++        $entry['description'] = $entry['content'];
++        $entry['pubDate'] = common_date_rfc2822($message->created);
++        $entry['guid'] = $entry['link'];
+hunk ./lib/twitterapi.php 129
+-              return $entry;
+-      }
++        return $entry;
++    }
+hunk ./lib/twitterapi.php 132
+-      function twitter_dmsg_array($message) {
++    function twitter_dmsg_array($message) {
+hunk ./lib/twitterapi.php 134
+-              $twitter_dm = array();
++        $twitter_dm = array();
+hunk ./lib/twitterapi.php 136
+-              $from_profile = $message->getFrom();
+-              $to_profile = $message->getTo();
++        $from_profile = $message->getFrom();
++        $to_profile = $message->getTo();
+hunk ./lib/twitterapi.php 139
+-              $twitter_dm['id'] = $message->id;
+-              $twitter_dm['sender_id'] = $message->from_profile;
+-              $twitter_dm['text'] = trim($message->content);
+-              $twitter_dm['recipient_id'] = $message->to_profile;
+-              $twitter_dm['created_at'] = $this->date_twitter($message->created);
+-              $twitter_dm['sender_screen_name'] = $from_profile->nickname;
+-              $twitter_dm['recipient_screen_name'] = $to_profile->nickname;
+-              $twitter_dm['sender'] = $this->twitter_user_array($from_profile, false);
+-              $twitter_dm['recipient'] = $this->twitter_user_array($to_profile, false);
++        $twitter_dm['id'] = $message->id;
++        $twitter_dm['sender_id'] = $message->from_profile;
++        $twitter_dm['text'] = trim($message->content);
++        $twitter_dm['recipient_id'] = $message->to_profile;
++        $twitter_dm['created_at'] = $this->date_twitter($message->created);
++        $twitter_dm['sender_screen_name'] = $from_profile->nickname;
++        $twitter_dm['recipient_screen_name'] = $to_profile->nickname;
++        $twitter_dm['sender'] = $this->twitter_user_array($from_profile, false);
++        $twitter_dm['recipient'] = $this->twitter_user_array($to_profile, false);
+hunk ./lib/twitterapi.php 149
+-              return $twitter_dm;
+-      }
++        return $twitter_dm;
++    }
+hunk ./lib/twitterapi.php 152
+-      function show_twitter_xml_status($twitter_status) {
+-              common_element_start('status');
+-              foreach($twitter_status as $element => $value) {
+-                      switch ($element) {
+-                      case 'user':
+-                              $this->show_twitter_xml_user($twitter_status['user']);
+-                              break;
+-                      case 'text':
+-                              common_element($element, NULL, common_xml_safe_str($value));
+-                              break;
+-                      default:
+-                              common_element($element, NULL, $value);
+-                      }
+-              }
+-              common_element_end('status');
+-      }
++    function show_twitter_xml_status($twitter_status) {
++        common_element_start('status');
++        foreach($twitter_status as $element => $value) {
++            switch ($element) {
++            case 'user':
++                $this->show_twitter_xml_user($twitter_status['user']);
++                break;
++            case 'text':
++                common_element($element, NULL, common_xml_safe_str($value));
++                break;
++            default:
++                common_element($element, NULL, $value);
++            }
++        }
++        common_element_end('status');
++    }
+hunk ./lib/twitterapi.php 169
+-      function show_twitter_xml_user($twitter_user, $role='user') {
+-              common_element_start($role);
+-              foreach($twitter_user as $element => $value) {
+-                      if ($element == 'status') {
+-                              $this->show_twitter_xml_status($twitter_user['status']);
+-                      } else {
+-                              common_element($element, NULL, $value);
+-                      }
+-              }
+-              common_element_end($role);
+-      }
++    function show_twitter_xml_user($twitter_user, $role='user') {
++        common_element_start($role);
++        foreach($twitter_user as $element => $value) {
++            if ($element == 'status') {
++                $this->show_twitter_xml_status($twitter_user['status']);
++            } else {
++                common_element($element, NULL, $value);
++            }
++        }
++        common_element_end($role);
++    }
+hunk ./lib/twitterapi.php 181
+-      function show_twitter_rss_item($entry) {
+-              common_element_start('item');
+-              common_element('title', NULL, $entry['title']);
+-              common_element('description', NULL, $entry['description']);
+-              common_element('pubDate', NULL, $entry['pubDate']);
+-              common_element('guid', NULL, $entry['guid']);
+-              common_element('link', NULL, $entry['link']);
+-              common_element_end('item');
+-      }
++    function show_twitter_rss_item($entry) {
++        common_element_start('item');
++        common_element('title', NULL, $entry['title']);
++        common_element('description', NULL, $entry['description']);
++        common_element('pubDate', NULL, $entry['pubDate']);
++        common_element('guid', NULL, $entry['guid']);
++        common_element('link', NULL, $entry['link']);
++        common_element_end('item');
++    }
+hunk ./lib/twitterapi.php 191
+-      function show_twitter_atom_entry($entry) {
+-          common_element_start('entry');
+-              common_element('title', NULL, $entry['title']);
+-              common_element('content', array('type' => 'html'), $entry['content']);
+-              common_element('id', NULL, $entry['id']);
+-              common_element('published', NULL, $entry['published']);
+-              common_element('updated', NULL, $entry['updated']);
+-              common_element('link', array('href' => $entry['link'], 'rel' => 'alternate', 'type' => 'text/html'), NULL);
+-              common_element_end('entry');
+-      }
++    function show_twitter_atom_entry($entry) {
++        common_element_start('entry');
++        common_element('title', NULL, $entry['title']);
++        common_element('content', array('type' => 'html'), $entry['content']);
++        common_element('id', NULL, $entry['id']);
++        common_element('published', NULL, $entry['published']);
++        common_element('updated', NULL, $entry['updated']);
++        common_element('link', array('href' => $entry['link'], 'rel' => 'alternate', 'type' => 'text/html'), NULL);
++        common_element_end('entry');
++    }
+hunk ./lib/twitterapi.php 202
+-      function show_json_objects($objects) {
+-              print(json_encode($objects));
+-      }
++    function show_json_objects($objects) {
++        print(json_encode($objects));
++    }
+hunk ./lib/twitterapi.php 206
+-      function show_single_xml_status($notice) {
+-              $this->init_document('xml');
+-              $twitter_status = $this->twitter_status_array($notice);
+-              $this->show_twitter_xml_status($twitter_status);
+-              $this->end_document('xml');
+-      }
++    function show_single_xml_status($notice) {
++        $this->init_document('xml');
++        $twitter_status = $this->twitter_status_array($notice);
++        $this->show_twitter_xml_status($twitter_status);
++        $this->end_document('xml');
++    }
+hunk ./lib/twitterapi.php 213
+-      function show_single_json_status($notice) {
+-              $this->init_document('json');
+-              $status = $this->twitter_status_array($notice);
+-              $this->show_json_objects($status);
+-              $this->end_document('json');
+-      }
++    function show_single_json_status($notice) {
++        $this->init_document('json');
++        $status = $this->twitter_status_array($notice);
++        $this->show_json_objects($status);
++        $this->end_document('json');
++    }
+hunk ./lib/twitterapi.php 220
+-      function show_single_xml_dmsg($message) {
+-              $this->init_document('xml');
+-              $dmsg = $this->twitter_dmsg_array($message);
+-              $this->show_twitter_xml_dmsg($dmsg);
+-              $this->end_document('xml');
+-      }
++    function show_single_xml_dmsg($message) {
++        $this->init_document('xml');
++        $dmsg = $this->twitter_dmsg_array($message);
++        $this->show_twitter_xml_dmsg($dmsg);
++        $this->end_document('xml');
++    }
+hunk ./lib/twitterapi.php 227
+-      function show_single_json_dmsg($message) {
+-              $this->init_document('json');
+-              $dmsg = $this->twitter_dmsg_array($message);
+-              $this->show_json_objects($dmsg);
+-              $this->end_document('json');
+-      }
++    function show_single_json_dmsg($message) {
++        $this->init_document('json');
++        $dmsg = $this->twitter_dmsg_array($message);
++        $this->show_json_objects($dmsg);
++        $this->end_document('json');
++    }
+hunk ./lib/twitterapi.php 234
+-      function show_twitter_xml_dmsg($twitter_dm) {
+-              common_element_start('direct_message');
+-              foreach($twitter_dm as $element => $value) {
+-                      switch ($element) {
+-                      case 'sender':
+-                      case 'recipient':
+-                              $this->show_twitter_xml_user($value, $element);
+-                              break;
+-                      case 'text':
+-                              common_element($element, NULL, common_xml_safe_str($value));
+-                              break;
+-                      default:
+-                              common_element($element, NULL, $value);
+-                      }
+-              }
+-              common_element_end('direct_message');
+-      }
++    function show_twitter_xml_dmsg($twitter_dm) {
++        common_element_start('direct_message');
++        foreach($twitter_dm as $element => $value) {
++            switch ($element) {
++            case 'sender':
++            case 'recipient':
++                $this->show_twitter_xml_user($value, $element);
++                break;
++            case 'text':
++                common_element($element, NULL, common_xml_safe_str($value));
++                break;
++            default:
++                common_element($element, NULL, $value);
++            }
++        }
++        common_element_end('direct_message');
++    }
+hunk ./lib/twitterapi.php 252
+-      function show_xml_timeline($notice) {
++    function show_xml_timeline($notice) {
+hunk ./lib/twitterapi.php 254
+-              $this->init_document('xml');
+-              common_element_start('statuses', array('type' => 'array'));
++        $this->init_document('xml');
++        common_element_start('statuses', array('type' => 'array'));
+hunk ./lib/twitterapi.php 257
+-              if (is_array($notice)) {
+-                      foreach ($notice as $n) {
+-                              $twitter_status = $this->twitter_status_array($n);
+-                              $this->show_twitter_xml_status($twitter_status);
+-                      }
+-              } else {
+-                      while ($notice->fetch()) {
+-                              $twitter_status = $this->twitter_status_array($notice);
+-                              $this->show_twitter_xml_status($twitter_status);
+-                      }
+-              }
++        if (is_array($notice)) {
++            foreach ($notice as $n) {
++                $twitter_status = $this->twitter_status_array($n);
++                $this->show_twitter_xml_status($twitter_status);
++            }
++        } else {
++            while ($notice->fetch()) {
++                $twitter_status = $this->twitter_status_array($notice);
++                $this->show_twitter_xml_status($twitter_status);
++            }
++        }
+hunk ./lib/twitterapi.php 269
+-              common_element_end('statuses');
+-              $this->end_document('xml');
+-      }
++        common_element_end('statuses');
++        $this->end_document('xml');
++    }
+hunk ./lib/twitterapi.php 273
+-      function show_rss_timeline($notice, $title, $link, $subtitle, $suplink=NULL) {
++    function show_rss_timeline($notice, $title, $link, $subtitle, $suplink=NULL) {
+hunk ./lib/twitterapi.php 275
+-              $this->init_document('rss');
++        $this->init_document('rss');
+hunk ./lib/twitterapi.php 277
+-              common_element_start('channel');
+-              common_element('title', NULL, $title);
+-              common_element('link', NULL, $link);
+-              if (!is_null($suplink)) {
+-                      # For FriendFeed's SUP protocol
+-                      common_element('link', array('xmlns' => 'http://www.w3.org/2005/Atom',
+-                                                                               'rel' => 'http://api.friendfeed.com/2008/03#sup',
+-                                                                               'href' => $suplink,
+-                                                                               'type' => 'application/json'));
+-              }
+-              common_element('description', NULL, $subtitle);
+-              common_element('language', NULL, 'en-us');
+-              common_element('ttl', NULL, '40');
++        common_element_start('channel');
++        common_element('title', NULL, $title);
++        common_element('link', NULL, $link);
++        if (!is_null($suplink)) {
++            # For FriendFeed's SUP protocol
++            common_element('link', array('xmlns' => 'http://www.w3.org/2005/Atom',
++                                         'rel' => 'http://api.friendfeed.com/2008/03#sup',
++                                         'href' => $suplink,
++                                         'type' => 'application/json'));
++        }
++        common_element('description', NULL, $subtitle);
++        common_element('language', NULL, 'en-us');
++        common_element('ttl', NULL, '40');
+hunk ./lib/twitterapi.php 291
+-              if (is_array($notice)) {
+-                      foreach ($notice as $n) {
+-                              $entry = $this->twitter_rss_entry_array($n);
+-                              $this->show_twitter_rss_item($entry);
+-                      }
+-              } else {
+-                      while ($notice->fetch()) {
+-                              $entry = $this->twitter_rss_entry_array($notice);
+-                              $this->show_twitter_rss_item($entry);
+-                      }
+-              }
++        if (is_array($notice)) {
++            foreach ($notice as $n) {
++                $entry = $this->twitter_rss_entry_array($n);
++                $this->show_twitter_rss_item($entry);
++            }
++        } else {
++            while ($notice->fetch()) {
++                $entry = $this->twitter_rss_entry_array($notice);
++                $this->show_twitter_rss_item($entry);
++            }
++        }
+hunk ./lib/twitterapi.php 303
+-              common_element_end('channel');
+-              $this->end_twitter_rss();
+-      }
++        common_element_end('channel');
++        $this->end_twitter_rss();
++    }
+hunk ./lib/twitterapi.php 307
+-      function show_atom_timeline($notice, $title, $id, $link, $subtitle=NULL, $suplink=NULL) {
++    function show_atom_timeline($notice, $title, $id, $link, $subtitle=NULL, $suplink=NULL) {
+hunk ./lib/twitterapi.php 309
+-              $this->init_document('atom');
++        $this->init_document('atom');
+hunk ./lib/twitterapi.php 311
+-              common_element('title', NULL, $title);
+-              common_element('id', NULL, $id);
+-              common_element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), NULL);
+-              if (!is_null($suplink)) {
+-                      # For FriendFeed's SUP protocol
+-                      common_element('link', array('rel' => 'http://api.friendfeed.com/2008/03#sup',
+-                                                                               'href' => $suplink,
+-                                                                               'type' => 'application/json'));
+-              }
+-              common_element('subtitle', NULL, $subtitle);
++        common_element('title', NULL, $title);
++        common_element('id', NULL, $id);
++        common_element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), NULL);
++        if (!is_null($suplink)) {
++            # For FriendFeed's SUP protocol
++            common_element('link', array('rel' => 'http://api.friendfeed.com/2008/03#sup',
++                                         'href' => $suplink,
++                                         'type' => 'application/json'));
++        }
++        common_element('subtitle', NULL, $subtitle);
+hunk ./lib/twitterapi.php 322
+-              if (is_array($notice)) {
+-                      foreach ($notice as $n) {
+-                              $entry = $this->twitter_rss_entry_array($n);
+-                              $this->show_twitter_atom_entry($entry);
+-                      }
+-              } else {
+-                      while ($notice->fetch()) {
+-                              $entry = $this->twitter_rss_entry_array($notice);
+-                              $this->show_twitter_atom_entry($entry);
+-                      }
+-              }
++        if (is_array($notice)) {
++            foreach ($notice as $n) {
++                $entry = $this->twitter_rss_entry_array($n);
++                $this->show_twitter_atom_entry($entry);
++            }
++        } else {
++            while ($notice->fetch()) {
++                $entry = $this->twitter_rss_entry_array($notice);
++                $this->show_twitter_atom_entry($entry);
++            }
++        }
+hunk ./lib/twitterapi.php 334
+-              $this->end_document('atom');
++        $this->end_document('atom');
+hunk ./lib/twitterapi.php 336
+-      }
++    }
+hunk ./lib/twitterapi.php 338
+-      function show_json_timeline($notice) {
++    function show_json_timeline($notice) {
+hunk ./lib/twitterapi.php 340
+-              $this->init_document('json');
++        $this->init_document('json');
+hunk ./lib/twitterapi.php 342
+-              $statuses = array();
++        $statuses = array();
+hunk ./lib/twitterapi.php 344
+-              if (is_array($notice)) {
+-                      foreach ($notice as $n) {
+-                              $twitter_status = $this->twitter_status_array($n);
+-                              array_push($statuses, $twitter_status);
+-                      }
+-              } else {
+-                      while ($notice->fetch()) {
+-                              $twitter_status = $this->twitter_status_array($notice);
+-                              array_push($statuses, $twitter_status);
+-                      }
+-              }
++        if (is_array($notice)) {
++            foreach ($notice as $n) {
++                $twitter_status = $this->twitter_status_array($n);
++                array_push($statuses, $twitter_status);
++            }
++        } else {
++            while ($notice->fetch()) {
++                $twitter_status = $this->twitter_status_array($notice);
++                array_push($statuses, $twitter_status);
++            }
++        }
+hunk ./lib/twitterapi.php 356
+-              $this->show_json_objects($statuses);
++        $this->show_json_objects($statuses);
+hunk ./lib/twitterapi.php 358
+-              $this->end_document('json');
+-      }
++        $this->end_document('json');
++    }
+hunk ./lib/twitterapi.php 361
+-      // Anyone know what date format this is?
+-      // Twitter's dates look like this: "Mon Jul 14 23:52:38 +0000 2008" -- Zach
+-      function date_twitter($dt) {
+-              $t = strtotime($dt);
+-              return date("D M d G:i:s O Y", $t);
+-      }
++    // Anyone know what date format this is?
++    // Twitter's dates look like this: "Mon Jul 14 23:52:38 +0000 2008" -- Zach
++    function date_twitter($dt) {
++        $t = strtotime($dt);
++        return date("D M d G:i:s O Y", $t);
++    }
+hunk ./lib/twitterapi.php 368
+-      function replier_by_reply($reply_id) {
+-              $notice = Notice::staticGet($reply_id);
+-              if ($notice) {
+-                      $profile = $notice->getProfile();
+-                      if ($profile) {
+-                              return intval($profile->id);
+-                      } else {
+-                              common_debug('Can\'t find a profile for notice: ' . $notice->id, __FILE__);
+-                      }
+-              } else {
+-                      common_debug("Can't get notice: $reply_id", __FILE__);
+-              }
+-              return NULL;
+-      }
++    function replier_by_reply($reply_id) {
++        $notice = Notice::staticGet($reply_id);
++        if ($notice) {
++            $profile = $notice->getProfile();
++            if ($profile) {
++                return intval($profile->id);
++            } else {
++                common_debug('Can\'t find a profile for notice: ' . $notice->id, __FILE__);
++            }
++        } else {
++            common_debug("Can't get notice: $reply_id", __FILE__);
++        }
++        return NULL;
++    }
+hunk ./lib/twitterapi.php 383
+-      // XXX: Candidate for a general utility method somewhere?
+-      function count_subscriptions($profile) {
++    // XXX: Candidate for a general utility method somewhere?
++    function count_subscriptions($profile) {
+hunk ./lib/twitterapi.php 386
+-              $count = 0;
+-              $sub = new Subscription();
+-              $sub->subscribed = $profile->id;
++        $count = 0;
++        $sub = new Subscription();
++        $sub->subscribed = $profile->id;
+hunk ./lib/twitterapi.php 390
+-              $count = $sub->find();
++        $count = $sub->find();
+hunk ./lib/twitterapi.php 392
+-              if ($count > 0) {
+-                      return $count - 1;
+-              } else {
+-                      return 0;
+-              }
+-      }
++        if ($count > 0) {
++            return $count - 1;
++        } else {
++            return 0;
++        }
++    }
+hunk ./lib/twitterapi.php 399
+-      function init_document($type='xml') {
+-              switch ($type) {
+-               case 'xml':
+-                      header('Content-Type: application/xml; charset=utf-8');
+-                      common_start_xml();
+-                      break;
+-               case 'json':
+-                      header('Content-Type: application/json; charset=utf-8');
++    function init_document($type='xml') {
++        switch ($type) {
++         case 'xml':
++            header('Content-Type: application/xml; charset=utf-8');
++            common_start_xml();
++            break;
++         case 'json':
++            header('Content-Type: application/json; charset=utf-8');
+hunk ./lib/twitterapi.php 408
+-                      // Check for JSONP callback
+-                      $callback = $this->arg('callback');
+-                      if ($callback) {
+-                              print $callback . '(';
+-                      }
+-                      break;
+-               case 'rss':
+-                      header("Content-Type: application/rss+xml; charset=utf-8");
+-                      $this->init_twitter_rss();
+-                      break;
+-               case 'atom':
+-                      header('Content-Type: application/atom+xml; charset=utf-8');
+-                      $this->init_twitter_atom();
+-                      break;
+-               default:
+-                      $this->client_error(_('Not a supported data format.'));
+-                      break;
+-              }
++            // Check for JSONP callback
++            $callback = $this->arg('callback');
++            if ($callback) {
++                print $callback . '(';
++            }
++            break;
++         case 'rss':
++            header("Content-Type: application/rss+xml; charset=utf-8");
++            $this->init_twitter_rss();
++            break;
++         case 'atom':
++            header('Content-Type: application/atom+xml; charset=utf-8');
++            $this->init_twitter_atom();
++            break;
++         default:
++            $this->client_error(_('Not a supported data format.'));
++            break;
++        }
+hunk ./lib/twitterapi.php 427
+-              return;
+-      }
++        return;
++    }
+hunk ./lib/twitterapi.php 430
+-      function end_document($type='xml') {
+-              switch ($type) {
+-               case 'xml':
+-                      common_end_xml();
+-                      break;
+-               case 'json':
++    function end_document($type='xml') {
++        switch ($type) {
++         case 'xml':
++            common_end_xml();
++            break;
++         case 'json':
+hunk ./lib/twitterapi.php 437
+-                      // Check for JSONP callback
+-                      $callback = $this->arg('callback');
+-                      if ($callback) {
+-                              print ')';
+-                      }
+-                      break;
+-               case 'rss':
+-                      $this->end_twitter_rss();
+-                      break;
+-               case 'atom':
+-                      $this->end_twitter_rss();
+-                      break;
+-               default:
+-                      $this->client_error(_('Not a supported data format.'));
+-                      break;
+-              }
+-              return;
+-      }
++            // Check for JSONP callback
++            $callback = $this->arg('callback');
++            if ($callback) {
++                print ')';
++            }
++            break;
++         case 'rss':
++            $this->end_twitter_rss();
++            break;
++         case 'atom':
++            $this->end_twitter_rss();
++            break;
++         default:
++            $this->client_error(_('Not a supported data format.'));
++            break;
++        }
++        return;
++    }
+hunk ./lib/twitterapi.php 456
+-      function client_error($msg, $code = 400, $content_type = 'json') {
++    function client_error($msg, $code = 400, $content_type = 'json') {
+hunk ./lib/twitterapi.php 458
+-              static $status = array(400 => 'Bad Request',
+-                                                         401 => 'Unauthorized',
+-                                                         402 => 'Payment Required',
+-                                                         403 => 'Forbidden',
+-                                                         404 => 'Not Found',
+-                                                         405 => 'Method Not Allowed',
+-                                                         406 => 'Not Acceptable',
+-                                                         407 => 'Proxy Authentication Required',
+-                                                         408 => 'Request Timeout',
+-                                                         409 => 'Conflict',
+-                                                         410 => 'Gone',
+-                                                         411 => 'Length Required',
+-                                                         412 => 'Precondition Failed',
+-                                                         413 => 'Request Entity Too Large',
+-                                                         414 => 'Request-URI Too Long',
+-                                                         415 => 'Unsupported Media Type',
+-                                                         416 => 'Requested Range Not Satisfiable',
+-                                                         417 => 'Expectation Failed');
++        static $status = array(400 => 'Bad Request',
++                               401 => 'Unauthorized',
++                               402 => 'Payment Required',
++                               403 => 'Forbidden',
++                               404 => 'Not Found',
++                               405 => 'Method Not Allowed',
++                               406 => 'Not Acceptable',
++                               407 => 'Proxy Authentication Required',
++                               408 => 'Request Timeout',
++                               409 => 'Conflict',
++                               410 => 'Gone',
++                               411 => 'Length Required',
++                               412 => 'Precondition Failed',
++                               413 => 'Request Entity Too Large',
++                               414 => 'Request-URI Too Long',
++                               415 => 'Unsupported Media Type',
++                               416 => 'Requested Range Not Satisfiable',
++                               417 => 'Expectation Failed');
+hunk ./lib/twitterapi.php 477
+-              $action = $this->trimmed('action');
++        $action = $this->trimmed('action');
+hunk ./lib/twitterapi.php 479
+-              common_debug("User error '$code' on '$action': $msg", __FILE__);
++        common_debug("User error '$code' on '$action': $msg", __FILE__);
+hunk ./lib/twitterapi.php 481
+-              if (!array_key_exists($code, $status)) {
+-                      $code = 400;
+-              }
++        if (!array_key_exists($code, $status)) {
++            $code = 400;
++        }
+hunk ./lib/twitterapi.php 485
+-              $status_string = $status[$code];
+-              header('HTTP/1.1 '.$code.' '.$status_string);
++        $status_string = $status[$code];
++        header('HTTP/1.1 '.$code.' '.$status_string);
+hunk ./lib/twitterapi.php 488
+-              if ($content_type == 'xml') {
+-                      $this->init_document('xml');
+-                      common_element_start('hash');
+-                      common_element('error', NULL, $msg);
+-                      common_element('request', NULL, $_SERVER['REQUEST_URI']);
+-                      common_element_end('hash');
+-                      $this->end_document('xml');
+-              } else {
+-                      $this->init_document('json');
+-                      $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
+-                      print(json_encode($error_array));
+-                      $this->end_document('json');
+-              }
++        if ($content_type == 'xml') {
++            $this->init_document('xml');
++            common_element_start('hash');
++            common_element('error', NULL, $msg);
++            common_element('request', NULL, $_SERVER['REQUEST_URI']);
++            common_element_end('hash');
++            $this->end_document('xml');
++        } else {
++            $this->init_document('json');
++            $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
++            print(json_encode($error_array));
++            $this->end_document('json');
++        }
+hunk ./lib/twitterapi.php 502
+-      }
++    }
+hunk ./lib/twitterapi.php 504
+-      function init_twitter_rss() {
+-              common_start_xml();
+-              common_element_start('rss', array('version' => '2.0'));
+-      }
++    function init_twitter_rss() {
++        common_start_xml();
++        common_element_start('rss', array('version' => '2.0'));
++    }
+hunk ./lib/twitterapi.php 509
+-      function end_twitter_rss() {
+-              common_element_end('rss');
+-              common_end_xml();
+-      }
++    function end_twitter_rss() {
++        common_element_end('rss');
++        common_end_xml();
++    }
+hunk ./lib/twitterapi.php 514
+-      function init_twitter_atom() {
+-              common_start_xml();
+-              common_element_start('feed', array('xmlns' => 'http://www.w3.org/2005/Atom', 'xml:lang' => 'en-US'));
+-      }
++    function init_twitter_atom() {
++        common_start_xml();
++        common_element_start('feed', array('xmlns' => 'http://www.w3.org/2005/Atom', 'xml:lang' => 'en-US'));
++    }
+hunk ./lib/twitterapi.php 519
+-      function end_twitter_atom() {
+-              common_end_xml();
+-              common_element_end('feed');
+-      }
++    function end_twitter_atom() {
++        common_end_xml();
++        common_element_end('feed');
++    }
+hunk ./lib/twitterapi.php 524
+-      function show_profile($profile, $content_type='xml', $notice=NULL) {
+-              $profile_array = $this->twitter_user_array($profile, true);
+-              switch ($content_type) {
+-               case 'xml':
+-                      $this->show_twitter_xml_user($profile_array);
+-                      break;
+-               case 'json':
+-                      $this->show_json_objects($profile_array);
+-                      break;
+-               default:
+-                      $this->client_error(_('Not a supported data format.'));
+-                      return;
+-              }
+-              return;
+-      }
++    function show_profile($profile, $content_type='xml', $notice=NULL) {
++        $profile_array = $this->twitter_user_array($profile, true);
++        switch ($content_type) {
++         case 'xml':
++            $this->show_twitter_xml_user($profile_array);
++            break;
++         case 'json':
++            $this->show_json_objects($profile_array);
++            break;
++         default:
++            $this->client_error(_('Not a supported data format.'));
++            return;
++        }
++        return;
++    }
+hunk ./lib/twitterapi.php 540
+-      function get_user($id, $apidata=NULL) {
+-              if (!$id) {
+-                      return $apidata['user'];
+-              } else if (is_numeric($id)) {
+-                      return User::staticGet($id);
+-              } else {
+-                      $nickname = common_canonical_nickname($id);
+-                      return User::staticGet('nickname', $nickname);
+-              }
+-      }
++    function get_user($id, $apidata=NULL) {
++        if (!$id) {
++            return $apidata['user'];
++        } else if (is_numeric($id)) {
++            return User::staticGet($id);
++        } else {
++            $nickname = common_canonical_nickname($id);
++            return User::staticGet('nickname', $nickname);
++        }
++    }
+hunk ./lib/twitterapi.php 551
+-      function get_profile($id) {
+-              if (is_numeric($id)) {
+-                      return Profile::staticGet($id);
+-              } else {
+-                      $user = User::staticGet('nickname', $id);
+-                      if ($user) {
+-                              return $user->getProfile();
+-                      } else {
+-                              return NULL;
+-                      }
+-              }
+-      }
++    function get_profile($id) {
++        if (is_numeric($id)) {
++            return Profile::staticGet($id);
++        } else {
++            $user = User::staticGet('nickname', $id);
++            if ($user) {
++                return $user->getProfile();
++            } else {
++                return NULL;
++            }
++        }
++    }
+hunk ./lib/twitterapi.php 564
+-      function source_link($source) {
+-              $source_name = _($source);
+-              switch ($source) {
+-               case 'web':
+-               case 'xmpp':
+-               case 'mail':
+-               case 'omb':
+-               case 'api':
+-                      break;
+-               default:
+-                      $ns = Notice_source::staticGet($source);
+-                      if ($ns) {
+-                              $source_name = '<a href="' . $ns->url . '">' . $ns->name . '</a>';
+-                      }
+-                      break;
+-              }
+-              return $source_name;
+-      }
++    function source_link($source) {
++        $source_name = _($source);
++        switch ($source) {
++         case 'web':
++         case 'xmpp':
++         case 'mail':
++         case 'omb':
++         case 'api':
++            break;
++         default:
++            $ns = Notice_source::staticGet($source);
++            if ($ns) {
++                $source_name = '<a href="' . $ns->url . '">' . $ns->name . '</a>';
++            }
++            break;
++        }
++        return $source_name;
++    }
+hunk ./lib/twitterapi.php 583
+-      function show_extended_profile($user, $apidata) {
++    function show_extended_profile($user, $apidata) {
+hunk ./lib/twitterapi.php 585
+-              $this->auth_user = $apidata['user'];
++        $this->auth_user = $apidata['user'];
+hunk ./lib/twitterapi.php 587
+-              $profile = $user->getProfile();
++        $profile = $user->getProfile();
+hunk ./lib/twitterapi.php 589
+-              if (!$profile) {
+-                      common_server_error(_('User has no profile.'));
+-                      return;
+-              }
++        if (!$profile) {
++            common_server_error(_('User has no profile.'));
++            return;
++        }
+hunk ./lib/twitterapi.php 594
+-              $twitter_user = $this->twitter_user_array($profile, true);
++        $twitter_user = $this->twitter_user_array($profile, true);
+hunk ./lib/twitterapi.php 596
+-              // Add in extended user fields offered up by this method
+-              $twitter_user['created_at'] = $this->date_twitter($profile->created);
++        // Add in extended user fields offered up by this method
++        $twitter_user['created_at'] = $this->date_twitter($profile->created);
+hunk ./lib/twitterapi.php 599
+-              $subbed = DB_DataObject::factory('subscription');
+-              $subbed->subscriber = $profile->id;
+-              $subbed_count = (int) $subbed->count() - 1;
++        $subbed = DB_DataObject::factory('subscription');
++        $subbed->subscriber = $profile->id;
++        $subbed_count = (int) $subbed->count() - 1;
+hunk ./lib/twitterapi.php 603
+-              $notices = DB_DataObject::factory('notice');
+-              $notices->profile_id = $profile->id;
+-              $notice_count = (int) $notices->count();
++        $notices = DB_DataObject::factory('notice');
++        $notices->profile_id = $profile->id;
++        $notice_count = (int) $notices->count();
+hunk ./lib/twitterapi.php 607
+-              $twitter_user['friends_count'] = (is_int($subbed_count)) ? $subbed_count : 0;
+-              $twitter_user['statuses_count'] = (is_int($notice_count)) ? $notice_count : 0;
++        $twitter_user['friends_count'] = (is_int($subbed_count)) ? $subbed_count : 0;
++        $twitter_user['statuses_count'] = (is_int($notice_count)) ? $notice_count : 0;
+hunk ./lib/twitterapi.php 610
+-              // Other fields Twitter sends...
+-              $twitter_user['profile_background_color'] = '';
+-              $twitter_user['profile_text_color'] = '';
+-              $twitter_user['profile_link_color'] = '';
+-              $twitter_user['profile_sidebar_fill_color'] = '';
++        // Other fields Twitter sends...
++        $twitter_user['profile_background_color'] = '';
++        $twitter_user['profile_text_color'] = '';
++        $twitter_user['profile_link_color'] = '';
++        $twitter_user['profile_sidebar_fill_color'] = '';
+hunk ./lib/twitterapi.php 616
+-              $faves = DB_DataObject::factory('fave');
+-              $faves->user_id = $user->id;
+-              $faves_count = (int) $faves->count();
+-              $twitter_user['favourites_count'] = $faves_count;
++        $faves = DB_DataObject::factory('fave');
++        $faves->user_id = $user->id;
++        $faves_count = (int) $faves->count();
++        $twitter_user['favourites_count'] = $faves_count;
+hunk ./lib/twitterapi.php 621
+-              $timezone = 'UTC';
++        $timezone = 'UTC';
+hunk ./lib/twitterapi.php 623
+-              if ($user->timezone) {
+-                      $timezone = $user->timezone;
+-              }
++        if ($user->timezone) {
++            $timezone = $user->timezone;
++        }
+hunk ./lib/twitterapi.php 627
+-              $t = new DateTime;
+-              $t->setTimezone(new DateTimeZone($timezone));
+-              $twitter_user['utc_offset'] = $t->format('Z');
+-              $twitter_user['time_zone'] = $timezone;
++        $t = new DateTime;
++        $t->setTimezone(new DateTimeZone($timezone));
++        $twitter_user['utc_offset'] = $t->format('Z');
++        $twitter_user['time_zone'] = $timezone;
+hunk ./lib/twitterapi.php 632
+-              $following = 'false';
++        $following = 'false';
+hunk ./lib/twitterapi.php 634
+-              if (isset($this->auth_user)) {
+-                      if ($this->auth_user->isSubscribed($profile)) {
+-                              $following = 'true';
+-                      }
++        if (isset($this->auth_user)) {
++            if ($this->auth_user->isSubscribed($profile)) {
++                $following = 'true';
++            }
+hunk ./lib/twitterapi.php 639
+-                      // Not implemented yet
+-                      $twitter_user['notifications'] = 'false';
+-              }
++            // Not implemented yet
++            $twitter_user['notifications'] = 'false';
++        }
+hunk ./lib/twitterapi.php 643
+-              $twitter_user['following'] = $following;
++        $twitter_user['following'] = $following;
+hunk ./lib/twitterapi.php 645
+-              if ($apidata['content-type'] == 'xml') {
+-                      $this->init_document('xml');
+-                      $this->show_twitter_xml_user($twitter_user);
+-                      $this->end_document('xml');
+-              } elseif ($apidata['content-type'] == 'json') {
+-                      $this->init_document('json');
+-                      $this->show_json_objects($twitter_user);
+-                      $this->end_document('json');
+-              }
++        if ($apidata['content-type'] == 'xml') {
++            $this->init_document('xml');
++            $this->show_twitter_xml_user($twitter_user);
++            $this->end_document('xml');
++        } elseif ($apidata['content-type'] == 'json') {
++            $this->init_document('json');
++            $this->show_json_objects($twitter_user);
++            $this->end_document('json');
++        }
+hunk ./lib/twitterapi.php 655
+-      }
++    }
+hunk ./lib/xmppqueuehandler.php 32
+-      
+-      function start() {
+-              # Low priority; we don't want to receive messages
+-              $this->log(LOG_INFO, "INITIALIZE");
+-              $this->conn = jabber_connect($this->_id);
+-              if ($this->conn) {
+-                      $this->conn->addEventHandler('message', 'forward_message', $this);
+-                      $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
+-                      $this->conn->setReconnectTimeout(600);
+-                      jabber_send_presence("Send me a message to post a notice", 'available', NULL, 'available', -1);
+-              }
+-              return !is_null($this->conn);
+-      }
+-      
+-      function handle_reconnect(&$pl) {
+-              $this->conn->processUntil('session_start');
+-              $this->conn->presence(NULL, 'available', NULL, 'available', -1);
+-      }
++    
++    function start() {
++        # Low priority; we don't want to receive messages
++        $this->log(LOG_INFO, "INITIALIZE");
++        $this->conn = jabber_connect($this->_id);
++        if ($this->conn) {
++            $this->conn->addEventHandler('message', 'forward_message', $this);
++            $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
++            $this->conn->setReconnectTimeout(600);
++            jabber_send_presence("Send me a message to post a notice", 'available', NULL, 'available', -1);
++        }
++        return !is_null($this->conn);
++    }
++    
++    function handle_reconnect(&$pl) {
++        $this->conn->processUntil('session_start');
++        $this->conn->presence(NULL, 'available', NULL, 'available', -1);
++    }
+hunk ./lib/xmppqueuehandler.php 51
+-      function idle($timeout=0) {
+-              # Process the queue for as long as needed
+-              try {
+-                      if ($this->conn) {
+-                              $this->conn->processTime($timeout);
+-                      }
+-              } catch (XMPPHP_Exception $e) {
+-                      $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
+-                      die($e->getMessage());
+-              }
+-      }
+-      
+-      function forward_message(&$pl) {
+-              if ($pl['type'] != 'chat') {
+-                  $this->log(LOG_DEBUG, 'Ignoring message of type ' . $pl['type'] . ' from ' . $pl['from']);
+-                      return;
+-              }
+-              $listener = $this->listener();
+-              if (strtolower($listener) == strtolower($pl['from'])) {
+-                      $this->log(LOG_WARNING, 'Ignoring loop message.');
+-                      return;
+-              }
+-              $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 idle($timeout=0) {
++        # Process the queue for as long as needed
++        try {
++            if ($this->conn) {
++                $this->conn->processTime($timeout);
++            }
++        } catch (XMPPHP_Exception $e) {
++            $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
++            die($e->getMessage());
++        }
++    }
++    
++    function forward_message(&$pl) {
++        if ($pl['type'] != 'chat') {
++            $this->log(LOG_DEBUG, 'Ignoring message of type ' . $pl['type'] . ' from ' . $pl['from']);
++            return;
++        }
++        $listener = $this->listener();
++        if (strtolower($listener) == strtolower($pl['from'])) {
++            $this->log(LOG_WARNING, 'Ignoring loop message.');
++            return;
++        }
++        $this->log(LOG_INFO, 'Forwarding message from ' . $pl['from'] . ' to ' . $listener);
++        $this->conn->message($this->listener(), $pl['body'], 'chat', NULL, $this->ofrom($pl['from']));
++    }
+hunk ./lib/xmppqueuehandler.php 77
+-      function ofrom($from) {
+-              $address = "<addresses xmlns='http://jabber.org/protocol/address'>\n";
+-              $address .= "<address type='ofrom' jid='$from' />\n";
+-              $address .= "</addresses>\n";
+-              return $address;
+-      }
++    function ofrom($from) {
++        $address = "<addresses xmlns='http://jabber.org/protocol/address'>\n";
++        $address .= "<address type='ofrom' jid='$from' />\n";
++        $address .= "</addresses>\n";
++        return $address;
++    }
+hunk ./lib/xmppqueuehandler.php 84
+-      function listener() {
+-              if (common_config('xmpp', 'listener')) {
+-                      return common_config('xmpp', 'listener');
+-              } else {
+-                      return jabber_daemon_address() . '/' . common_config('xmpp','resource') . '-listener';
+-              }
+-      }
++    function listener() {
++        if (common_config('xmpp', 'listener')) {
++            return common_config('xmpp', 'listener');
++        } else {
++            return jabber_daemon_address() . '/' . common_config('xmpp','resource') . '-listener';
++        }
++    }
+hunk ./scripts/enjitqueuehandler.php 23
+-      print "This script must be run from the command line\n";
+-      exit();
++    print "This script must be run from the command line\n";
++    exit();
+hunk ./scripts/enjitqueuehandler.php 37
+-      
+-      function transport() {
+-              return 'enjit';
+-      }
++    
++    function transport() {
++        return 'enjit';
++    }
+hunk ./scripts/enjitqueuehandler.php 42
+-      function start() {
++    function start() {
+hunk ./scripts/enjitqueuehandler.php 45
+-              return true;
+-      }
++        return true;
++    }
+hunk ./scripts/enjitqueuehandler.php 48
+-      function handle_notice($notice) {
++    function handle_notice($notice) {
+hunk ./scripts/enjitqueuehandler.php 50
+-              $profile = Profile::staticGet($notice->profile_id);
++        $profile = Profile::staticGet($notice->profile_id);
+hunk ./scripts/enjitqueuehandler.php 63
+-              $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
+-              $msg = $profile->nickname . ': ' . $notice->content;
++        $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
++        $msg = $profile->nickname . ': ' . $notice->content;
+hunk ./scripts/enjitqueuehandler.php 66
+-              $atom  = "<entry xmlns='http://www.w3.org/2005/Atom'>\n";
+-              $atom .= "<apisource>".common_config('enjit','source')."</apisource>\n";
+-              $atom .= "<source>\n";
+-              $atom .= "<title>" . $profile->nickname . " - " . common_config('site', 'name') . "</title>\n";
+-              $atom .= "<link href='" . $profile->profileurl . "'/>\n";
+-              $atom .= "<link rel='self' type='application/rss+xml' href='" . common_local_url('userrss', array('nickname' => $profile->nickname)) . "'/>\n";
+-              $atom .= "<author><name>" . $profile->nickname . "</name></author>\n";
+-              $atom .= "<icon>" . common_profile_avatar_url($profile, AVATAR_PROFILE_SIZE) . "</icon>\n";
+-              $atom .= "</source>\n";
+-              $atom .= "<title>" . htmlspecialchars($msg) . "</title>\n";
+-              $atom .= "<summary>" . htmlspecialchars($msg) . "</summary>\n";
+-              $atom .= "<link rel='alternate' href='" . $noticeurl . "' />\n";
+-              $atom .= "<id>". $notice->uri . "</id>\n";
+-              $atom .= "<published>".common_date_w3dtf($notice->created)."</published>\n";
+-              $atom .= "<updated>".common_date_w3dtf($notice->modified)."</updated>\n";
+-              $atom .= "</entry>\n";
++        $atom  = "<entry xmlns='http://www.w3.org/2005/Atom'>\n";
++        $atom .= "<apisource>".common_config('enjit','source')."</apisource>\n";
++        $atom .= "<source>\n";
++        $atom .= "<title>" . $profile->nickname . " - " . common_config('site', 'name') . "</title>\n";
++        $atom .= "<link href='" . $profile->profileurl . "'/>\n";
++        $atom .= "<link rel='self' type='application/rss+xml' href='" . common_local_url('userrss', array('nickname' => $profile->nickname)) . "'/>\n";
++        $atom .= "<author><name>" . $profile->nickname . "</name></author>\n";
++        $atom .= "<icon>" . common_profile_avatar_url($profile, AVATAR_PROFILE_SIZE) . "</icon>\n";
++        $atom .= "</source>\n";
++        $atom .= "<title>" . htmlspecialchars($msg) . "</title>\n";
++        $atom .= "<summary>" . htmlspecialchars($msg) . "</summary>\n";
++        $atom .= "<link rel='alternate' href='" . $noticeurl . "' />\n";
++        $atom .= "<id>". $notice->uri . "</id>\n";
++        $atom .= "<published>".common_date_w3dtf($notice->created)."</published>\n";
++        $atom .= "<updated>".common_date_w3dtf($notice->modified)."</updated>\n";
++        $atom .= "</entry>\n";
+hunk ./scripts/enjitqueuehandler.php 89
+-              $ch   = curl_init();
++        $ch   = curl_init();
+hunk ./scripts/enjitqueuehandler.php 91
+-              curl_setopt($ch, CURLOPT_URL, $url);
++        curl_setopt($ch, CURLOPT_URL, $url);
+hunk ./scripts/enjitqueuehandler.php 94
+-              curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+-              curl_setopt($ch, CURLOPT_POST, 1) ;
+-              curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
++        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
++        curl_setopt($ch, CURLOPT_POST, 1) ;
++        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+hunk ./scripts/enjitqueuehandler.php 100
+-              # curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
+-              # curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
++        # curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
++        # curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
+hunk ./scripts/enjitqueuehandler.php 104
+-              $result = curl_exec($ch);
++        $result = curl_exec($ch);
+hunk ./scripts/enjitqueuehandler.php 106
+-              $code = curl_getinfo($ch, CURLINFO_HTTP_CODE );
++        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE );
+hunk ./scripts/enjitqueuehandler.php 110
+-              curl_close($ch);
++        curl_close($ch);
+hunk ./scripts/enjitqueuehandler.php 113
+-      }
+-      
++    }
++    
+hunk ./scripts/enjitqueuehandler.php 125
+-      $handler->handle_queue();
++    $handler->handle_queue();
+hunk ./scripts/fixup_hashtags.php 40
+-      $original = clone($notice);
+-      $notice->rendered = common_render_content($notice->content, $notice);
+-      $result = $notice->update($original);
+-      if (!$result) {
+-              common_log_db_error($notice, 'UPDATE', __FILE__);
+-      }
++    $original = clone($notice);
++    $notice->rendered = common_render_content($notice->content, $notice);
++    $result = $notice->update($original);
++    if (!$result) {
++        common_log_db_error($notice, 'UPDATE', __FILE__);
++    }
+hunk ./scripts/fixup_inboxes.php 44
+-      $user->whereAdd('id >= ' . $start_at);
++    $user->whereAdd('id >= ' . $start_at);
+hunk ./scripts/fixup_inboxes.php 52
+-      $user->query('BEGIN');
+-      $inbox = new Notice_inbox();
+-      $result = $inbox->query('INSERT LOW_PRIORITY INTO notice_inbox (user_id, notice_id, created) ' .
+-                                                      'SELECT ' . $user->id . ', notice.id, notice.created ' .
+-                                                      'FROM subscription JOIN notice ON subscription.subscribed = notice.profile_id ' .
+-                                                      'WHERE subscription.subscriber = ' . $user->id . ' ' .
+-                                                      'AND notice.created >= subscription.created ' . 
+-                                                      'AND NOT EXISTS (SELECT user_id, notice_id ' .
+-                                                      'FROM notice_inbox ' .
+-                                                      'WHERE user_id = ' . $user->id . ' ' . 
+-                                                      'AND notice_id = notice.id)');
+-      if (is_null($result) || $result === false) {
+-              common_log_db_error($inbox, 'INSERT', __FILE__);
+-              continue;
+-      }
+-      $orig = clone($user);
+-      $user->inboxed = 1;
+-      $result = $user->update($orig);
+-      if (!$result) {
+-              common_log_db_error($user, 'UPDATE', __FILE__);
+-              continue;
+-      }
+-      $user->query('COMMIT');
+-      $inbox->free();
+-      unset($inbox);
+-      if ($cache) {
+-              $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+-      }
++    $user->query('BEGIN');
++    $inbox = new Notice_inbox();
++    $result = $inbox->query('INSERT LOW_PRIORITY INTO notice_inbox (user_id, notice_id, created) ' .
++                            'SELECT ' . $user->id . ', notice.id, notice.created ' .
++                            'FROM subscription JOIN notice ON subscription.subscribed = notice.profile_id ' .
++                            'WHERE subscription.subscriber = ' . $user->id . ' ' .
++                            'AND notice.created >= subscription.created ' . 
++                            'AND NOT EXISTS (SELECT user_id, notice_id ' .
++                            'FROM notice_inbox ' .
++                            'WHERE user_id = ' . $user->id . ' ' . 
++                            'AND notice_id = notice.id)');
++    if (is_null($result) || $result === false) {
++        common_log_db_error($inbox, 'INSERT', __FILE__);
++        continue;
++    }
++    $orig = clone($user);
++    $user->inboxed = 1;
++    $result = $user->update($orig);
++    if (!$result) {
++        common_log_db_error($user, 'UPDATE', __FILE__);
++        continue;
++    }
++    $user->query('COMMIT');
++    $inbox->free();
++    unset($inbox);
++    if ($cache) {
++        $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
++    }
+hunk ./scripts/fixup_notices_rendered.php 23
+-      print "This script must be run from the command line\n";
+-      exit();
++    print "This script must be run from the command line\n";
++    exit();
+hunk ./scripts/fixup_notices_rendered.php 38
+-      $notice->whereAdd('id >= ' . $start_at);
++    $notice->whereAdd('id >= ' . $start_at);
+hunk ./scripts/fixup_notices_rendered.php 43
+-      common_log(LOG_INFO, 'Pre-rendering notice #' . $notice->id);
+-      $original = clone($notice);
+-      $notice->rendered = common_render_content($notice->content, $notice);
+-      $result = $notice->update($original);
+-      if (!$result) {
+-              common_log_db_error($notice, 'UPDATE', __FILE__);
+-      }
++    common_log(LOG_INFO, 'Pre-rendering notice #' . $notice->id);
++    $original = clone($notice);
++    $notice->rendered = common_render_content($notice->content, $notice);
++    $result = $notice->update($original);
++    if (!$result) {
++        common_log_db_error($notice, 'UPDATE', __FILE__);
++    }
+hunk ./scripts/getpiddir.php 23
+-      print "This script must be run from the command line\n";
+-      exit();
++    print "This script must be run from the command line\n";
++    exit();
+hunk ./scripts/inbox_users.php 45
+-      
+-      $user = User::staticGet('id', $id);
++    
++    $user = User::staticGet('id', $id);
+hunk ./scripts/inbox_users.php 48
+-      if (!$user) {
+-              common_log(LOG_WARNING, 'No such user: ' . $id);
+-              continue;
+-      }
+-      
+-      if ($user->inboxed) {
+-              common_log(LOG_WARNING, 'Already inboxed: ' . $id);
+-              continue;
+-      }
+-      
++    if (!$user) {
++        common_log(LOG_WARNING, 'No such user: ' . $id);
++        continue;
++    }
++    
++    if ($user->inboxed) {
++        common_log(LOG_WARNING, 'Already inboxed: ' . $id);
++        continue;
++    }
++    
+hunk ./scripts/inbox_users.php 59
+-      
+-      $user->query('BEGIN');
+-      
+-      $old_inbox = new Notice_inbox();
+-      $old_inbox->user_id = $user->id;
+-      
+-      $result = $old_inbox->delete();
+-      
+-      if (is_null($result) || $result === false) {
+-              common_log_db_error($old_inbox, 'DELETE', __FILE__);
+-              continue;
+-      }
++    
++    $user->query('BEGIN');
++    
++    $old_inbox = new Notice_inbox();
++    $old_inbox->user_id = $user->id;
++    
++    $result = $old_inbox->delete();
++    
++    if (is_null($result) || $result === false) {
++        common_log_db_error($old_inbox, 'DELETE', __FILE__);
++        continue;
++    }
+hunk ./scripts/inbox_users.php 72
+-      $old_inbox->free();
+-      
+-      $inbox = new Notice_inbox();
+-      
+-      $result = $inbox->query('INSERT INTO notice_inbox (user_id, notice_id, created) ' .
+-                                                      'SELECT ' . $user->id . ', notice.id, notice.created ' .
+-                                                      'FROM subscription JOIN notice ON subscription.subscribed = notice.profile_id ' .
+-                                                      'WHERE subscription.subscriber = ' . $user->id . ' ' .
+-                                                      'AND notice.created >= subscription.created ' .
+-                                                      'AND now() - notice.created < ' . (7 * 24 * 3600) . ' ' .
+-                                                      'AND NOT EXISTS (SELECT user_id, notice_id ' .
+-                                                      'FROM notice_inbox ' .
+-                                                      'WHERE user_id = ' . $user->id . ' ' . 
+-                                                      'AND notice_id = notice.id)');
+-      
+-      if (is_null($result) || $result === false) {
+-              common_log_db_error($inbox, 'INSERT', __FILE__);
+-              continue;
+-      }
+-      
+-      $orig = clone($user);
+-      $user->inboxed = 1;
+-      $result = $user->update($orig);
+-      
+-      if (!$result) {
+-              common_log_db_error($user, 'UPDATE', __FILE__);
+-              continue;
+-      }
+-      
+-      $user->query('COMMIT');
+-      
+-      $inbox->free();
+-      unset($inbox);
+-      
+-      if ($cache) {
+-              $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+-      }
++    $old_inbox->free();
++    
++    $inbox = new Notice_inbox();
++    
++    $result = $inbox->query('INSERT INTO notice_inbox (user_id, notice_id, created) ' .
++                            'SELECT ' . $user->id . ', notice.id, notice.created ' .
++                            'FROM subscription JOIN notice ON subscription.subscribed = notice.profile_id ' .
++                            'WHERE subscription.subscriber = ' . $user->id . ' ' .
++                            'AND notice.created >= subscription.created ' .
++                            'AND now() - notice.created < ' . (7 * 24 * 3600) . ' ' .
++                            'AND NOT EXISTS (SELECT user_id, notice_id ' .
++                            'FROM notice_inbox ' .
++                            'WHERE user_id = ' . $user->id . ' ' . 
++                            'AND notice_id = notice.id)');
++    
++    if (is_null($result) || $result === false) {
++        common_log_db_error($inbox, 'INSERT', __FILE__);
++        continue;
++    }
++    
++    $orig = clone($user);
++    $user->inboxed = 1;
++    $result = $user->update($orig);
++    
++    if (!$result) {
++        common_log_db_error($user, 'UPDATE', __FILE__);
++        continue;
++    }
++    
++    $user->query('COMMIT');
++    
++    $inbox->free();
++    unset($inbox);
++    
++    if ($cache) {
++        $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
++    }
+hunk ./scripts/jabberqueuehandler.php 23
+-      print "This script must be run from the command line\n";
+-      exit();
++    print "This script must be run from the command line\n";
++    exit();
+hunk ./scripts/jabberqueuehandler.php 38
+-      var $conn = NULL;
++    var $conn = NULL;
+hunk ./scripts/jabberqueuehandler.php 40
+-      function transport() {
+-              return 'jabber';
+-      }
++    function transport() {
++        return 'jabber';
++    }
+hunk ./scripts/jabberqueuehandler.php 44
+-      function handle_notice($notice) {
+-              try {
+-                      return jabber_broadcast_notice($notice);
+-              } catch (XMPPHP_Exception $e) {
+-                      $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
+-                      exit(1);
+-              }
+-      }
++    function handle_notice($notice) {
++        try {
++            return jabber_broadcast_notice($notice);
++        } catch (XMPPHP_Exception $e) {
++            $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
++            exit(1);
++        }
++    }
+hunk ./scripts/maildaemon.php 23
+-      print "This script must be run from the command line\n";
+-      exit();
++    print "This script must be run from the command line\n";
++    exit();
+hunk ./scripts/maildaemon.php 39
+-      function __construct() {
+-      }
++    function __construct() {
++    }
+hunk ./scripts/maildaemon.php 42
+-      function handle_message($fname='php://stdin') {
+-              list($from, $to, $msg) = $this->parse_message($fname);
+-              if (!$from || !$to || !$msg) {
+-                      $this->error(NULL, _('Could not parse message.'));
+-              }
+-              common_log(LOG_INFO, "Mail from $from to $to: " .substr($msg, 0, 20));
+-              $user = $this->user_from($from);
+-              if (!$user) {
+-                      $this->error($from, _('Not a registered user.'));
+-                      return false;
+-              }
+-              if (!$this->user_match_to($user, $to)) {
+-                      $this->error($from, _('Sorry, that is not your incoming email address.'));
+-                      return false;
+-              }
+-              if (!$user->emailpost) {
+-                      $this->error($from, _('Sorry, no incoming email allowed.'));
+-                      return false;
+-              }
+-              $response = $this->handle_command($user, $from, $msg);
+-              if ($response) {
+-                      return true;
+-              }
+-              $msg = $this->cleanup_msg($msg);
+-              $this->add_notice($user, $msg);
+-      }
++    function handle_message($fname='php://stdin') {
++        list($from, $to, $msg) = $this->parse_message($fname);
++        if (!$from || !$to || !$msg) {
++            $this->error(NULL, _('Could not parse message.'));
++        }
++        common_log(LOG_INFO, "Mail from $from to $to: " .substr($msg, 0, 20));
++        $user = $this->user_from($from);
++        if (!$user) {
++            $this->error($from, _('Not a registered user.'));
++            return false;
++        }
++        if (!$this->user_match_to($user, $to)) {
++            $this->error($from, _('Sorry, that is not your incoming email address.'));
++            return false;
++        }
++        if (!$user->emailpost) {
++            $this->error($from, _('Sorry, no incoming email allowed.'));
++            return false;
++        }
++        $response = $this->handle_command($user, $from, $msg);
++        if ($response) {
++            return true;
++        }
++        $msg = $this->cleanup_msg($msg);
++        $this->add_notice($user, $msg);
++    }
+hunk ./scripts/maildaemon.php 69
+-      function error($from, $msg) {
+-              file_put_contents("php://stderr", $msg . "\n");
+-              exit(1);
+-      }
++    function error($from, $msg) {
++        file_put_contents("php://stderr", $msg . "\n");
++        exit(1);
++    }
+hunk ./scripts/maildaemon.php 74
+-      function user_from($from_hdr) {
+-              $froms = mailparse_rfc822_parse_addresses($from_hdr);
+-              if (!$froms) {
+-                      return NULL;
+-              }
+-              $from = $froms[0];
+-              $addr = common_canonical_email($from['address']);
+-              $user = User::staticGet('email', $addr);
+-              if (!$user) {
+-                      $user = User::staticGet('smsemail', $addr);
+-              }
+-              return $user;
+-      }
++    function user_from($from_hdr) {
++        $froms = mailparse_rfc822_parse_addresses($from_hdr);
++        if (!$froms) {
++            return NULL;
++        }
++        $from = $froms[0];
++        $addr = common_canonical_email($from['address']);
++        $user = User::staticGet('email', $addr);
++        if (!$user) {
++            $user = User::staticGet('smsemail', $addr);
++        }
++        return $user;
++    }
+hunk ./scripts/maildaemon.php 88
+-      function user_match_to($user, $to_hdr) {
+-              $incoming = $user->incomingemail;
+-              $tos = mailparse_rfc822_parse_addresses($to_hdr);
+-              foreach ($tos as $to) {
+-                      if (strcasecmp($incoming, $to['address']) == 0) {
+-                              return true;
+-                      }
+-              }
+-              return false;
+-      }
++    function user_match_to($user, $to_hdr) {
++        $incoming = $user->incomingemail;
++        $tos = mailparse_rfc822_parse_addresses($to_hdr);
++        foreach ($tos as $to) {
++            if (strcasecmp($incoming, $to['address']) == 0) {
++                return true;
++            }
++        }
++        return false;
++    }
+hunk ./scripts/maildaemon.php 99
+-      function handle_command($user, $from, $msg) {
+-              $inter = new CommandInterpreter();
+-              $cmd = $inter->handle_command($user, $msg);
+-              if ($cmd) {
+-                      $cmd->execute(new MailChannel($from));
+-                      return true;
+-              }
+-              return false;
+-      }
++    function handle_command($user, $from, $msg) {
++        $inter = new CommandInterpreter();
++        $cmd = $inter->handle_command($user, $msg);
++        if ($cmd) {
++            $cmd->execute(new MailChannel($from));
++            return true;
++        }
++        return false;
++    }
+hunk ./scripts/maildaemon.php 109
+-      function respond($from, $to, $response) {
++    function respond($from, $to, $response) {
+hunk ./scripts/maildaemon.php 111
+-              $headers['From'] = $to;
+-              $headers['To'] = $from;
+-              $headers['Subject'] = "Command complete";
++        $headers['From'] = $to;
++        $headers['To'] = $from;
++        $headers['Subject'] = "Command complete";
+hunk ./scripts/maildaemon.php 115
+-              return mail_send(array($from), $headers, $response);
+-      }
++        return mail_send(array($from), $headers, $response);
++    }
+hunk ./scripts/maildaemon.php 118
+-      function log($level, $msg) {
+-              common_log($level, 'MailDaemon: '.$msg);
+-      }
++    function log($level, $msg) {
++        common_log($level, 'MailDaemon: '.$msg);
++    }
+hunk ./scripts/maildaemon.php 122
+-      function add_notice($user, $msg) {
++    function add_notice($user, $msg) {
+hunk ./scripts/maildaemon.php 126
+-              $notice = Notice::saveNew($user->id, $msg, 'mail');
+-              if (is_string($notice)) {
+-                      $this->log(LOG_ERR, $notice);
+-                      return;
+-              }
+-              common_broadcast_notice($notice);
+-              $this->log(LOG_INFO,
+-                                 'Added notice ' . $notice->id . ' from user ' . $user->nickname);
+-      }
++        $notice = Notice::saveNew($user->id, $msg, 'mail');
++        if (is_string($notice)) {
++            $this->log(LOG_ERR, $notice);
++            return;
++        }
++        common_broadcast_notice($notice);
++        $this->log(LOG_INFO,
++                   'Added notice ' . $notice->id . ' from user ' . $user->nickname);
++    }
+hunk ./scripts/maildaemon.php 136
+-      function parse_message($fname) {
+-              $contents = file_get_contents($fname);
+-              $parsed = Mail_mimeDecode::decode(array('input' => $contents,
+-                                                                                              'include_bodies' => true,
+-                                                                                              'decode_headers' => true,
+-                                                                                              'decode_bodies' => true));
+-              if (!$parsed) {
+-                      return NULL;
+-              }
++    function parse_message($fname) {
++        $contents = file_get_contents($fname);
++        $parsed = Mail_mimeDecode::decode(array('input' => $contents,
++                                                'include_bodies' => true,
++                                                'decode_headers' => true,
++                                                'decode_bodies' => true));
++        if (!$parsed) {
++            return NULL;
++        }
+hunk ./scripts/maildaemon.php 146
+-              $from = $parsed->headers['from'];
++        $from = $parsed->headers['from'];
+hunk ./scripts/maildaemon.php 148
+-              $to = $parsed->headers['to'];
++        $to = $parsed->headers['to'];
+hunk ./scripts/maildaemon.php 150
+-              $type = $parsed->ctype_primary . '/' . $parsed->ctype_secondary;
++        $type = $parsed->ctype_primary . '/' . $parsed->ctype_secondary;
+hunk ./scripts/maildaemon.php 152
+-              if ($parsed->ctype_primary == 'multipart') {
+-                      foreach ($parsed->parts as $part) {
+-                              if ($part->ctype_primary == 'text' &&
+-                                      $part->ctype_secondary == 'plain') {
+-                                      $msg = $part->body;
+-                                      break;
+-                              }
+-                      }
+-              } else if ($type == 'text/plain') {
+-                      $msg = $parsed->body;
+-              } else {
+-                      $this->unsupported_type($type);
+-              }
++        if ($parsed->ctype_primary == 'multipart') {
++            foreach ($parsed->parts as $part) {
++                if ($part->ctype_primary == 'text' &&
++                    $part->ctype_secondary == 'plain') {
++                    $msg = $part->body;
++                    break;
++                }
++            }
++        } else if ($type == 'text/plain') {
++            $msg = $parsed->body;
++        } else {
++            $this->unsupported_type($type);
++        }
+hunk ./scripts/maildaemon.php 166
+-              return array($from, $to, $msg);
+-      }
++        return array($from, $to, $msg);
++    }
+hunk ./scripts/maildaemon.php 169
+-      function unsupported_type($type) {
+-              $this->error(NULL, "Unsupported message type: " . $type);
+-      }
++    function unsupported_type($type) {
++        $this->error(NULL, "Unsupported message type: " . $type);
++    }
+hunk ./scripts/maildaemon.php 173
+-      function cleanup_msg($msg) {
+-              $lines = explode("\n", $msg);
++    function cleanup_msg($msg) {
++        $lines = explode("\n", $msg);
+hunk ./scripts/maildaemon.php 176
+-              $output = '';
++        $output = '';
+hunk ./scripts/maildaemon.php 178
+-              foreach ($lines as $line) {
+-                      // skip quotes
+-                      if (preg_match('/^\s*>.*$/', $line)) {
+-                              continue;
+-                      }
+-                      // skip start of quote
+-                      if (preg_match('/^\s*On.*wrote:\s*$/', $line)) {
+-                              continue;
+-                      }
+-                      // probably interesting to someone, not us
+-                      if (preg_match('/^\s*Sent via/', $line)) {
+-                              continue;
+-                      }
+-                      // skip everything after a sig
+-                      if (preg_match('/^\s*--+\s*$/', $line) ||
+-                              preg_match('/^\s*__+\s*$/', $line))
+-                      {
+-                              break;
+-                      }
+-                      // skip everything after Outlook quote
+-                      if (preg_match('/^\s*-+\s*Original Message\s*-+\s*$/', $line)) {
+-                              break;
+-                      }
+-                      // skip everything after weird forward
+-                      if (preg_match('/^\s*Begin\s+forward/', $line)) {
+-                              break;
+-                      }
++        foreach ($lines as $line) {
++            // skip quotes
++            if (preg_match('/^\s*>.*$/', $line)) {
++                continue;
++            }
++            // skip start of quote
++            if (preg_match('/^\s*On.*wrote:\s*$/', $line)) {
++                continue;
++            }
++            // probably interesting to someone, not us
++            if (preg_match('/^\s*Sent via/', $line)) {
++                continue;
++            }
++            // skip everything after a sig
++            if (preg_match('/^\s*--+\s*$/', $line) ||
++                preg_match('/^\s*__+\s*$/', $line))
++            {
++                break;
++            }
++            // skip everything after Outlook quote
++            if (preg_match('/^\s*-+\s*Original Message\s*-+\s*$/', $line)) {
++                break;
++            }
++            // skip everything after weird forward
++            if (preg_match('/^\s*Begin\s+forward/', $line)) {
++                break;
++            }
+hunk ./scripts/maildaemon.php 206
+-                      $output .= ' ' . $line;
+-              }
++            $output .= ' ' . $line;
++        }
+hunk ./scripts/maildaemon.php 209
+-              preg_replace('/\s+/', ' ', $output);
+-              return trim($output);
+-      }
++        preg_replace('/\s+/', ' ', $output);
++        return trim($output);
++    }
+hunk ./scripts/ombqueuehandler.php 23
+-      print "This script must be run from the command line\n";
+-      exit();
++    print "This script must be run from the command line\n";
++    exit();
+hunk ./scripts/ombqueuehandler.php 37
+-      
+-      function transport() {
+-              return 'omb';
+-      }
+-      
+-      function start() {
+-              $this->log(LOG_INFO, "INITIALIZE");
+-              return true;
+-      }
++    
++    function transport() {
++        return 'omb';
++    }
++    
++    function start() {
++        $this->log(LOG_INFO, "INITIALIZE");
++        return true;
++    }
+hunk ./scripts/ombqueuehandler.php 47
+-      function handle_notice($notice) {
+-              if ($this->is_remote($notice)) {
+-                      $this->log(LOG_DEBUG, 'Ignoring remote notice ' . $notice->id);
+-                      return true;
+-              } else {
+-                      return omb_broadcast_remote_subscribers($notice);
+-              }
+-      }
+-      
+-      function finish() {
+-      }
++    function handle_notice($notice) {
++        if ($this->is_remote($notice)) {
++            $this->log(LOG_DEBUG, 'Ignoring remote notice ' . $notice->id);
++            return true;
++        } else {
++            return omb_broadcast_remote_subscribers($notice);
++        }
++    }
++    
++    function finish() {
++    }
+hunk ./scripts/ombqueuehandler.php 59
+-      function is_remote($notice) {
+-              $user = User::staticGet($notice->profile_id);
+-              return is_null($user);
+-      }
++    function is_remote($notice) {
++        $user = User::staticGet($notice->profile_id);
++        return is_null($user);
++    }
+hunk ./scripts/publicqueuehandler.php 23
+-      print "This script must be run from the command line\n";
+-      exit();
++    print "This script must be run from the command line\n";
++    exit();
+hunk ./scripts/publicqueuehandler.php 37
+-      
+-      function transport() {
+-              return 'public';
+-      }
+-      
+-      function handle_notice($notice) {
+-              try {
+-                      return jabber_public_notice($notice);
+-              } catch (XMPPHP_Exception $e) {
+-                      $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
+-                      die($e->getMessage());
+-              }
+-      }
++    
++    function transport() {
++        return 'public';
++    }
++    
++    function handle_notice($notice) {
++        try {
++            return jabber_public_notice($notice);
++        } catch (XMPPHP_Exception $e) {
++            $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
++            die($e->getMessage());
++        }
++    }
+hunk ./scripts/sitemap.php 22
+-      global $output_paths;
+-      $output_dir = $output_paths['output_dir'];
+-      $output_url = $output_paths['output_url'];
++    global $output_paths;
++    $output_dir = $output_paths['output_dir'];
++    $output_url = $output_paths['output_url'];
+hunk ./scripts/sitemap.php 26
+-      foreach (glob("$output_dir*.xml") as $file_name) {
++    foreach (glob("$output_dir*.xml") as $file_name) {
+hunk ./scripts/sitemap.php 28
+-              # Just the file name please.
+-              $file_name = preg_replace("|$output_dir|", '', $file_name);
++        # Just the file name please.
++        $file_name = preg_replace("|$output_dir|", '', $file_name);
+hunk ./scripts/sitemap.php 31
+-              $index_urls .= sitemap(
+-                                                 array(
+-                                                               'url' => $output_url . $file_name,
+-                                                               'changefreq' => 'daily'
+-                                                               )
+-                                                 );
+-      }
++        $index_urls .= sitemap(
++                           array(
++                                 'url' => $output_url . $file_name,
++                                 'changefreq' => 'daily'
++                                 )
++                           );
++    }
+hunk ./scripts/sitemap.php 39
+-      write_file($output_paths['index_file'], sitemapindex($index_urls));
++    write_file($output_paths['index_file'], sitemapindex($index_urls));
+hunk ./scripts/sitemap.php 44
+-      global $output_paths;
++    global $output_paths;
+hunk ./scripts/sitemap.php 46
+-      $standard_map_urls .= url(
+-                                                        array(
+-                                                                      'url' => common_local_url('public'),
+-                                                                      'changefreq' => 'daily',
+-                                                                      'priority' => '1',
+-                                                                      )
+-                                                        );
++    $standard_map_urls .= url(
++                              array(
++                                    'url' => common_local_url('public'),
++                                    'changefreq' => 'daily',
++                                    'priority' => '1',
++                                    )
++                              );
+hunk ./scripts/sitemap.php 54
+-      $standard_map_urls .= url(
+-                                                        array(
+-                                                                      'url' => common_local_url('publicrss'),
+-                                                                      'changefreq' => 'daily',
+-                                                                      'priority' => '0.3',
+-                                                                      )
+-                                                        );
++    $standard_map_urls .= url(
++                              array(
++                                    'url' => common_local_url('publicrss'),
++                                    'changefreq' => 'daily',
++                                    'priority' => '0.3',
++                                    )
++                              );
+hunk ./scripts/sitemap.php 62
+-      $docs = array('about', 'faq', 'contact', 'im', 'openid', 'openmublog', 'privacy', 'source');
++    $docs = array('about', 'faq', 'contact', 'im', 'openid', 'openmublog', 'privacy', 'source');
+hunk ./scripts/sitemap.php 64
+-      foreach($docs as $title) {
+-              $standard_map_urls .= url(
+-                                                                array(
+-                                                                              'url' => common_local_url('doc', array('title' => $title)),
+-                                                                              'changefreq' => 'monthly',
+-                                                                              'priority'   => '0.2',
+-                                                                              )
+-                                                                );
+-      }
++    foreach($docs as $title) {
++        $standard_map_urls .= url(
++                                  array(
++                                        'url' => common_local_url('doc', array('title' => $title)),
++                                        'changefreq' => 'monthly',
++                                        'priority'   => '0.2',
++                                        )
++                                  );
++    }
+hunk ./scripts/sitemap.php 74
+-      $urlset_path = $output_paths['output_dir'] . 'standard.xml';
++    $urlset_path = $output_paths['output_dir'] . 'standard.xml';
+hunk ./scripts/sitemap.php 76
+-      write_file($urlset_path, urlset($standard_map_urls));
++    write_file($urlset_path, urlset($standard_map_urls));
+hunk ./scripts/sitemap.php 81
+-      global $output_paths;
++    global $output_paths;
+hunk ./scripts/sitemap.php 83
+-      $notices = DB_DataObject::factory('notice');
++    $notices = DB_DataObject::factory('notice');
+hunk ./scripts/sitemap.php 85
+-      $notices->query('SELECT id, uri, url, modified FROM notice where is_local = 1');
++    $notices->query('SELECT id, uri, url, modified FROM notice where is_local = 1');
+hunk ./scripts/sitemap.php 87
+-      $notice_count = 0;
+-      $map_count = 1;
++    $notice_count = 0;
++    $map_count = 1;
+hunk ./scripts/sitemap.php 90
+-      while ($notices->fetch()) {
++    while ($notices->fetch()) {
+hunk ./scripts/sitemap.php 92
+-              # Maximum 50,000 URLs per sitemap file.
+-              if ($notice_count == 50000) {
+-                      $notice_count = 0;
+-                      $map_count++;
+-              }
++        # Maximum 50,000 URLs per sitemap file.
++        if ($notice_count == 50000) {
++            $notice_count = 0;
++            $map_count++;
++        }
+hunk ./scripts/sitemap.php 98
+-              # remote notices have an URL
+-              
+-              if (!$notices->url && $notices->uri) {
+-                      $notice = array(
+-                                              'url'        => ($notices->uri) ? $notices->uri : common_local_url('shownotice', array('notice' => $notices->id)),
+-                                              'lastmod'    => common_date_w3dtf($notices->modified),
+-                                              'changefreq' => 'never',
+-                                              'priority'   => '1',
+-                                              );
++        # remote notices have an URL
++        
++        if (!$notices->url && $notices->uri) {
++            $notice = array(
++                        'url'        => ($notices->uri) ? $notices->uri : common_local_url('shownotice', array('notice' => $notices->id)),
++                        'lastmod'    => common_date_w3dtf($notices->modified),
++                        'changefreq' => 'never',
++                        'priority'   => '1',
++                        );
+hunk ./scripts/sitemap.php 108
+-                      $notice_list[$map_count] .= url($notice);
+-                      $notice_count++;
+-              }
+-      }
++            $notice_list[$map_count] .= url($notice);
++            $notice_count++;
++        }
++    }
+hunk ./scripts/sitemap.php 113
+-      # Make full sitemaps from the lists and save them.
+-      array_to_map($notice_list, 'notice');
++    # Make full sitemaps from the lists and save them.
++    array_to_map($notice_list, 'notice');
+hunk ./scripts/sitemap.php 119
+-      global $output_paths;
++    global $output_paths;
+hunk ./scripts/sitemap.php 121
+-      $users = DB_DataObject::factory('user');
++    $users = DB_DataObject::factory('user');
+hunk ./scripts/sitemap.php 123
+-      $users->query('SELECT id, nickname FROM user');
++    $users->query('SELECT id, nickname FROM user');
+hunk ./scripts/sitemap.php 125
+-      $user_count = 0;
+-      $map_count = 1;
++    $user_count = 0;
++    $map_count = 1;
+hunk ./scripts/sitemap.php 128
+-      while ($users->fetch()) {
++    while ($users->fetch()) {
+hunk ./scripts/sitemap.php 130
+-              # Maximum 50,000 URLs per sitemap file.
+-              if ($user_count == 50000) {
+-                      $user_count = 0;
+-                      $map_count++;
+-              }
++        # Maximum 50,000 URLs per sitemap file.
++        if ($user_count == 50000) {
++            $user_count = 0;
++            $map_count++;
++        }
+hunk ./scripts/sitemap.php 136
+-              $user_args = array('nickname' => $users->nickname);
++        $user_args = array('nickname' => $users->nickname);
+hunk ./scripts/sitemap.php 138
+-              # Define parameters for generating <url></url> elements.
+-              $user = array(
+-                                        'url'        => common_local_url('showstream', $user_args),
+-                                        'changefreq' => 'daily',
+-                                        'priority'   => '1',
+-                                        );
++        # Define parameters for generating <url></url> elements.
++        $user = array(
++                      'url'        => common_local_url('showstream', $user_args),
++                      'changefreq' => 'daily',
++                      'priority'   => '1',
++                      );
+hunk ./scripts/sitemap.php 145
+-              $user_rss = array(
+-                                                'url'        => common_local_url('userrss', $user_args),
+-                                                'changefreq' => 'daily',
+-                                                'priority'   => '0.3',
+-                                                );
++        $user_rss = array(
++                          'url'        => common_local_url('userrss', $user_args),
++                          'changefreq' => 'daily',
++                          'priority'   => '0.3',
++                          );
+hunk ./scripts/sitemap.php 151
+-              $all = array(
+-                                       'url'        => common_local_url('all', $user_args),
+-                                       'changefreq' => 'daily',
+-                                       'priority'   => '1',
+-                                       );
++        $all = array(
++                     'url'        => common_local_url('all', $user_args),
++                     'changefreq' => 'daily',
++                     'priority'   => '1',
++                     );
+hunk ./scripts/sitemap.php 157
+-              $all_rss = array(
+-                                               'url'        => common_local_url('allrss', $user_args),
+-                                               'changefreq' => 'daily',
+-                                               'priority'   => '0.3',
+-                                               );
++        $all_rss = array(
++                         'url'        => common_local_url('allrss', $user_args),
++                         'changefreq' => 'daily',
++                         'priority'   => '0.3',
++                         );
+hunk ./scripts/sitemap.php 163
+-              $replies = array(
+-                                               'url'        => common_local_url('replies', $user_args),
+-                                               'changefreq' => 'daily',
+-                                               'priority'   => '1',
+-                                               );
++        $replies = array(
++                         'url'        => common_local_url('replies', $user_args),
++                         'changefreq' => 'daily',
++                         'priority'   => '1',
++                         );
+hunk ./scripts/sitemap.php 169
+-              $replies_rss = array(
+-                                                       'url'        => common_local_url('repliesrss', $user_args),
+-                                                       'changefreq' => 'daily',
+-                                                       'priority'   => '0.3',
+-                                                       );
++        $replies_rss = array(
++                             'url'        => common_local_url('repliesrss', $user_args),
++                             'changefreq' => 'daily',
++                             'priority'   => '0.3',
++                             );
+hunk ./scripts/sitemap.php 175
+-              $foaf = array(
+-                                        'url'        => common_local_url('foaf', $user_args),
+-                                        'changefreq' => 'weekly',
+-                                        'priority'   => '0.5',
+-                                        );
++        $foaf = array(
++                      'url'        => common_local_url('foaf', $user_args),
++                      'changefreq' => 'weekly',
++                      'priority'   => '0.5',
++                      );
+hunk ./scripts/sitemap.php 181
+-              # Construct a <url></url> element for each user facet and add it
+-              # to our existing list of those.
+-              $user_list[$map_count]        .= url($user);
+-              $user_rss_list[$map_count]    .= url($user_rss);
+-              $all_list[$map_count]         .= url($all);
+-              $all_rss_list[$map_count]     .= url($all_rss);
+-              $replies_list[$map_count]     .= url($replies);
+-              $replies_rss_list[$map_count] .= url($replies_rss);
+-              $foaf_list[$map_count]        .= url($foaf);
++        # Construct a <url></url> element for each user facet and add it
++        # to our existing list of those.
++        $user_list[$map_count]        .= url($user);
++        $user_rss_list[$map_count]    .= url($user_rss);
++        $all_list[$map_count]         .= url($all);
++        $all_rss_list[$map_count]     .= url($all_rss);
++        $replies_list[$map_count]     .= url($replies);
++        $replies_rss_list[$map_count] .= url($replies_rss);
++        $foaf_list[$map_count]        .= url($foaf);
+hunk ./scripts/sitemap.php 191
+-              $user_count++;
+-      }
++        $user_count++;
++    }
+hunk ./scripts/sitemap.php 194
+-      # Make full sitemaps from the lists and save them.
+-      # Possible factoring: put all the lists into a master array, thus allowing
+-      # calling with single argument (i.e., array_to_map('user')).
+-      array_to_map($user_list, 'user');
+-      array_to_map($user_rss_list, 'user_rss');
+-      array_to_map($all_list, 'all');
+-      array_to_map($all_rss_list, 'all_rss');
+-      array_to_map($replies_list, 'replies');
+-      array_to_map($replies_rss_list, 'replies_rss');
+-      array_to_map($foaf_list, 'foaf');
++    # Make full sitemaps from the lists and save them.
++    # Possible factoring: put all the lists into a master array, thus allowing
++    # calling with single argument (i.e., array_to_map('user')).
++    array_to_map($user_list, 'user');
++    array_to_map($user_rss_list, 'user_rss');
++    array_to_map($all_list, 'all');
++    array_to_map($all_rss_list, 'all_rss');
++    array_to_map($replies_list, 'replies');
++    array_to_map($replies_rss_list, 'replies_rss');
++    array_to_map($foaf_list, 'foaf');
+hunk ./scripts/sitemap.php 212
+-      $url        = preg_replace('/&/', '&amp;', $url_args['url']); # escape ampersands for XML
+-      $lastmod    = $url_args['lastmod'];
+-      $changefreq = $url_args['changefreq'];
+-      $priority   = $url_args['priority'];
++    $url        = preg_replace('/&/', '&amp;', $url_args['url']); # escape ampersands for XML
++    $lastmod    = $url_args['lastmod'];
++    $changefreq = $url_args['changefreq'];
++    $priority   = $url_args['priority'];
+hunk ./scripts/sitemap.php 217
+-      if (is_null($url)) {
+-              error("url() arguments require 'url' value.");
+-      }
++    if (is_null($url)) {
++        error("url() arguments require 'url' value.");
++    }
+hunk ./scripts/sitemap.php 221
+-      $url_out = "\t<url>\n";
+-      $url_out .= "\t\t<loc>$url</loc>\n";
++    $url_out = "\t<url>\n";
++    $url_out .= "\t\t<loc>$url</loc>\n";
+hunk ./scripts/sitemap.php 224
+-      if ($changefreq) {
+-              $url_out .= "\t\t<changefreq>$changefreq</changefreq>\n";
+-      }
++    if ($changefreq) {
++        $url_out .= "\t\t<changefreq>$changefreq</changefreq>\n";
++    }
+hunk ./scripts/sitemap.php 228
+-      if ($lastmod) {
+-              $url_out .= "\t\t<lastmod>$lastmod</lastmod>\n";
+-      }
++    if ($lastmod) {
++        $url_out .= "\t\t<lastmod>$lastmod</lastmod>\n";
++    }
+hunk ./scripts/sitemap.php 232
+-      if ($priority) {
+-              $url_out .= "\t\t<priority>$priority</priority>\n";
+-      }
++    if ($priority) {
++        $url_out .= "\t\t<priority>$priority</priority>\n";
++    }
+hunk ./scripts/sitemap.php 236
+-      $url_out .= "\t</url>\n";
++    $url_out .= "\t</url>\n";
+hunk ./scripts/sitemap.php 238
+-      return $url_out;
++    return $url_out;
+hunk ./scripts/sitemap.php 242
+-      $url        = preg_replace('/&/', '&amp;', $sitemap_args['url']); # escape ampersands for XML
+-      $lastmod    = $sitemap_args['lastmod'];
++    $url        = preg_replace('/&/', '&amp;', $sitemap_args['url']); # escape ampersands for XML
++    $lastmod    = $sitemap_args['lastmod'];
+hunk ./scripts/sitemap.php 245
+-      if (is_null($url)) {
+-              error("url() arguments require 'url' value.");
+-      }
++    if (is_null($url)) {
++        error("url() arguments require 'url' value.");
++    }
+hunk ./scripts/sitemap.php 249
+-      $sitemap_out = "\t<sitemap>\n";
+-      $sitemap_out .= "\t\t<loc>$url</loc>\n";
++    $sitemap_out = "\t<sitemap>\n";
++    $sitemap_out .= "\t\t<loc>$url</loc>\n";
+hunk ./scripts/sitemap.php 252
+-      if ($lastmod) {
+-              $sitemap_out .= "\t\t<lastmod>$lastmod</lastmod>\n";
+-      }
++    if ($lastmod) {
++        $sitemap_out .= "\t\t<lastmod>$lastmod</lastmod>\n";
++    }
+hunk ./scripts/sitemap.php 256
+-      $sitemap_out .= "\t</sitemap>\n";
++    $sitemap_out .= "\t</sitemap>\n";
+hunk ./scripts/sitemap.php 258
+-      return $sitemap_out;
++    return $sitemap_out;
+hunk ./scripts/sitemap.php 263
+-      $urlset = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
+-        '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n" .
+-        $urlset_text .
+-        '</urlset>';
++    $urlset = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
++      '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n" .
++      $urlset_text .
++      '</urlset>';
+hunk ./scripts/sitemap.php 268
+-      return $urlset;
++    return $urlset;
+hunk ./scripts/sitemap.php 273
+-      $sitemapindex = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
+-        '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n" .
+-        $sitemapindex_text .
+-        '</sitemapindex>';
++    $sitemapindex = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
++      '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n" .
++      $sitemapindex_text .
++      '</sitemapindex>';
+hunk ./scripts/sitemap.php 278
+-      return $sitemapindex;
++    return $sitemapindex;
+hunk ./scripts/sitemap.php 283
+-      global $output_paths;
++    global $output_paths;
+hunk ./scripts/sitemap.php 285
+-      if ($url_list) {
+-              # $map_urls is a long string containing concatenated <url></url> elements.
+-              while (list($map_idx, $map_urls) = each($url_list)) {
+-                      $urlset_path = $output_paths['output_dir'] . "$filename_prefix-$map_idx.xml";
+-                      
+-                      write_file($urlset_path, urlset($map_urls));
+-              }
+-      }
++    if ($url_list) {
++        # $map_urls is a long string containing concatenated <url></url> elements.
++        while (list($map_idx, $map_urls) = each($url_list)) {
++            $urlset_path = $output_paths['output_dir'] . "$filename_prefix-$map_idx.xml";
++            
++            write_file($urlset_path, urlset($map_urls));
++        }
++    }
+hunk ./scripts/sitemap.php 301
+-      $args = getopt('f:d:u:');
++    $args = getopt('f:d:u:');
+hunk ./scripts/sitemap.php 303
+-      if (is_null($args[f]) && is_null($args[d]) && is_null($args[u])) {
+-              error('Mandatory arguments: -f <index file path> -d <output directory path> -u <URL of sitemaps directory>');
+-      }
++    if (is_null($args[f]) && is_null($args[d]) && is_null($args[u])) {
++        error('Mandatory arguments: -f <index file path> -d <output directory path> -u <URL of sitemaps directory>');
++    }
+hunk ./scripts/sitemap.php 307
+-      if (is_null($args[f])) {
+-              error('You must specify an index file name with the -f option.');
+-      }
++    if (is_null($args[f])) {
++        error('You must specify an index file name with the -f option.');
++    }
+hunk ./scripts/sitemap.php 311
+-      if (is_null($args[d])) {
+-              error('You must specify a directory for the output file with the -d option.');
+-      }
++    if (is_null($args[d])) {
++        error('You must specify a directory for the output file with the -d option.');
++    }
+hunk ./scripts/sitemap.php 315
+-      if (is_null($args[u])) {
+-              error('You must specify a URL for the directory where the sitemaps will be kept with the -u option.');
+-      }
++    if (is_null($args[u])) {
++        error('You must specify a URL for the directory where the sitemaps will be kept with the -u option.');
++    }
+hunk ./scripts/sitemap.php 319
+-      $index_file = $args[f];
+-      $output_dir = $args[d];
+-      $output_url = $args[u];
++    $index_file = $args[f];
++    $output_dir = $args[d];
++    $output_url = $args[u];
+hunk ./scripts/sitemap.php 323
+-      if (file_exists($output_dir)) {
+-              if (is_writable($output_dir) === FALSE) {
+-                      error("$output_dir is not writable.");
+-              }
+-      }        else {
+-              error("output directory $output_dir does not exist.");
+-      }
++    if (file_exists($output_dir)) {
++        if (is_writable($output_dir) === FALSE) {
++            error("$output_dir is not writable.");
++        }
++    }     else {
++        error("output directory $output_dir does not exist.");
++    }
+hunk ./scripts/sitemap.php 331
+-      $paths = array(
+-                                 'index_file' => $index_file,
+-                                 'output_dir' => trailing_slash($output_dir),
+-                                 'output_url' => trailing_slash($output_url),
+-                                 );
++    $paths = array(
++                   'index_file' => $index_file,
++                   'output_dir' => trailing_slash($output_dir),
++                   'output_url' => trailing_slash($output_url),
++                   );
+hunk ./scripts/sitemap.php 337
+-      return $paths;
++    return $paths;
+hunk ./scripts/sitemap.php 342
+-      if (preg_match('/\/$/', $path) == 0) {
+-              $path .= '/';
+-      }
++    if (preg_match('/\/$/', $path) == 0) {
++        $path .= '/';
++    }
+hunk ./scripts/sitemap.php 346
+-      return $path;
++    return $path;
+hunk ./scripts/sitemap.php 351
+-      if (is_null($path)) {
+-              error('No path specified for writing to.');
+-      }        elseif (is_null($data)) {
+-              error('No data specified for writing.');
+-      }
++    if (is_null($path)) {
++        error('No path specified for writing to.');
++    }     elseif (is_null($data)) {
++        error('No data specified for writing.');
++    }
+hunk ./scripts/sitemap.php 357
+-      if (($fh_out = fopen($path,'w')) === FALSE) {
+-              error("couldn't open $path for writing.");
+-      }
++    if (($fh_out = fopen($path,'w')) === FALSE) {
++        error("couldn't open $path for writing.");
++    }
+hunk ./scripts/sitemap.php 361
+-      if (fwrite($fh_out, $data) === FALSE) {
+-              error("couldn't write to $path.");
+-      }
++    if (fwrite($fh_out, $data) === FALSE) {
++        error("couldn't write to $path.");
++    }
+hunk ./scripts/sitemap.php 368
+-      if (is_null($error_msg)) {
+-              $error_msg = 'error() was called without any explanation!';
+-      }
++    if (is_null($error_msg)) {
++        $error_msg = 'error() was called without any explanation!';
++    }
+hunk ./scripts/sitemap.php 372
+-      echo "Error: $error_msg\n";
+-      exit(1);
++    echo "Error: $error_msg\n";
++    exit(1);
+hunk ./scripts/smsqueuehandler.php 23
+-      print "This script must be run from the command line\n";
+-      exit();
++    print "This script must be run from the command line\n";
++    exit();
+hunk ./scripts/smsqueuehandler.php 37
+-      
+-      function transport() {
+-              return 'sms';
+-      }
++    
++    function transport() {
++        return 'sms';
++    }
+hunk ./scripts/smsqueuehandler.php 42
+-      function start() {
+-              $this->log(LOG_INFO, "INITIALIZE");
+-              return true;
+-      }
++    function start() {
++        $this->log(LOG_INFO, "INITIALIZE");
++        return true;
++    }
+hunk ./scripts/smsqueuehandler.php 47
+-      function handle_notice($notice) {
+-              return mail_broadcast_notice_sms($notice);
+-      }
+-      
+-      function finish() {
+-      }
++    function handle_notice($notice) {
++        return mail_broadcast_notice_sms($notice);
++    }
++    
++    function finish() {
++    }
+hunk ./scripts/synctwitterfriends.php 14
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.        See the
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
+hunk ./scripts/synctwitterfriends.php 18
+- * along with this program.    If not, see <http://www.gnu.org/licenses/>.
++ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+hunk ./scripts/synctwitterfriends.php 23
+-      print "This script must be run from the command line\n";
+-      exit();
++    print "This script must be run from the command line\n";
++    exit();
+hunk ./scripts/synctwitterfriends.php 38
+-      if (($flink->friendsync & FOREIGN_FRIEND_RECV) == FOREIGN_FRIEND_RECV) {
++    if (($flink->friendsync & FOREIGN_FRIEND_RECV) == FOREIGN_FRIEND_RECV) {
+hunk ./scripts/synctwitterfriends.php 40
+-              $user = User::staticGet($flink->user_id);
++        $user = User::staticGet($flink->user_id);
+hunk ./scripts/synctwitterfriends.php 42
+-              print "Updating Twitter friends for user $user->nickname ($user->id)\n";
++        print "Updating Twitter friends for user $user->nickname ($user->id)\n";
+hunk ./scripts/synctwitterfriends.php 44
+-              $fuser = $flink->getForeignUser();
++        $fuser = $flink->getForeignUser();
+hunk ./scripts/synctwitterfriends.php 46
+-              $result = save_twitter_friends($user, $fuser->id, $fuser->nickname, $flink->credentials);
++        $result = save_twitter_friends($user, $fuser->id, $fuser->nickname, $flink->credentials);
+hunk ./scripts/synctwitterfriends.php 48
+-              if ($result == false) {
+-                      print "Problems updating Twitter friends! Check the log.\n";
+-                      exit(1);
+-              }
+-      }
++        if ($result == false) {
++            print "Problems updating Twitter friends! Check the log.\n";
++            exit(1);
++        }
++    }
+hunk ./scripts/update_translations.php 8
+-      'da_DK' => 'http://laconi.ca/translate/download.php?file_id=23',
+-      'nl_NL' => 'http://laconi.ca/translate/download.php?file_id=39',
+-      'en_NZ' => 'http://laconi.ca/translate/download.php?file_id=15',
+-      'eo'    => 'http://laconi.ca/translate/download.php?file_id=10',
+-      'fr_FR' => 'http://laconi.ca/translate/download.php?file_id=19',
+-      'de_DE' => 'http://laconi.ca/translate/download.php?file_id=18',
+-      'it_IT' => 'http://laconi.ca/translate/download.php?file_id=21',
+-      'ko'    => 'http://laconi.ca/translate/download.php?file_id=33',
+-      'no_NB' => 'http://laconi.ca/translate/download.php?file_id=31',
+-      'pt'    => 'http://laconi.ca/translate/download.php?file_id=8',
+-      'pt_BR' => 'http://laconi.ca/translate/download.php?file_id=72',
+-      'ru_RU' => 'http://laconi.ca/translate/download.php?file_id=26',
+-      'es'    => 'http://laconi.ca/translate/download.php?file_id=9',
+-      'tr_TR' => 'http://laconi.ca/translate/download.php?file_id=37',
+-      'uk_UA' => 'http://laconi.ca/translate/download.php?file_id=44',
+-      'he_IL' => 'http://laconi.ca/translate/download.php?file_id=71',
+-      'mk_MK' => 'http://laconi.ca/translate/download.php?file_id=67',
+-      'ja_JP' => 'http://laconi.ca/translate/download.php?file_id=43',
+-      'cs_CZ' => 'http://laconi.ca/translate/download.php?file_id=63',
+-      'ca_ES' => 'http://laconi.ca/translate/download.php?file_id=49',
+-      'pl_PL' => 'http://laconi.ca/translate/download.php?file_id=51',
+-      'sv_SE' => 'http://laconi.ca/translate/download.php?file_id=55'
++    'da_DK' => 'http://laconi.ca/translate/download.php?file_id=23',
++    'nl_NL' => 'http://laconi.ca/translate/download.php?file_id=39',
++    'en_NZ' => 'http://laconi.ca/translate/download.php?file_id=15',
++    'eo'    => 'http://laconi.ca/translate/download.php?file_id=10',
++    'fr_FR' => 'http://laconi.ca/translate/download.php?file_id=19',
++    'de_DE' => 'http://laconi.ca/translate/download.php?file_id=18',
++    'it_IT' => 'http://laconi.ca/translate/download.php?file_id=21',
++    'ko'    => 'http://laconi.ca/translate/download.php?file_id=33',
++    'no_NB' => 'http://laconi.ca/translate/download.php?file_id=31',
++    'pt'    => 'http://laconi.ca/translate/download.php?file_id=8',
++    'pt_BR' => 'http://laconi.ca/translate/download.php?file_id=72',
++    'ru_RU' => 'http://laconi.ca/translate/download.php?file_id=26',
++    'es'    => 'http://laconi.ca/translate/download.php?file_id=9',
++    'tr_TR' => 'http://laconi.ca/translate/download.php?file_id=37',
++    'uk_UA' => 'http://laconi.ca/translate/download.php?file_id=44',
++    'he_IL' => 'http://laconi.ca/translate/download.php?file_id=71',
++    'mk_MK' => 'http://laconi.ca/translate/download.php?file_id=67',
++    'ja_JP' => 'http://laconi.ca/translate/download.php?file_id=43',
++    'cs_CZ' => 'http://laconi.ca/translate/download.php?file_id=63',
++    'ca_ES' => 'http://laconi.ca/translate/download.php?file_id=49',
++    'pl_PL' => 'http://laconi.ca/translate/download.php?file_id=51',
++    'sv_SE' => 'http://laconi.ca/translate/download.php?file_id=55'
+hunk ./scripts/update_translations.php 35
+-      $lcdir='locale/'.$code;
+-      $msgdir=$lcdir.'/LC_MESSAGES';
+-      $pofile=$msgdir.'/laconica.po';
+-      $mofile=$msgdir.'/laconica.mo';
++    $lcdir='locale/'.$code;
++    $msgdir=$lcdir.'/LC_MESSAGES';
++    $pofile=$msgdir.'/laconica.po';
++    $mofile=$msgdir.'/laconica.mo';
+hunk ./scripts/update_translations.php 40
+-      /* Check for an existing */
+-      if (!is_dir($msgdir)) {
+-              mkdir($lcdir);
+-              mkdir($msgdir);
+-              $existingSHA1 = '';
+-      } else {
+-              $existingSHA1 = file_exists($pofile) ? sha1_file($pofile) : '';
+-      }
++    /* Check for an existing */
++    if (!is_dir($msgdir)) {
++        mkdir($lcdir);
++        mkdir($msgdir);
++        $existingSHA1 = '';
++    } else {
++        $existingSHA1 = file_exists($pofile) ? sha1_file($pofile) : '';
++    }
+hunk ./scripts/update_translations.php 49
+-      /* Get the remote one */
+-      $newFile = file_get_contents($file);
++    /* Get the remote one */
++    $newFile = file_get_contents($file);
+hunk ./scripts/update_translations.php 52
+-      // Update if the local .po file is different to the one downloaded, or
+-      // if the .mo file is not present.
+-      if(sha1($newFile)!=$existingSHA1 || !file_exists($mofile)) {
+-              echo "Updating ".$code."\n";
+-              file_put_contents($pofile, $newFile);
+-              $prevdir = getcwd();
+-              chdir($msgdir);
+-              system('msgmerge -U laconica.po ../../laconica.pot');
+-              system('msgfmt -f -o laconica.mo laconica.po');
+-              chdir($prevdir);
+-      } else {
+-              echo "Unchanged - ".$code."\n";
+-      }
++    // Update if the local .po file is different to the one downloaded, or
++    // if the .mo file is not present.
++    if(sha1($newFile)!=$existingSHA1 || !file_exists($mofile)) {
++        echo "Updating ".$code."\n";
++        file_put_contents($pofile, $newFile);
++        $prevdir = getcwd();
++        chdir($msgdir);
++        system('msgmerge -U laconica.po ../../laconica.pot');
++        system('msgfmt -f -o laconica.mo laconica.po');
++        chdir($prevdir);
++    } else {
++        echo "Unchanged - ".$code."\n";
++    }
+hunk ./scripts/xmppconfirmhandler.php 23
+-      print "This script must be run from the command line\n";
+-      exit();
++    print "This script must be run from the command line\n";
++    exit();
+hunk ./scripts/xmppconfirmhandler.php 40
+-      var $_id = 'confirm';
+-      
+-      function class_name() {
+-              return 'XmppConfirmHandler';
+-      }
+-      
+-      function run() {
+-              if (!$this->start()) {
+-                      return false;
+-              }
+-              $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,
+-                                                                                                $confirm->address);
+-                              if (!$success) {
+-                                      $this->log(LOG_ERR, '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; need a dupe so we don't have the WHERE clause
+-                                      $dupe = Confirm_address::staticGet('code', $confirm->code);
+-                                      if (!$dupe) {
+-                                              common_log(LOG_WARNING, 'Could not refetch confirm', __FILE__);
+-                                              continue;
+-                                      }
+-                                      $orig = clone($dupe);
+-                                      $dupe->sent = $dupe->claimed;
+-                                      $result = $dupe->update($orig);
+-                                      if (!$result) {
+-                                              common_log_db_error($dupe, 'UPDATE', __FILE__);
+-                                              # Just let the claim age out; hopefully things work then
+-                                              continue;
+-                                      }
+-                                      $dupe->free();
+-                                      unset($dupe);
+-                              }
+-                              $user->free();
+-                              unset($user);
+-                              $confirm->free();
+-                              unset($confirm);
+-                              $this->idle(0);
+-                      } else {
+-#                             $this->clear_old_confirm_claims();
+-                              $this->idle(10);
+-                      }
+-              } while (true);
+-              if (!$this->finish()) {
+-                      return false;
+-              }
+-              return true;
+-      }
++    var $_id = 'confirm';
++    
++    function class_name() {
++        return 'XmppConfirmHandler';
++    }
++    
++    function run() {
++        if (!$this->start()) {
++            return false;
++        }
++        $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,
++                                                  $confirm->address);
++                if (!$success) {
++                    $this->log(LOG_ERR, '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; need a dupe so we don't have the WHERE clause
++                    $dupe = Confirm_address::staticGet('code', $confirm->code);
++                    if (!$dupe) {
++                        common_log(LOG_WARNING, 'Could not refetch confirm', __FILE__);
++                        continue;
++                    }
++                    $orig = clone($dupe);
++                    $dupe->sent = $dupe->claimed;
++                    $result = $dupe->update($orig);
++                    if (!$result) {
++                        common_log_db_error($dupe, 'UPDATE', __FILE__);
++                        # Just let the claim age out; hopefully things work then
++                        continue;
++                    }
++                    $dupe->free();
++                    unset($dupe);
++                }
++                $user->free();
++                unset($user);
++                $confirm->free();
++                unset($confirm);
++                $this->idle(0);
++            } else {
++#                $this->clear_old_confirm_claims();
++                $this->idle(10);
++            }
++        } while (true);
++        if (!$this->finish()) {
++            return false;
++        }
++        return true;
++    }
+hunk ./scripts/xmppconfirmhandler.php 102
+-      function next_confirm() {
+-              $confirm = new Confirm_address();
+-              $confirm->whereAdd('claimed IS NULL');
+-              $confirm->whereAdd('sent IS NULL');
+-              # XXX: eventually we could do other confirmations in the queue, too
+-              $confirm->address_type = 'jabber';
+-              $confirm->orderBy('modified DESC');
+-              $confirm->limit(1);
+-              if ($confirm->find(TRUE)) {
+-                      $this->log(LOG_INFO, 'Claiming confirmation for ' . $confirm->address);
+-                      # working around some weird DB_DataObject behaviour
+-                      $confirm->whereAdd(''); # clears where stuff
+-                      $original = clone($confirm);
+-                      $confirm->claimed = common_sql_now();
+-                      $result = $confirm->update($original);
+-                      if ($result) {
+-                              $this->log(LOG_INFO, 'Succeeded in claim! '. $result);
+-                              return $confirm;
+-                      } else {
+-                              $this->log(LOG_INFO, 'Failed in claim!');
+-                              return false;
+-                      }
+-              }
+-              return NULL;
+-      }
++    function next_confirm() {
++        $confirm = new Confirm_address();
++        $confirm->whereAdd('claimed IS NULL');
++        $confirm->whereAdd('sent IS NULL');
++        # XXX: eventually we could do other confirmations in the queue, too
++        $confirm->address_type = 'jabber';
++        $confirm->orderBy('modified DESC');
++        $confirm->limit(1);
++        if ($confirm->find(TRUE)) {
++            $this->log(LOG_INFO, 'Claiming confirmation for ' . $confirm->address);
++                # working around some weird DB_DataObject behaviour
++            $confirm->whereAdd(''); # clears where stuff
++            $original = clone($confirm);
++            $confirm->claimed = common_sql_now();
++            $result = $confirm->update($original);
++            if ($result) {
++                $this->log(LOG_INFO, 'Succeeded in claim! '. $result);
++                return $confirm;
++            } else {
++                $this->log(LOG_INFO, 'Failed in claim!');
++                return false;
++            }
++        }
++        return NULL;
++    }
+hunk ./scripts/xmppconfirmhandler.php 128
+-      function clear_old_confirm_claims() {
+-              $confirm = new Confirm();
+-              $confirm->claimed = NULL;
+-              $confirm->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
+-              $confirm->update(DB_DATAOBJECT_WHEREADD_ONLY);
+-              $confirm->free();
+-              unset($confirm);
+-      }
++    function clear_old_confirm_claims() {
++        $confirm = new Confirm();
++        $confirm->claimed = NULL;
++        $confirm->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
++        $confirm->update(DB_DATAOBJECT_WHEREADD_ONLY);
++        $confirm->free();
++        unset($confirm);
++    }
+hunk ./scripts/xmppdaemon.php 23
+-      print "This script must be run from the command line\n";
+-      exit();
++    print "This script must be run from the command line\n";
++    exit();
+hunk ./scripts/xmppdaemon.php 42
+-      function XMPPDaemon($resource=NULL) {
+-              static $attrs = array('server', 'port', 'user', 'password', 'host');
++    function XMPPDaemon($resource=NULL) {
++        static $attrs = array('server', 'port', 'user', 'password', 'host');
+hunk ./scripts/xmppdaemon.php 45
+-              foreach ($attrs as $attr)
+-              {
+-                      $this->$attr = common_config('xmpp', $attr);
+-              }
++        foreach ($attrs as $attr)
++        {
++            $this->$attr = common_config('xmpp', $attr);
++        }
+hunk ./scripts/xmppdaemon.php 50
+-              if ($resource) {
+-                      $this->resource = $resource;
+-              } else {
+-                      $this->resource = common_config('xmpp', 'resource') . 'daemon';
+-              }
++        if ($resource) {
++            $this->resource = $resource;
++        } else {
++            $this->resource = common_config('xmpp', 'resource') . 'daemon';
++        }
+hunk ./scripts/xmppdaemon.php 56
+-              $this->log(LOG_INFO, "INITIALIZE XMPPDaemon {$this->user}@{$this->server}/{$this->resource}");
+-      }
++        $this->log(LOG_INFO, "INITIALIZE XMPPDaemon {$this->user}@{$this->server}/{$this->resource}");
++    }
+hunk ./scripts/xmppdaemon.php 59
+-      function connect() {
++    function connect() {
+hunk ./scripts/xmppdaemon.php 61
+-              $connect_to = ($this->host) ? $this->host : $this->server;
++        $connect_to = ($this->host) ? $this->host : $this->server;
+hunk ./scripts/xmppdaemon.php 63
+-              $this->log(LOG_INFO, "Connecting to $connect_to on port $this->port");
++        $this->log(LOG_INFO, "Connecting to $connect_to on port $this->port");
+hunk ./scripts/xmppdaemon.php 65
+-              $this->conn = jabber_connect($this->resource);
++        $this->conn = jabber_connect($this->resource);
+hunk ./scripts/xmppdaemon.php 67
+-              if (!$this->conn) {
+-                      return false;
+-              }
++        if (!$this->conn) {
++            return false;
++        }
+hunk ./scripts/xmppdaemon.php 71
+-              $this->conn->setReconnectTimeout(600);
++        $this->conn->setReconnectTimeout(600);
+hunk ./scripts/xmppdaemon.php 73
+-              jabber_send_presence("Send me a message to post a notice", 'available',
+-                                                       NULL, 'available', 100);
+-              return !$this->conn->isDisconnected();
+-      }
++        jabber_send_presence("Send me a message to post a notice", 'available',
++                             NULL, 'available', 100);
++        return !$this->conn->isDisconnected();
++    }
+hunk ./scripts/xmppdaemon.php 78
+-      function name() {
+-              return strtolower('xmppdaemon.'.$this->resource);
+-      }
++    function name() {
++        return strtolower('xmppdaemon.'.$this->resource);
++    }
+hunk ./scripts/xmppdaemon.php 82
+-      function run() {
+-              if ($this->connect()) {
++    function run() {
++        if ($this->connect()) {
+hunk ./scripts/xmppdaemon.php 85
+-                      $this->conn->addEventHandler('message', 'handle_message', $this);
+-                      $this->conn->addEventHandler('presence', 'handle_presence', $this);
+-                      $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
++            $this->conn->addEventHandler('message', 'handle_message', $this);
++            $this->conn->addEventHandler('presence', 'handle_presence', $this);
++            $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
+hunk ./scripts/xmppdaemon.php 89
+-                      $this->conn->process();
+-              }
+-      }
++            $this->conn->process();
++        }
++    }
+hunk ./scripts/xmppdaemon.php 93
+-      function handle_reconnect(&$pl) {
+-              $this->conn->processUntil('session_start');
+-              $this->conn->presence('Send me a message to post a notice', 'available', NULL, 'available', 100);
+-      }
++    function handle_reconnect(&$pl) {
++        $this->conn->processUntil('session_start');
++        $this->conn->presence('Send me a message to post a notice', 'available', NULL, 'available', 100);
++    }
+hunk ./scripts/xmppdaemon.php 98
+-      function get_user($from) {
+-              $user = User::staticGet('jabber', jabber_normalize_jid($from));
+-              return $user;
+-      }
++    function get_user($from) {
++        $user = User::staticGet('jabber', jabber_normalize_jid($from));
++        return $user;
++    }
+hunk ./scripts/xmppdaemon.php 103
+-      function handle_message(&$pl) {
+-              if ($pl['type'] != 'chat') {
+-                      return;
+-              }
+-              if (mb_strlen($pl['body']) == 0) {
+-                      return;
+-              }
++    function handle_message(&$pl) {
++        if ($pl['type'] != 'chat') {
++            return;
++        }
++        if (mb_strlen($pl['body']) == 0) {
++            return;
++        }
+hunk ./scripts/xmppdaemon.php 111
+-              $from = jabber_normalize_jid($pl['from']);
++        $from = jabber_normalize_jid($pl['from']);
+hunk ./scripts/xmppdaemon.php 113
+-              # Forwarded from another daemon (probably a broadcaster) for
+-              # us to handle
++        # Forwarded from another daemon (probably a broadcaster) for
++        # us to handle
+hunk ./scripts/xmppdaemon.php 116
+-              if ($this->is_self($from)) {
+-                      $from = $this->get_ofrom($pl);
+-                      if (is_null($from) || $this->is_self($from)) {
+-                              return;
+-                      }
+-              }
++        if ($this->is_self($from)) {
++            $from = $this->get_ofrom($pl);
++            if (is_null($from) || $this->is_self($from)) {
++                return;
++            }
++        }
+hunk ./scripts/xmppdaemon.php 123
+-              $user = $this->get_user($from);
++        $user = $this->get_user($from);
+hunk ./scripts/xmppdaemon.php 125
+-              if (!$user) {
+-                      $this->from_site($from, 'Unknown user; go to ' .
+-                                                       common_local_url('imsettings') .
+-                                                       ' to add your address to your account');
+-                      $this->log(LOG_WARNING, 'Message from unknown user ' . $from);
+-                      return;
+-              }
+-              if ($this->handle_command($user, $pl['body'])) {
+-                      return;
+-              } else if ($this->is_autoreply($pl['body'])) {
+-                      $this->log(LOG_INFO, 'Ignoring auto reply from ' . $from);
+-                      return;
+-              } else if ($this->is_otr($pl['body'])) {
+-                      $this->log(LOG_INFO, 'Ignoring OTR from ' . $from);
+-                      return;
+-              } else if ($this->is_direct($pl['body'])) {
+-                      preg_match_all('/d[\ ]*([a-z0-9]{1,64})/', $pl['body'], $to);
++        if (!$user) {
++            $this->from_site($from, 'Unknown user; go to ' .
++                             common_local_url('imsettings') .
++                             ' to add your address to your account');
++            $this->log(LOG_WARNING, 'Message from unknown user ' . $from);
++            return;
++        }
++        if ($this->handle_command($user, $pl['body'])) {
++            return;
++        } else if ($this->is_autoreply($pl['body'])) {
++            $this->log(LOG_INFO, 'Ignoring auto reply from ' . $from);
++            return;
++        } else if ($this->is_otr($pl['body'])) {
++            $this->log(LOG_INFO, 'Ignoring OTR from ' . $from);
++            return;
++        } else if ($this->is_direct($pl['body'])) {
++            preg_match_all('/d[\ ]*([a-z0-9]{1,64})/', $pl['body'], $to);
+hunk ./scripts/xmppdaemon.php 143
+-                      $to = preg_replace('/^d([\ ])*/', '', $to[0][0]);
+-                      $body = preg_replace('/d[\ ]*('. $to .')[\ ]*/', '', $pl['body']);
+-                      $this->add_direct($user, $body, $to, $from);
+-              } else {
+-                      $len = mb_strlen($pl['body']);
+-                      if($len > 140) {
+-                              $this->from_site($from, 'Message too long - maximum is 140 characters, you sent ' . $len);
+-                              return;
+-                      }
+-                      $this->add_notice($user, $pl);
+-              }
++            $to = preg_replace('/^d([\ ])*/', '', $to[0][0]);
++            $body = preg_replace('/d[\ ]*('. $to .')[\ ]*/', '', $pl['body']);
++            $this->add_direct($user, $body, $to, $from);
++        } else {
++            $len = mb_strlen($pl['body']);
++            if($len > 140) {
++                $this->from_site($from, 'Message too long - maximum is 140 characters, you sent ' . $len);
++                return;
++            }
++            $this->add_notice($user, $pl);
++        }
+hunk ./scripts/xmppdaemon.php 155
+-              $user->free();
+-              unset($user);
+-      }
++        $user->free();
++        unset($user);
++    }
+hunk ./scripts/xmppdaemon.php 159
+-      function is_self($from) {
+-              return preg_match('/^'.strtolower(jabber_daemon_address()).'/', strtolower($from));
+-      }
++    function is_self($from) {
++        return preg_match('/^'.strtolower(jabber_daemon_address()).'/', strtolower($from));
++    }
+hunk ./scripts/xmppdaemon.php 163
+-      function get_ofrom($pl) {
+-              $xml = $pl['xml'];
+-              $addresses = $xml->sub('addresses');
+-              if (!$addresses) {
+-                      $this->log(LOG_WARNING, 'Forwarded message without addresses');
+-                      return NULL;
+-              }
+-              $address = $addresses->sub('address');
+-              if (!$address) {
+-                      $this->log(LOG_WARNING, 'Forwarded message without address');
+-                      return NULL;
+-              }
+-              if (!array_key_exists('type', $address->attrs)) {
+-                      $this->log(LOG_WARNING, 'No type for forwarded message');
+-                      return NULL;
+-              }
+-              $type = $address->attrs['type'];
+-              if ($type != 'ofrom') {
+-                      $this->log(LOG_WARNING, 'Type of forwarded message is not ofrom');
+-                      return NULL;
+-              }
+-              if (!array_key_exists('jid', $address->attrs)) {
+-                      $this->log(LOG_WARNING, 'No jid for forwarded message');
+-                      return NULL;
+-              }
+-              $jid = $address->attrs['jid'];
+-              if (!$jid) {
+-                      $this->log(LOG_WARNING, 'Could not get jid from address');
+-                      return NULL;
+-              }
+-              $this->log(LOG_DEBUG, 'Got message forwarded from jid ' . $jid);
+-              return $jid;
+-      }
++    function get_ofrom($pl) {
++        $xml = $pl['xml'];
++        $addresses = $xml->sub('addresses');
++        if (!$addresses) {
++            $this->log(LOG_WARNING, 'Forwarded message without addresses');
++            return NULL;
++        }
++        $address = $addresses->sub('address');
++        if (!$address) {
++            $this->log(LOG_WARNING, 'Forwarded message without address');
++            return NULL;
++        }
++        if (!array_key_exists('type', $address->attrs)) {
++            $this->log(LOG_WARNING, 'No type for forwarded message');
++            return NULL;
++        }
++        $type = $address->attrs['type'];
++        if ($type != 'ofrom') {
++            $this->log(LOG_WARNING, 'Type of forwarded message is not ofrom');
++            return NULL;
++        }
++        if (!array_key_exists('jid', $address->attrs)) {
++            $this->log(LOG_WARNING, 'No jid for forwarded message');
++            return NULL;
++        }
++        $jid = $address->attrs['jid'];
++        if (!$jid) {
++            $this->log(LOG_WARNING, 'Could not get jid from address');
++            return NULL;
++        }
++        $this->log(LOG_DEBUG, 'Got message forwarded from jid ' . $jid);
++        return $jid;
++    }
+hunk ./scripts/xmppdaemon.php 197
+-      function is_autoreply($txt) {
+-              if (preg_match('/[\[\(]?[Aa]uto[-\s]?[Rr]e(ply|sponse)[\]\)]/', $txt)) {
+-                      return true;
+-              } else {
+-                      return false;
+-              }
+-      }
++    function is_autoreply($txt) {
++        if (preg_match('/[\[\(]?[Aa]uto[-\s]?[Rr]e(ply|sponse)[\]\)]/', $txt)) {
++            return true;
++        } else {
++            return false;
++        }
++    }
+hunk ./scripts/xmppdaemon.php 205
+-      function is_otr($txt) {
+-              if (preg_match('/^\?OTR/', $txt)) {
+-                      return true;
+-              } else {
+-                      return false;
+-              }
+-      }
++    function is_otr($txt) {
++        if (preg_match('/^\?OTR/', $txt)) {
++            return true;
++        } else {
++            return false;
++        }
++    }
+hunk ./scripts/xmppdaemon.php 213
+-      function is_direct($txt) {
+-              if (strtolower(substr($txt, 0, 2))=='d ') {
+-                      return true;
+-              } else {
+-                      return false;
+-              }
+-      }
++    function is_direct($txt) {
++        if (strtolower(substr($txt, 0, 2))=='d ') {
++            return true;
++        } else {
++            return false;
++        }
++    }
+hunk ./scripts/xmppdaemon.php 221
+-      function from_site($address, $msg) {
+-              $text = '['.common_config('site', 'name') . '] ' . $msg;
+-              jabber_send_message($address, $text);
+-      }
++    function from_site($address, $msg) {
++        $text = '['.common_config('site', 'name') . '] ' . $msg;
++        jabber_send_message($address, $text);
++    }
+hunk ./scripts/xmppdaemon.php 226
+-      function handle_command($user, $body) {
+-              $inter = new CommandInterpreter();
+-              $cmd = $inter->handle_command($user, $body);
+-              if ($cmd) {
+-                      $chan = new XMPPChannel($this->conn);
+-                      $cmd->execute($chan);
+-                      return true;
+-              } else {
+-                      return false;
+-              }
+-      }
++    function handle_command($user, $body) {
++        $inter = new CommandInterpreter();
++        $cmd = $inter->handle_command($user, $body);
++        if ($cmd) {
++            $chan = new XMPPChannel($this->conn);
++            $cmd->execute($chan);
++            return true;
++        } else {
++            return false;
++        }
++    }
+hunk ./scripts/xmppdaemon.php 238
+-      function add_notice(&$user, &$pl) {
++    function add_notice(&$user, &$pl) {
+hunk ./scripts/xmppdaemon.php 248
+-              $notice = Notice::saveNew($user->id, $content, 'xmpp');
+-              if (is_string($notice)) {
+-                      $this->log(LOG_ERR, $notice);
+-                      return;
+-              }
+-              common_broadcast_notice($notice);
+-              $this->log(LOG_INFO,
+-                                 'Added notice ' . $notice->id . ' from user ' . $user->nickname);
+-              $notice->free();
+-              unset($notice);
+-      }
++        $notice = Notice::saveNew($user->id, $content, 'xmpp');
++        if (is_string($notice)) {
++            $this->log(LOG_ERR, $notice);
++            return;
++        }
++        common_broadcast_notice($notice);
++        $this->log(LOG_INFO,
++                   'Added notice ' . $notice->id . ' from user ' . $user->nickname);
++        $notice->free();
++        unset($notice);
++    }
+hunk ./scripts/xmppdaemon.php 260
+-      function handle_presence(&$pl) {
+-              $from = jabber_normalize_jid($pl['from']);
+-              switch ($pl['type']) {
+-               case 'subscribe':
+-                      # We let anyone subscribe
+-                      $this->subscribed($from);
+-                      $this->log(LOG_INFO,
+-                                         'Accepted subscription from ' . $from);
+-                      break;
+-               case 'subscribed':
+-               case 'unsubscribed':
+-               case 'unsubscribe':
+-                      $this->log(LOG_INFO,
+-                                         'Ignoring  "' . $pl['type'] . '" from ' . $from);
+-                      break;
+-               default:
+-                      if (!$pl['type']) {
+-                              $user = User::staticGet('jabber', $from);
+-                              if (!$user) {
+-                                      $this->log(LOG_WARNING, 'Presence from unknown user ' . $from);
+-                                      return;
+-                              }
+-                              if ($user->updatefrompresence) {
+-                                      $this->log(LOG_INFO, 'Updating ' . $user->nickname .
+-                                                         ' status from presence.');
+-                                      $this->add_notice($user, $pl);
+-                              }
+-                              $user->free();
+-                              unset($user);
+-                      }
+-                      break;
+-              }
+-      }
++    function handle_presence(&$pl) {
++        $from = jabber_normalize_jid($pl['from']);
++        switch ($pl['type']) {
++         case 'subscribe':
++            # We let anyone subscribe
++            $this->subscribed($from);
++            $this->log(LOG_INFO,
++                       'Accepted subscription from ' . $from);
++            break;
++         case 'subscribed':
++         case 'unsubscribed':
++         case 'unsubscribe':
++            $this->log(LOG_INFO,
++                       'Ignoring  "' . $pl['type'] . '" from ' . $from);
++            break;
++         default:
++            if (!$pl['type']) {
++                $user = User::staticGet('jabber', $from);
++                if (!$user) {
++                    $this->log(LOG_WARNING, 'Presence from unknown user ' . $from);
++                    return;
++                }
++                if ($user->updatefrompresence) {
++                    $this->log(LOG_INFO, 'Updating ' . $user->nickname .
++                               ' status from presence.');
++                    $this->add_notice($user, $pl);
++                }
++                $user->free();
++                unset($user);
++            }
++            break;
++        }
++    }
+hunk ./scripts/xmppdaemon.php 294
+-      function log($level, $msg) {
+-              common_log($level, 'XMPPDaemon('.$this->resource.'): '.$msg);
+-      }
++    function log($level, $msg) {
++        common_log($level, 'XMPPDaemon('.$this->resource.'): '.$msg);
++    }
+hunk ./scripts/xmppdaemon.php 298
+-      function subscribed($to) {
+-              jabber_special_presence('subscribed', $to);
+-      }
++    function subscribed($to) {
++        jabber_special_presence('subscribed', $to);
++    }
index 4907749ce0519dda5a8a6f1f8a38f9e6280caee0..a468c33a69bf8bfb1e0f6ca90cd24d949cd55619 100644 (file)
@@ -22,21 +22,21 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/lib/omb.php');
 
 class AccesstokenAction extends Action {
-       function handle($args) {
-               parent::handle($args);
-               try {
-                       common_debug('getting request from env variables', __FILE__);
-                       common_remove_magic_from_request();
-                       $req = OAuthRequest::from_request();
-                       common_debug('getting a server', __FILE__);
-                       $server = omb_oauth_server();
-                       common_debug('fetching the access token', __FILE__);
-                       $token = $server->fetch_access_token($req);
-                       common_debug('got this token: "'.print_r($token,TRUE).'"', __FILE__);
-                       common_debug('printing the access token', __FILE__);
-                       print $token;
-               } catch (OAuthException $e) {
-                       common_server_error($e->getMessage());
-               }
-       }
+    function handle($args) {
+        parent::handle($args);
+        try {
+            common_debug('getting request from env variables', __FILE__);
+            common_remove_magic_from_request();
+            $req = OAuthRequest::from_request();
+            common_debug('getting a server', __FILE__);
+            $server = omb_oauth_server();
+            common_debug('fetching the access token', __FILE__);
+            $token = $server->fetch_access_token($req);
+            common_debug('got this token: "'.print_r($token,TRUE).'"', __FILE__);
+            common_debug('printing the access token', __FILE__);
+            print $token;
+        } catch (OAuthException $e) {
+            common_server_error($e->getMessage());
+        }
+    }
 }
index 2a26e48d4d3c36543be776a53e93af20beddda42..066ee77bff11f03e26b5b546eb4b1e8da3997611 100644 (file)
@@ -23,71 +23,71 @@ require_once(INSTALLDIR.'/actions/showstream.php');
 
 class AllAction extends StreamAction {
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               $nickname = common_canonical_nickname($this->arg('nickname'));
-               $user = User::staticGet('nickname', $nickname);
+        $nickname = common_canonical_nickname($this->arg('nickname'));
+        $user = User::staticGet('nickname', $nickname);
 
-               if (!$user) {
-                       $this->client_error(_('No such user.'));
-                       return;
-               }
+        if (!$user) {
+            $this->client_error(_('No such user.'));
+            return;
+        }
 
-               $profile = $user->getProfile();
+        $profile = $user->getProfile();
 
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
 
-               # Looks like we're good; show the header
+        # Looks like we're good; show the header
 
-               common_show_header(sprintf(_("%s and friends"), $profile->nickname),
-                                                  array($this, 'show_header'), $user,
-                                                  array($this, 'show_top'));
+        common_show_header(sprintf(_("%s and friends"), $profile->nickname),
+                           array($this, 'show_header'), $user,
+                           array($this, 'show_top'));
 
-               $this->show_notices($user);
+        $this->show_notices($user);
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function show_header($user) {
-               common_element('link', array('rel' => 'alternate',
-                                                                        'href' => common_local_url('allrss', array('nickname' =>
-                                                                                                                                                          $user->nickname)),
-                                                                        'type' => 'application/rss+xml',
-                                                                        'title' => sprintf(_('Feed for friends of %s'), $user->nickname)));
-       }
+    function show_header($user) {
+        common_element('link', array('rel' => 'alternate',
+                                     'href' => common_local_url('allrss', array('nickname' =>
+                                                                               $user->nickname)),
+                                     'type' => 'application/rss+xml',
+                                     'title' => sprintf(_('Feed for friends of %s'), $user->nickname)));
+    }
 
-       function show_top($user) {
-               $cur = common_current_user();
+    function show_top($user) {
+        $cur = common_current_user();
 
-               if ($cur && $cur->id == $user->id) {
-                       common_notice_form('all');
-               }
+        if ($cur && $cur->id == $user->id) {
+            common_notice_form('all');
+        }
 
-               $this->views_menu();
+        $this->views_menu();
 
-               $this->show_feeds_list(array(0=>array('href'=>common_local_url('allrss', array('nickname' => $user->nickname)),
-                                                                                         'type' => 'rss',
-                                                                                         'version' => 'RSS 1.0',
-                                                                                         'item' => 'allrss')));
-       }
+        $this->show_feeds_list(array(0=>array('href'=>common_local_url('allrss', array('nickname' => $user->nickname)),
+                                              'type' => 'rss',
+                                              'version' => 'RSS 1.0',
+                                              'item' => 'allrss')));
+    }
 
-       function show_notices($user) {
+    function show_notices($user) {
 
-               $page = $this->trimmed('page');
-               if (!$page) {
-                       $page = 1;
-               }
+        $page = $this->trimmed('page');
+        if (!$page) {
+            $page = 1;
+        }
 
-               $notice = $user->noticesWithFriends(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+        $notice = $user->noticesWithFriends(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
 
         $cnt = $this->show_notice_list($notice);
 
-               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'all', array('nickname' => $user->nickname));
-       }
+        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'all', array('nickname' => $user->nickname));
+    }
 }
index e49ac55401435d9cd0d4d7e262e0eaac9e58adc2..d28fcea49db62d806a786549c84ef639f77da7f7 100644 (file)
@@ -25,53 +25,53 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class AllrssAction extends Rss10Action {
 
-       var $user = NULL;
+    var $user = NULL;
 
-       function init() {
-               $nickname = $this->trimmed('nickname');
-               $this->user = User::staticGet('nickname', $nickname);
+    function init() {
+        $nickname = $this->trimmed('nickname');
+        $this->user = User::staticGet('nickname', $nickname);
 
-               if (!$this->user) {
-                       common_user_error(_('No such user.'));
-                       return false;
-               } else {
-                       return true;
-               }
-       }
+        if (!$this->user) {
+            common_user_error(_('No such user.'));
+            return false;
+        } else {
+            return true;
+        }
+    }
 
-       function get_notices($limit=0) {
+    function get_notices($limit=0) {
 
-               $user = $this->user;
-               
-               $notice = $user->noticesWithFriends(0, $limit);
-                                                                                       
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
+        $user = $this->user;
+        
+        $notice = $user->noticesWithFriends(0, $limit);
+                                            
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
 
-               return $notices;
-       }
+        return $notices;
+    }
 
-       function get_channel() {
-               $user = $this->user;
-               $c = array('url' => common_local_url('allrss',
-                                                                                        array('nickname' =>
-                                                                                                  $user->nickname)),
-                                  'title' => sprintf(_('%s and friends'), $user->nickname),
-                                  'link' => common_local_url('all',
-                                                                                        array('nickname' =>
-                                                                                                  $user->nickname)),
-                                  'description' => sprintf(_('Feed for friends of %s'), $user->nickname));
-               return $c;
-       }
+    function get_channel() {
+        $user = $this->user;
+        $c = array('url' => common_local_url('allrss',
+                                             array('nickname' =>
+                                                   $user->nickname)),
+                   'title' => sprintf(_('%s and friends'), $user->nickname),
+                   'link' => common_local_url('all',
+                                             array('nickname' =>
+                                                   $user->nickname)),
+                   'description' => sprintf(_('Feed for friends of %s'), $user->nickname));
+        return $c;
+    }
 
-       function get_image() {
-               $user = $this->user;
-               $profile = $user->getProfile();
-               if (!$profile) {
-                       return NULL;
-               }
-               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-               return ($avatar) ? $avatar->url : NULL;
-       }
+    function get_image() {
+        $user = $this->user;
+        $profile = $user->getProfile();
+        if (!$profile) {
+            return NULL;
+        }
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+        return ($avatar) ? $avatar->url : NULL;
+    }
 }
\ No newline at end of file
index 919a515ce9a4f3a359ad9f2d1cd070ae77ce81e0..e03961e21fcc52683c3c0250239020b42cec02d7 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
 
 class ApiAction extends Action {
 
-       var $user;
-       var $content_type;
-       var $api_arg;
-       var $api_method;
-       var $api_action;
-
-       function handle($args) {
-               parent::handle($args);
-
-               $this->api_action = $this->arg('apiaction');
-               $method = $this->arg('method');
-               $argument = $this->arg('argument');
-
-               if (isset($argument)) {
-                       $cmdext = explode('.', $argument);
-                       $this->api_arg =  $cmdext[0];
-                       $this->api_method = $method;
-                       $this->content_type = strtolower($cmdext[1]);
-               } else {
-
-                       # Requested format / content-type will be an extension on the method
-                       $cmdext = explode('.', $method);
-                       $this->api_method = $cmdext[0];
-                       $this->content_type = strtolower($cmdext[1]);
-               }
-
-               if ($this->requires_auth()) {
-                       if (!isset($_SERVER['PHP_AUTH_USER'])) {
-
-                               # This header makes basic auth go
-                               header('WWW-Authenticate: Basic realm="Laconica API"');
-
-                               # If the user hits cancel -- bam!
-                               $this->show_basic_auth_error();
-                       } else {
-                               $nickname = $_SERVER['PHP_AUTH_USER'];
-                               $password = $_SERVER['PHP_AUTH_PW'];
-                               $user = common_check_user($nickname, $password);
-
-                               if ($user) {
-                                       $this->user = $user;
-                                       $this->process_command();
-                               } else {
-                                       # basic authentication failed
-                                       $this->show_basic_auth_error();
-                               }
-                       }
-               } else {
-
-                       # Look for the user in the session
-                       if (common_logged_in()) {
-                               $this->user = common_current_user();
-                       }
-
-                       $this->process_command();
-               }
-       }
-
-       function process_command() {
-               $action = "twitapi$this->api_action";
-               $actionfile = INSTALLDIR."/actions/$action.php";
-
-               if (file_exists($actionfile)) {
-                       require_once($actionfile);
-                       $action_class = ucfirst($action)."Action";
-                       $action_obj = new $action_class();
+    var $user;
+    var $content_type;
+    var $api_arg;
+    var $api_method;
+    var $api_action;
+
+    function handle($args) {
+        parent::handle($args);
+
+        $this->api_action = $this->arg('apiaction');
+        $method = $this->arg('method');
+        $argument = $this->arg('argument');
+
+        if (isset($argument)) {
+            $cmdext = explode('.', $argument);
+            $this->api_arg =  $cmdext[0];
+            $this->api_method = $method;
+            $this->content_type = strtolower($cmdext[1]);
+        } else {
+
+            # Requested format / content-type will be an extension on the method
+            $cmdext = explode('.', $method);
+            $this->api_method = $cmdext[0];
+            $this->content_type = strtolower($cmdext[1]);
+        }
+
+        if ($this->requires_auth()) {
+            if (!isset($_SERVER['PHP_AUTH_USER'])) {
+
+                # This header makes basic auth go
+                header('WWW-Authenticate: Basic realm="Laconica API"');
+
+                # If the user hits cancel -- bam!
+                $this->show_basic_auth_error();
+            } else {
+                $nickname = $_SERVER['PHP_AUTH_USER'];
+                $password = $_SERVER['PHP_AUTH_PW'];
+                $user = common_check_user($nickname, $password);
+
+                if ($user) {
+                    $this->user = $user;
+                    $this->process_command();
+                } else {
+                    # basic authentication failed
+                    $this->show_basic_auth_error();
+                }
+            }
+        } else {
+
+            # Look for the user in the session
+            if (common_logged_in()) {
+                 $this->user = common_current_user();
+            }
+
+            $this->process_command();
+        }
+    }
+
+    function process_command() {
+        $action = "twitapi$this->api_action";
+        $actionfile = INSTALLDIR."/actions/$action.php";
+
+        if (file_exists($actionfile)) {
+            require_once($actionfile);
+            $action_class = ucfirst($action)."Action";
+            $action_obj = new $action_class();
 
             if (!$action_obj->prepare($this->args)) {
                 return;
             }
 
-                       if (method_exists($action_obj, $this->api_method)) {
-                               $apidata = array(       'content-type' => $this->content_type,
-                                                                       'api_method' => $this->api_method,
-                                                                       'api_arg' => $this->api_arg,
-                                                                       'user' => $this->user);
-
-                               call_user_func(array($action_obj, $this->api_method), $_REQUEST, $apidata);
-                       } else {
-                               common_user_error("API method not found!", $code=404);
-                       }
-               } else {
-                       common_user_error("API method not found!", $code=404);
-               }
-       }
-
-       # Whitelist of API methods that don't need authentication
-       function requires_auth() {
-               static $noauth = array( 'statuses/public_timeline',
-                                                               'statuses/show',
-                                                               'users/show',
-                                                               'help/test',
-                                                               'help/downtime_schedule');
-
-               static $bareauth = array('statuses/user_timeline',
-                                                                'statuses/friends',
-                                                                'statuses/followers',
-                                                                'favorites/favorites');
+            if (method_exists($action_obj, $this->api_method)) {
+                $apidata = array(    'content-type' => $this->content_type,
+                                    'api_method' => $this->api_method,
+                                    'api_arg' => $this->api_arg,
+                                    'user' => $this->user);
+
+                call_user_func(array($action_obj, $this->api_method), $_REQUEST, $apidata);
+            } else {
+                common_user_error("API method not found!", $code=404);
+            }
+        } else {
+            common_user_error("API method not found!", $code=404);
+        }
+    }
+
+    # Whitelist of API methods that don't need authentication
+    function requires_auth() {
+        static $noauth = array( 'statuses/public_timeline',
+                                'statuses/show',
+                                'users/show',
+                                'help/test',
+                                'help/downtime_schedule');
+
+        static $bareauth = array('statuses/user_timeline',
+                                 'statuses/friends',
+                                 'statuses/followers',
+                                 'favorites/favorites');
 
         # If the site is "private", all API methods need authentication
 
@@ -126,71 +126,71 @@ class ApiAction extends Action {
             return true;
         }
 
-               $fullname = "$this->api_action/$this->api_method";
-
-               if (in_array($fullname, $bareauth)) {
-                       # bareauth: only needs auth if without an argument
-                       if ($this->api_arg) {
-                               return false;
-                       } else {
-                               return true;
-                       }
-               } else if (in_array($fullname, $noauth)) {
-                       # noauth: never needs auth
-                       return false;
-               } else {
-                       # everybody else needs auth
-                       return true;
-               }
-       }
-
-       function show_basic_auth_error() {
-               header('HTTP/1.1 401 Unauthorized');
-               $msg = 'Could not authenticate you.';
-
-               if ($this->content_type == 'xml') {
-                       header('Content-Type: application/xml; charset=utf-8');
-                       common_start_xml();
-                       common_element_start('hash');
-                       common_element('error', NULL, $msg);
-                       common_element('request', NULL, $_SERVER['REQUEST_URI']);
-                       common_element_end('hash');
-                       common_end_xml();
-               } else if ($this->content_type == 'json')  {
-                       header('Content-Type: application/json; charset=utf-8');
-                       $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
-                       print(json_encode($error_array));
-               } else {
-                       header('Content-type: text/plain');
-                       print "$msg\n";
-               }
-       }
-
-       function is_readonly() {
-               # NOTE: before handle(), can't use $this->arg
-               $apiaction = $_REQUEST['apiaction'];
-               $method = $_REQUEST['method'];
-               list($cmdtext, $fmt) = explode('.', $method);
-
-               static $write_methods = array(
-                       'account' => array('update_location', 'update_delivery_device', 'end_session'),
-                       'blocks' => array('create', 'destroy'),
-                       'direct_messages' => array('create', 'destroy'),
-                       'favorites' => array('create', 'destroy'),
-                       'friendships' => array('create', 'destroy'),
-                       'help' => array(),
-                       'notifications' => array('follow', 'leave'),
-                       'statuses' => array('update', 'destroy'),
-                       'users' => array()
-               );
-
-               if (array_key_exists($apiaction, $write_methods)) {
-                       if (!in_array($cmdtext, $write_methods[$apiaction])) {
-                               return true;
-                       }
-               }
-
-               return false;
-       }
+        $fullname = "$this->api_action/$this->api_method";
+
+        if (in_array($fullname, $bareauth)) {
+            # bareauth: only needs auth if without an argument
+            if ($this->api_arg) {
+                return false;
+            } else {
+                return true;
+            }
+        } else if (in_array($fullname, $noauth)) {
+            # noauth: never needs auth
+            return false;
+        } else {
+            # everybody else needs auth
+            return true;
+        }
+    }
+
+    function show_basic_auth_error() {
+        header('HTTP/1.1 401 Unauthorized');
+        $msg = 'Could not authenticate you.';
+
+        if ($this->content_type == 'xml') {
+            header('Content-Type: application/xml; charset=utf-8');
+            common_start_xml();
+            common_element_start('hash');
+            common_element('error', NULL, $msg);
+            common_element('request', NULL, $_SERVER['REQUEST_URI']);
+            common_element_end('hash');
+            common_end_xml();
+        } else if ($this->content_type == 'json')  {
+            header('Content-Type: application/json; charset=utf-8');
+            $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
+            print(json_encode($error_array));
+        } else {
+            header('Content-type: text/plain');
+            print "$msg\n";
+        }
+    }
+
+    function is_readonly() {
+        # NOTE: before handle(), can't use $this->arg
+        $apiaction = $_REQUEST['apiaction'];
+        $method = $_REQUEST['method'];
+        list($cmdtext, $fmt) = explode('.', $method);
+
+        static $write_methods = array(
+            'account' => array('update_location', 'update_delivery_device', 'end_session'),
+            'blocks' => array('create', 'destroy'),
+            'direct_messages' => array('create', 'destroy'),
+            'favorites' => array('create', 'destroy'),
+            'friendships' => array('create', 'destroy'),
+            'help' => array(),
+            'notifications' => array('follow', 'leave'),
+            'statuses' => array('update', 'destroy'),
+            'users' => array()
+        );
+
+        if (array_key_exists($apiaction, $write_methods)) {
+            if (!in_array($cmdtext, $write_methods[$apiaction])) {
+                return true;
+            }
+        }
+
+        return false;
+    }
 
 }
index b33cababf72072aa0ced1dd4cda4a8c703877636..2ca861a66b77fd1995242e920ffed54db2429fa3 100644 (file)
@@ -24,45 +24,45 @@ class AvatarbynicknameAction extends Action {
         parent::handle($args);
         $nickname = $this->trimmed('nickname');
         if (!$nickname) {
-               $this->client_error(_('No nickname.'));
-                       return;
-               }
-               $size = $this->trimmed('size');
+            $this->client_error(_('No nickname.'));
+            return;
+        }
+        $size = $this->trimmed('size');
         if (!$size) {
-               $this->client_error(_('No size.'));
-                       return;
-               }
-               $size = strtolower($size);
-               if (!in_array($size, array('original', '96', '48', '24'))) {
-               $this->client_error(_('Invalid size.'));
-                       return;
-               }
+            $this->client_error(_('No size.'));
+            return;
+        }
+        $size = strtolower($size);
+        if (!in_array($size, array('original', '96', '48', '24'))) {
+            $this->client_error(_('Invalid size.'));
+            return;
+        }
 
-               $user = User::staticGet('nickname', $nickname);
-               if (!$user) {
-               $this->client_error(_('No such user.'));
-                       return;
-               }
-               $profile = $user->getProfile();
-               if (!$profile) {
-               $this->client_error(_('User has no profile.'));
-                       return;
-               }
-               if ($size == 'original') {
-                       $avatar = $profile->getOriginal();
-               } else {
-                       $avatar = $profile->getAvatar($size+0);
-               }
+        $user = User::staticGet('nickname', $nickname);
+        if (!$user) {
+            $this->client_error(_('No such user.'));
+            return;
+        }
+        $profile = $user->getProfile();
+        if (!$profile) {
+            $this->client_error(_('User has no profile.'));
+            return;
+        }
+        if ($size == 'original') {
+            $avatar = $profile->getOriginal();
+        } else {
+            $avatar = $profile->getAvatar($size+0);
+        }
 
-               if ($avatar) {
-                       $url = $avatar->url;
-               } else {
-                       if ($size == 'original') {
-                               $url = common_default_avatar(AVATAR_PROFILE_SIZE);
-                       } else {
-                               $url = common_default_avatar($size+0);
-                       }
-               }
-               common_redirect($url, 302);
-       }
+        if ($avatar) {
+            $url = $avatar->url;
+        } else {
+            if ($size == 'original') {
+                $url = common_default_avatar(AVATAR_PROFILE_SIZE);
+            } else {
+                $url = common_default_avatar($size+0);
+            }
+        }
+        common_redirect($url, 302);
+    }
 }
index e6d2b7e49e96bc685b8751c6ea454350dc47619c..20ba81edba9b1490120c5e16e0aaeb43bc0121b3 100644 (file)
@@ -32,12 +32,12 @@ class BlockAction extends Action {
             return false;
         }
 
-               $token = $this->trimmed('token');
+        $token = $this->trimmed('token');
 
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
         $id = $this->trimmed('blockto');
 
@@ -75,7 +75,7 @@ class BlockAction extends Action {
 
         $id = $this->profile->id;
 
-               common_show_header(_('Block user'));
+        common_show_header(_('Block user'));
 
         common_element('p', NULL,
                        _('Are you sure you want to block this user? '.
index 44280e08a7543cf15dc373244042c5a489b63ec0..9d97c82058552c703442f62f2404aac84877a7df 100644 (file)
@@ -43,44 +43,44 @@ class ConfirmaddressAction extends Action {
             $this->client_error(_('That confirmation code is not for you!'));
             return;
         }
-               $type = $confirm->address_type;
-               if (!in_array($type, array('email', 'jabber', 'sms'))) {
-                       $this->server_error(sprintf(_('Unrecognized address type %s'), $type));
-                       return;
-               }
+        $type = $confirm->address_type;
+        if (!in_array($type, array('email', 'jabber', 'sms'))) {
+            $this->server_error(sprintf(_('Unrecognized address type %s'), $type));
+            return;
+        }
         if ($cur->$type == $confirm->address) {
             $this->client_error(_('That address has already been confirmed.'));
-                       return;
-               }
+            return;
+        }
 
         $cur->query('BEGIN');
 
         $orig_user = clone($cur);
 
-               $cur->$type = $confirm->address;
+        $cur->$type = $confirm->address;
 
-               if ($type == 'sms') {
-                       $cur->carrier = ($confirm->address_extra)+0;
-                       $carrier = Sms_carrier::staticGet($cur->carrier);
-                       $cur->smsemail = $carrier->toEmailAddress($cur->sms);
-               }
+        if ($type == 'sms') {
+            $cur->carrier = ($confirm->address_extra)+0;
+            $carrier = Sms_carrier::staticGet($cur->carrier);
+            $cur->smsemail = $carrier->toEmailAddress($cur->sms);
+        }
 
-               $result = $cur->updateKeys($orig_user);
+        $result = $cur->updateKeys($orig_user);
 
         if (!$result) {
-                       common_log_db_error($cur, 'UPDATE', __FILE__);
+            common_log_db_error($cur, 'UPDATE', __FILE__);
             $this->server_error(_('Couldn\'t update user.'));
             return;
         }
 
-               if ($type == 'email') {
-                   $cur->emailChanged();
-               }
+        if ($type == 'email') {
+            $cur->emailChanged();
+        }
 
         $result = $confirm->delete();
 
         if (!$result) {
-                       common_log_db_error($confirm, 'DELETE', __FILE__);
+            common_log_db_error($confirm, 'DELETE', __FILE__);
             $this->server_error(_('Couldn\'t delete email confirmation.'));
             return;
         }
index 64746283ae5103f18b06823d095412711eeafca4..ba348c5faf4f5bf2be2cf6fc99aef8b11e9a30db 100644 (file)
@@ -22,80 +22,80 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/lib/deleteaction.php');
 
 class DeletenoticeAction extends DeleteAction {
-       function handle($args) {
-               parent::handle($args);
-               # XXX: Ajax!
+    function handle($args) {
+        parent::handle($args);
+        # XXX: Ajax!
 
-               if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $this->delete_notice();
-               } else if ($_SERVER['REQUEST_METHOD'] == 'GET') {
-                       $this->show_form();
-               }
-       }
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->delete_notice();
+        } else if ($_SERVER['REQUEST_METHOD'] == 'GET') {
+            $this->show_form();
+        }
+    }
 
-       function get_instructions() {
-               return _('You are about to permanently delete a notice.  Once this is done, it cannot be undone.');
-       }
+    function get_instructions() {
+        return _('You are about to permanently delete a notice.  Once this is done, it cannot be undone.');
+    }
 
-       function get_title() {
-               return _('Delete notice');
-       }
+    function get_title() {
+        return _('Delete notice');
+    }
 
-       function show_form($error=NULL) {
-               $user = common_current_user();
+    function show_form($error=NULL) {
+        $user = common_current_user();
 
-               common_show_header($this->get_title(), array($this, 'show_header'), $error,
-                                                  array($this, 'show_top'));
-               common_element_start('form', array('id' => 'notice_delete_form',
-                                                                  'method' => 'post',
-                                                                  'action' => common_local_url('deletenotice')));
-               common_hidden('token', common_session_token());
-               common_hidden('notice', $this->trimmed('notice'));
-               common_element_start('p');
-               common_element('span', array('id' => 'confirmation_text'), _('Are you sure you want to delete this notice?'));
+        common_show_header($this->get_title(), array($this, 'show_header'), $error,
+                           array($this, 'show_top'));
+        common_element_start('form', array('id' => 'notice_delete_form',
+                                   'method' => 'post',
+                                   'action' => common_local_url('deletenotice')));
+        common_hidden('token', common_session_token());
+        common_hidden('notice', $this->trimmed('notice'));
+        common_element_start('p');
+        common_element('span', array('id' => 'confirmation_text'), _('Are you sure you want to delete this notice?'));
 
-               common_element('input', array('id' => 'submit_no',
-                                                 'name' => 'submit',
-                                                 'type' => 'submit',
-                                                 'value' => _('No')));
-               common_element('input', array('id' => 'submit_yes',
-                                                 'name' => 'submit',
-                                                 'type' => 'submit',
-                                                 'value' => _('Yes')));
-               common_element_end('p');
-               common_element_end('form');
-               common_show_footer();
-       }
+        common_element('input', array('id' => 'submit_no',
+                          'name' => 'submit',
+                          'type' => 'submit',
+                          'value' => _('No')));
+        common_element('input', array('id' => 'submit_yes',
+                          'name' => 'submit',
+                          'type' => 'submit',
+                          'value' => _('Yes')));
+        common_element_end('p');
+        common_element_end('form');
+        common_show_footer();
+    }
 
-       function delete_notice() {
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-               $url = common_get_returnto();
-               $confirmed = $this->trimmed('submit');
-               if ($confirmed == _('Yes')) {
-                       $user = common_current_user();
-                       $notice_id = $this->trimmed('notice');
-                       $notice = Notice::staticGet($notice_id);
-                       $replies = new Reply;
-                       $replies->get('notice_id', $notice_id);
+    function delete_notice() {
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+        $url = common_get_returnto();
+        $confirmed = $this->trimmed('submit');
+        if ($confirmed == _('Yes')) {
+            $user = common_current_user();
+            $notice_id = $this->trimmed('notice');
+            $notice = Notice::staticGet($notice_id);
+            $replies = new Reply;
+            $replies->get('notice_id', $notice_id);
 
-                       common_dequeue_notice($notice);
-                       if (common_config('memcached', 'enabled')) {
-                               $notice->blowSubsCache();
-                       }
-                       $replies->delete();
-                       $notice->delete();
-               } else {
-                       if ($url) {
-                               common_set_returnto(NULL);
-                       } else {
-                               $url = common_local_url('public');
-                       }
-               }
-               common_redirect($url);
-       }
+            common_dequeue_notice($notice);
+            if (common_config('memcached', 'enabled')) {
+                $notice->blowSubsCache();
+            }
+            $replies->delete();
+            $notice->delete();
+        } else {
+            if ($url) {
+                common_set_returnto(NULL);
+            } else {
+                $url = common_local_url('public');
+            }
+        }
+        common_redirect($url);
+    }
 }
index 418ac998d0671fc5c0d502c596aab3ed41f4ab6f..29797bc76d5aae22060ebf1400e81fd90e0809dd 100644 (file)
@@ -32,101 +32,101 @@ class DeleteprofileAction extends Action {
         }
     }
 
-       function get_instructions() {
-               return _('Export and delete your user information.');
-       }
-
-       function form_header($title, $msg=NULL, $success=false) {
-               common_show_header($title,
-                                  NULL,
-                                  array($msg, $success),
-                                                  array($this, 'show_top'));
-       }
-
-       function show_feeds_list($feeds) {
-               common_element_start('div', array('class' => 'feedsdel'));
-               common_element('p', null, 'Feeds:');
-               common_element_start('ul', array('class' => 'xoxo'));
-
-               foreach ($feeds as $key => $value) {
-                       $this->common_feed_item($feeds[$key]);
-               }
-               common_element_end('ul');
-               common_element_end('div');
-       }
+    function get_instructions() {
+        return _('Export and delete your user information.');
+    }
+
+    function form_header($title, $msg=NULL, $success=false) {
+        common_show_header($title,
+                           NULL,
+                           array($msg, $success),
+                           array($this, 'show_top'));
+    }
+
+    function show_feeds_list($feeds) {
+        common_element_start('div', array('class' => 'feedsdel'));
+        common_element('p', null, 'Feeds:');
+        common_element_start('ul', array('class' => 'xoxo'));
+
+        foreach ($feeds as $key => $value) {
+            $this->common_feed_item($feeds[$key]);
+        }
+        common_element_end('ul');
+        common_element_end('div');
+    }
 
     //TODO move to common.php (and retrace its origin)
-       function common_feed_item($feed) {
+    function common_feed_item($feed) {
+        $user = common_current_user();
+        $nickname = $user->nickname;
+
+        switch($feed['item']) {
+            case 'notices': default:
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "$nickname's ".$feed['version']." notice feed";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'foaf':
+                $feed_classname = "foaf";
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "$nickname's FOAF file";
+                $feed['textContent'] = "FOAF";
+                break;
+        }
+        common_element_start('li');
+        common_element('a', array('href' => $feed['href'],
+                                  'class' => $feed_classname,
+                                  'type' => $feed_mimetype,
+                                  'title' => $feed_title),
+                            $feed['textContent']);
+        common_element_end('li');
+    }
+
+    function show_form($msg=NULL, $success=false) {
+        $this->form_header(_('Delete my account'), $msg, $success);
+        common_element('h2', NULL, _('Delete my account confirmation'));
+        $this->show_confirm_delete_form();
+        common_show_footer();
+    }
+
+    function show_confirm_delete_form() {
         $user = common_current_user();
-               $nickname = $user->nickname;
-
-               switch($feed['item']) {
-                       case 'notices': default:
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "$nickname's ".$feed['version']." notice feed";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'foaf':
-                               $feed_classname = "foaf";
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "$nickname's FOAF file";
-                               $feed['textContent'] = "FOAF";
-                               break;
-               }
-               common_element_start('li');
-               common_element('a', array('href' => $feed['href'],
-                                                                 'class' => $feed_classname,
-                                                                 'type' => $feed_mimetype,
-                                                                 'title' => $feed_title),
-                                                       $feed['textContent']);
-               common_element_end('li');
-       }
-
-       function show_form($msg=NULL, $success=false) {
-               $this->form_header(_('Delete my account'), $msg, $success);
-               common_element('h2', NULL, _('Delete my account confirmation'));
-               $this->show_confirm_delete_form();
-               common_show_footer();
-       }
-
-       function show_confirm_delete_form() {
-               $user = common_current_user();
         $notices = DB_DataObject::factory('notice');
         $notices->profile_id = $user->id;
         $notice_count = (int) $notices->count();
 
-               common_element_start('form', array('method' => 'POST',
-                                                                                  'id' => 'delete',
-                                                                                  'action' =>
-                                                                                  common_local_url('deleteprofile')));
+        common_element_start('form', array('method' => 'POST',
+                                           'id' => 'delete',
+                                           'action' =>
+                                           common_local_url('deleteprofile')));
 
-               common_hidden('token', common_session_token());
+        common_hidden('token', common_session_token());
         common_element('p', null, "Last chance to copy your notices and contacts by saving the two links below before deleting your account. Be careful, this operation cannot be undone.");
 
-               $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('limit' => $notice_count, 'nickname' => $user->nickname)),
-                                                                                         'type' => 'rss',
-                                                                                         'version' => 'RSS 1.0',
-                                                                                         'item' => 'notices'),
-                                                                        1=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
-                                                                                         'type' => 'rdf',
-                                                                                         'version' => 'FOAF',
-                                                                                         'item' => 'foaf')));
+        $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('limit' => $notice_count, 'nickname' => $user->nickname)),
+                                              'type' => 'rss',
+                                              'version' => 'RSS 1.0',
+                                              'item' => 'notices'),
+                                     1=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
+                                              'type' => 'rdf',
+                                              'version' => 'FOAF',
+                                              'item' => 'foaf')));
 
         common_checkbox('confirmation', _('Check if you are sure you want to delete your account.'));
 
-               common_submit('deleteaccount', _('Delete my account'));
-               common_element_end('form');
+        common_submit('deleteaccount', _('Delete my account'));
+        common_element_end('form');
     }
 
-       function handle_post() {
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+    function handle_post() {
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
         if ($this->arg('deleteaccount') && $this->arg('confirmation')) {
             $this->delete_account();
@@ -134,9 +134,9 @@ class DeleteprofileAction extends Action {
         $this->show_form();
     }
 
-       function delete_account() {
-               $user = common_current_user();
-               assert(!is_null($user)); # should already be checked
+    function delete_account() {
+        $user = common_current_user();
+        assert(!is_null($user)); # should already be checked
 
         // deleted later through the profile
         /*
@@ -219,53 +219,53 @@ class DeleteprofileAction extends Action {
         common_redirect(common_local_url('public'));
     }
 
-       function show_top($arr) {
-               $msg = $arr[0];
-               $success = $arr[1];
-               if ($msg) {
-                       $this->message($msg, $success);
-               } else {
-                       $inst = $this->get_instructions();
-                       $output = common_markup_to_html($inst);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-               }
-               $this->settings_menu();
-       }
+    function show_top($arr) {
+        $msg = $arr[0];
+        $success = $arr[1];
+        if ($msg) {
+            $this->message($msg, $success);
+        } else {
+            $inst = $this->get_instructions();
+            $output = common_markup_to_html($inst);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('div');
+        }
+        $this->settings_menu();
+    }
 
     function settings_menu() {
         # action => array('prompt', 'title')
-               $menu =
-                 array('profilesettings' =>
-                               array(_('Profile'),
-                                         _('Change your profile settings')),
-                               'emailsettings' =>
-                               array(_('Email'),
-                                         _('Change email handling')),
-                               'openidsettings' =>
-                               array(_('OpenID'),
-                                         _('Add or remove OpenIDs')),
-                               'smssettings' =>
-                               array(_('SMS'),
-                                         _('Updates by SMS')),
-                               'imsettings' =>
-                               array(_('IM'),
-                                         _('Updates by instant messenger (IM)')),
-                               'twittersettings' =>
-                               array(_('Twitter'),
-                                         _('Twitter integration options')),
-                               'othersettings' =>
-                               array(_('Other'),
-                                         _('Other options')));
+        $menu =
+          array('profilesettings' =>
+                array(_('Profile'),
+                      _('Change your profile settings')),
+                'emailsettings' =>
+                array(_('Email'),
+                      _('Change email handling')),
+                'openidsettings' =>
+                array(_('OpenID'),
+                      _('Add or remove OpenIDs')),
+                'smssettings' =>
+                array(_('SMS'),
+                      _('Updates by SMS')),
+                'imsettings' =>
+                array(_('IM'),
+                      _('Updates by instant messenger (IM)')),
+                'twittersettings' =>
+                array(_('Twitter'),
+                      _('Twitter integration options')),
+                'othersettings' =>
+                array(_('Other'),
+                      _('Other options')));
 
         $action = $this->trimmed('action');
         common_element_start('ul', array('id' => 'nav_views'));
         foreach ($menu as $menuaction => $menudesc) {
-                       if ($menuaction == 'imsettings' &&
-                               !common_config('xmpp', 'enabled')) {
-                               continue;
-                       }
+            if ($menuaction == 'imsettings' &&
+                !common_config('xmpp', 'enabled')) {
+                continue;
+            }
             common_menu_item(common_local_url($menuaction),
                     $menudesc[0],
                     $menudesc[1],
index be208f65ab2a3d1abd5c27315070e1fde11fc1e2..e47e68a8c879fc23565a5179247e0c459c75b1d1 100644 (file)
@@ -21,63 +21,63 @@ if (!defined('LACONICA')) { exit(1); }
 
 class DisfavorAction extends Action {
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-                       return;
-               }
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+            return;
+        }
 
-               $user = common_current_user();
+        $user = common_current_user();
 
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       common_redirect(common_local_url('showfavorites', array('nickname' => $user->nickname)));
-                       return;
-               }
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            common_redirect(common_local_url('showfavorites', array('nickname' => $user->nickname)));
+            return;
+        }
 
-               $id = $this->trimmed('notice');
+        $id = $this->trimmed('notice');
 
-               $notice = Notice::staticGet($id);
+        $notice = Notice::staticGet($id);
 
-               $token = $this->trimmed('token-'.$notice->id);
+        $token = $this->trimmed('token-'.$notice->id);
 
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_("There was a problem with your session token. Try again, please."));
-                       return;
-               }
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_("There was a problem with your session token. Try again, please."));
+            return;
+        }
 
-               $fave = new Fave();
-               $fave->user_id = $this->id;
-               $fave->notice_id = $notice->id;
-               if (!$fave->find(true)) {
-                       $this->client_error(_('This notice is not a favorite!'));
-                       return;
-               }
+        $fave = new Fave();
+        $fave->user_id = $this->id;
+        $fave->notice_id = $notice->id;
+        if (!$fave->find(true)) {
+            $this->client_error(_('This notice is not a favorite!'));
+            return;
+        }
 
-               $result = $fave->delete();
+        $result = $fave->delete();
 
-               if (!$result) {
-                       common_log_db_error($fave, 'DELETE', __FILE__);
-                       $this->server_error(_('Could not delete favorite.'));
-                       return;
-               }
-               
-               $user->blowFavesCache();
+        if (!$result) {
+            common_log_db_error($fave, 'DELETE', __FILE__);
+            $this->server_error(_('Could not delete favorite.'));
+            return;
+        }
+        
+        $user->blowFavesCache();
 
-               if ($this->boolean('ajax')) {
-                       common_start_html('text/xml;charset=utf-8', true);
-                       common_element_start('head');
-                       common_element('title', null, _('Add to favorites'));
-                       common_element_end('head');
-                       common_element_start('body');
-                       common_favor_form($notice);
-                       common_element_end('body');
-                       common_element_end('html');
-               } else {
-                       common_redirect(common_local_url('showfavorites',
-                                                                                        array('nickname' => $user->nickname)));
-               }
-       }
+        if ($this->boolean('ajax')) {
+            common_start_html('text/xml;charset=utf-8', true);
+            common_element_start('head');
+            common_element('title', null, _('Add to favorites'));
+            common_element_end('head');
+            common_element_start('body');
+            common_favor_form($notice);
+            common_element_end('body');
+            common_element_end('html');
+        } else {
+            common_redirect(common_local_url('showfavorites',
+                                             array('nickname' => $user->nickname)));
+        }
+    }
 }
index f3327048f271d09c87496f6e124af37996eadc18..0cf665d683c76d038b44ee32a38629ad5c38cb7e 100644 (file)
@@ -21,18 +21,18 @@ if (!defined('LACONICA')) { exit(1); }
 
 class DocAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-               $title = $this->trimmed('title');
-               $filename = INSTALLDIR.'/doc/'.$title;
-               if (!file_exists($filename)) {
-                       common_user_error(_('No such document.'));
-                       return;
-               }
-               $c = file_get_contents($filename);
-               $output = common_markup_to_html($c);
-               common_show_header(_(ucfirst($title)));
-               common_raw($output);
-               common_show_footer();
-       }
+    function handle($args) {
+        parent::handle($args);
+        $title = $this->trimmed('title');
+        $filename = INSTALLDIR.'/doc/'.$title;
+        if (!file_exists($filename)) {
+            common_user_error(_('No such document.'));
+            return;
+        }
+        $c = file_get_contents($filename);
+        $output = common_markup_to_html($c);
+        common_show_header(_(ucfirst($title)));
+        common_raw($output);
+        common_show_footer();
+    }
 }
index b35b4d28ee1a28c66b82e46454522c50332e5882..b77817c8e4d8c8a9b831c9b2c2bf28c2566bca4b 100644 (file)
@@ -23,308 +23,308 @@ require_once(INSTALLDIR.'/lib/settingsaction.php');
 
 class EmailsettingsAction extends SettingsAction {
 
-       function get_instructions() {
-               return _('Manage how you get email from %%site.name%%.');
-       }
-
-       function show_form($msg=NULL, $success=false) {
-               $user = common_current_user();
-               $this->form_header(_('Email Settings'), $msg, $success);
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'emailsettings',
-                                                                                  'action' =>
-                                                                                  common_local_url('emailsettings')));
-               common_hidden('token', common_session_token());
-
-               common_element('h2', NULL, _('Address'));
-
-               if ($user->email) {
-                       common_element_start('p');
-                       common_element('span', 'address confirmed', $user->email);
-                       common_element('span', 'input_instructions',
-                                      _('Current confirmed email address.'));
-                       common_hidden('email', $user->email);
-                       common_element_end('p');
-                       common_submit('remove', _('Remove'));
-               } else {
-                       $confirm = $this->get_confirmation();
-                       if ($confirm) {
-                               common_element_start('p');
-                               common_element('span', 'address unconfirmed', $confirm->address);
-                               common_element('span', 'input_instructions',
-                                                          _('Awaiting confirmation on this address. Check your inbox (and spam box!) for a message with further instructions.'));
-                               common_hidden('email', $confirm->address);
-                               common_element_end('p');
-                               common_submit('cancel', _('Cancel'));
-                       } else {
-                               common_input('email', _('Email Address'),
-                                                        ($this->arg('email')) ? $this->arg('email') : NULL,
-                                                        _('Email address, like "UserName@example.org"'));
-                               common_submit('add', _('Add'));
-                       }
-               }
-
-               if ($user->email) {
-                       common_element('h2', NULL, _('Incoming email'));
-                       
-                       if ($user->incomingemail) {
-                               common_element_start('p');
-                               common_element('span', 'address', $user->incomingemail);
-                               common_element('span', 'input_instructions',
-                                                          _('Send email to this address to post new notices.'));
-                               common_element_end('p');
-                               common_submit('removeincoming', _('Remove'));
-                       }
-                       
-                       common_element_start('p');
-                       common_element('span', 'input_instructions',
-                                                  _('Make a new email address for posting to; cancels the old one.'));
-                       common_element_end('p');
-                       common_submit('newincoming', _('New'));
-               }
-               
-               common_element('h2', NULL, _('Preferences'));
-
-               common_checkbox('emailnotifysub',
-                               _('Send me notices of new subscriptions through email.'),
-                               $user->emailnotifysub);
-               common_checkbox('emailnotifyfav',
-                               _('Send me email when someone adds my notice as a favorite.'),
-                               $user->emailnotifyfav);
-               common_checkbox('emailnotifymsg',
-                               _('Send me email when someone sends me a private message.'),
-                               $user->emailnotifymsg);
-               common_checkbox('emailnotifynudge',
-                               _('Allow friends to nudge me and send me an email.'),
-                               $user->emailnotifynudge);
-               common_checkbox('emailpost',
-                                               _('I want to post notices by email.'),
-                                               $user->emailpost);
-               common_checkbox('emailmicroid',
-                               _('Publish a MicroID for my email address.'),
-                               $user->emailmicroid);
-
-               common_submit('save', _('Save'));
-               
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function get_confirmation() {
-               $user = common_current_user();
-               $confirm = new Confirm_address();
-               $confirm->user_id = $user->id;
-               $confirm->address_type = 'email';
-               if ($confirm->find(TRUE)) {
-                       return $confirm;
-               } else {
-                       return NULL;
-               }
-       }
-
-       function handle_post() {
-
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               if ($this->arg('save')) {
-                       $this->save_preferences();
-               } else if ($this->arg('add')) {
-                       $this->add_address();
-               } else if ($this->arg('cancel')) {
-                       $this->cancel_confirmation();
-               } else if ($this->arg('remove')) {
-                       $this->remove_address();
-               } else if ($this->arg('removeincoming')) {
-                       $this->remove_incoming();
-               } else if ($this->arg('newincoming')) {
-                       $this->new_incoming();
-               } else {
-                       $this->show_form(_('Unexpected form submission.'));
-               }
-       }
-
-       function save_preferences() {
-
-               $emailnotifysub = $this->boolean('emailnotifysub');
-               $emailnotifyfav = $this->boolean('emailnotifyfav');
-               $emailnotifymsg = $this->boolean('emailnotifymsg');
-               $emailnotifynudge = $this->boolean('emailnotifynudge');
-               $emailmicroid = $this->boolean('emailmicroid');
-               $emailpost = $this->boolean('emailpost');
-
-               $user = common_current_user();
-
-               assert(!is_null($user)); # should already be checked
-
-               $user->query('BEGIN');
-
-               $original = clone($user);
-
-               $user->emailnotifysub = $emailnotifysub;
-               $user->emailnotifyfav = $emailnotifyfav;
-               $user->emailnotifymsg = $emailnotifymsg;
-               $user->emailnotifynudge = $emailnotifynudge;
-               $user->emailmicroid = $emailmicroid;
-               $user->emailpost = $emailpost;
-
-               $result = $user->update($original);
-
-               if ($result === FALSE) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t update user.'));
-                       return;
-               }
-
-               $user->query('COMMIT');
-
-               $this->show_form(_('Preferences saved.'), true);
-       }
-
-       function add_address() {
-
-               $user = common_current_user();
-
-               $email = $this->trimmed('email');
-
-               # Some validation
-
-               if (!$email) {
-                       $this->show_form(_('No email address.'));
-                       return;
-               }
-
-               $email = common_canonical_email($email);
-
-               if (!$email) {
-                   $this->show_form(_('Cannot normalize that email address'));
-                   return;
-               }
-               if (!Validate::email($email, true)) {
-                   $this->show_form(_('Not a valid email address'));
-                   return;
-               } else if ($user->email == $email) {
-                   $this->show_form(_('That is already your email address.'));
-                   return;
-               } else if ($this->email_exists($email)) {
-                   $this->show_form(_('That email address already belongs to another user.'));
-                   return;
-               }
-
-               $confirm = new Confirm_address();
-               $confirm->address = $email;
-               $confirm->address_type = 'email';
-               $confirm->user_id = $user->id;
-               $confirm->code = common_confirmation_code(64);
-
-               $result = $confirm->insert();
-
-               if ($result === FALSE) {
-                       common_log_db_error($confirm, 'INSERT', __FILE__);
-                       common_server_error(_('Couldn\'t insert confirmation code.'));
-                       return;
-               }
-
-               mail_confirm_address($user, $confirm->code, $user->nickname, $email);
-
-               $msg = _('A confirmation code was sent to the email address you added. Check your inbox (and spam box!) for the code and instructions on how to use it.');
-
-               $this->show_form($msg, TRUE);
-       }
-
-       function cancel_confirmation() {
-               $email = $this->arg('email');
-               $confirm = $this->get_confirmation();
-               if (!$confirm) {
-                       $this->show_form(_('No pending confirmation to cancel.'));
-                       return;
-               }
-               if ($confirm->address != $email) {
-                       $this->show_form(_('That is the wrong IM address.'));
-                       return;
-               }
+    function get_instructions() {
+        return _('Manage how you get email from %%site.name%%.');
+    }
+
+    function show_form($msg=NULL, $success=false) {
+        $user = common_current_user();
+        $this->form_header(_('Email Settings'), $msg, $success);
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'emailsettings',
+                                           'action' =>
+                                           common_local_url('emailsettings')));
+        common_hidden('token', common_session_token());
+
+        common_element('h2', NULL, _('Address'));
+
+        if ($user->email) {
+            common_element_start('p');
+            common_element('span', 'address confirmed', $user->email);
+            common_element('span', 'input_instructions',
+                           _('Current confirmed email address.'));
+            common_hidden('email', $user->email);
+            common_element_end('p');
+            common_submit('remove', _('Remove'));
+        } else {
+            $confirm = $this->get_confirmation();
+            if ($confirm) {
+                common_element_start('p');
+                common_element('span', 'address unconfirmed', $confirm->address);
+                common_element('span', 'input_instructions',
+                               _('Awaiting confirmation on this address. Check your inbox (and spam box!) for a message with further instructions.'));
+                common_hidden('email', $confirm->address);
+                common_element_end('p');
+                common_submit('cancel', _('Cancel'));
+            } else {
+                common_input('email', _('Email Address'),
+                             ($this->arg('email')) ? $this->arg('email') : NULL,
+                             _('Email address, like "UserName@example.org"'));
+                common_submit('add', _('Add'));
+            }
+        }
+
+        if ($user->email) {
+            common_element('h2', NULL, _('Incoming email'));
+            
+            if ($user->incomingemail) {
+                common_element_start('p');
+                common_element('span', 'address', $user->incomingemail);
+                common_element('span', 'input_instructions',
+                               _('Send email to this address to post new notices.'));
+                common_element_end('p');
+                common_submit('removeincoming', _('Remove'));
+            }
+            
+            common_element_start('p');
+            common_element('span', 'input_instructions',
+                           _('Make a new email address for posting to; cancels the old one.'));
+            common_element_end('p');
+            common_submit('newincoming', _('New'));
+        }
+        
+        common_element('h2', NULL, _('Preferences'));
+
+        common_checkbox('emailnotifysub',
+                        _('Send me notices of new subscriptions through email.'),
+                        $user->emailnotifysub);
+        common_checkbox('emailnotifyfav',
+                        _('Send me email when someone adds my notice as a favorite.'),
+                        $user->emailnotifyfav);
+        common_checkbox('emailnotifymsg',
+                        _('Send me email when someone sends me a private message.'),
+                        $user->emailnotifymsg);
+        common_checkbox('emailnotifynudge',
+                        _('Allow friends to nudge me and send me an email.'),
+                        $user->emailnotifynudge);
+        common_checkbox('emailpost',
+                        _('I want to post notices by email.'),
+                        $user->emailpost);
+        common_checkbox('emailmicroid',
+                        _('Publish a MicroID for my email address.'),
+                        $user->emailmicroid);
+
+        common_submit('save', _('Save'));
+        
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function get_confirmation() {
+        $user = common_current_user();
+        $confirm = new Confirm_address();
+        $confirm->user_id = $user->id;
+        $confirm->address_type = 'email';
+        if ($confirm->find(TRUE)) {
+            return $confirm;
+        } else {
+            return NULL;
+        }
+    }
+
+    function handle_post() {
+
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        if ($this->arg('save')) {
+            $this->save_preferences();
+        } else if ($this->arg('add')) {
+            $this->add_address();
+        } else if ($this->arg('cancel')) {
+            $this->cancel_confirmation();
+        } else if ($this->arg('remove')) {
+            $this->remove_address();
+        } else if ($this->arg('removeincoming')) {
+            $this->remove_incoming();
+        } else if ($this->arg('newincoming')) {
+            $this->new_incoming();
+        } else {
+            $this->show_form(_('Unexpected form submission.'));
+        }
+    }
+
+    function save_preferences() {
+
+        $emailnotifysub = $this->boolean('emailnotifysub');
+        $emailnotifyfav = $this->boolean('emailnotifyfav');
+        $emailnotifymsg = $this->boolean('emailnotifymsg');
+        $emailnotifynudge = $this->boolean('emailnotifynudge');
+        $emailmicroid = $this->boolean('emailmicroid');
+        $emailpost = $this->boolean('emailpost');
+
+        $user = common_current_user();
+
+        assert(!is_null($user)); # should already be checked
+
+        $user->query('BEGIN');
+
+        $original = clone($user);
+
+        $user->emailnotifysub = $emailnotifysub;
+        $user->emailnotifyfav = $emailnotifyfav;
+        $user->emailnotifymsg = $emailnotifymsg;
+        $user->emailnotifynudge = $emailnotifynudge;
+        $user->emailmicroid = $emailmicroid;
+        $user->emailpost = $emailpost;
+
+        $result = $user->update($original);
+
+        if ($result === FALSE) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t update user.'));
+            return;
+        }
+
+        $user->query('COMMIT');
+
+        $this->show_form(_('Preferences saved.'), true);
+    }
+
+    function add_address() {
+
+        $user = common_current_user();
+
+        $email = $this->trimmed('email');
+
+        # Some validation
+
+        if (!$email) {
+            $this->show_form(_('No email address.'));
+            return;
+        }
+
+        $email = common_canonical_email($email);
+
+        if (!$email) {
+            $this->show_form(_('Cannot normalize that email address'));
+            return;
+        }
+        if (!Validate::email($email, true)) {
+            $this->show_form(_('Not a valid email address'));
+            return;
+        } else if ($user->email == $email) {
+            $this->show_form(_('That is already your email address.'));
+            return;
+        } else if ($this->email_exists($email)) {
+            $this->show_form(_('That email address already belongs to another user.'));
+            return;
+        }
+
+          $confirm = new Confirm_address();
+           $confirm->address = $email;
+           $confirm->address_type = 'email';
+           $confirm->user_id = $user->id;
+           $confirm->code = common_confirmation_code(64);
+
+        $result = $confirm->insert();
+
+        if ($result === FALSE) {
+            common_log_db_error($confirm, 'INSERT', __FILE__);
+            common_server_error(_('Couldn\'t insert confirmation code.'));
+            return;
+        }
+
+        mail_confirm_address($user, $confirm->code, $user->nickname, $email);
+
+        $msg = _('A confirmation code was sent to the email address you added. Check your inbox (and spam box!) for the code and instructions on how to use it.');
+
+        $this->show_form($msg, TRUE);
+    }
+
+    function cancel_confirmation() {
+        $email = $this->arg('email');
+        $confirm = $this->get_confirmation();
+        if (!$confirm) {
+            $this->show_form(_('No pending confirmation to cancel.'));
+            return;
+        }
+        if ($confirm->address != $email) {
+            $this->show_form(_('That is the wrong IM address.'));
+            return;
+        }
 
         $result = $confirm->delete();
 
         if (!$result) {
-                       common_log_db_error($confirm, 'DELETE', __FILE__);
+            common_log_db_error($confirm, 'DELETE', __FILE__);
             $this->server_error(_('Couldn\'t delete email confirmation.'));
             return;
         }
 
         $this->show_form(_('Confirmation cancelled.'), TRUE);
-       }
-
-       function remove_address() {
-
-               $user = common_current_user();
-               $email = $this->arg('email');
-
-               # Maybe an old tab open...?
-
-               if ($user->email != $email) {
-                   $this->show_form(_('That is not your email address.'));
-                   return;
-               }
-
-               $user->query('BEGIN');
-               $original = clone($user);
-               $user->email = NULL;
-               $result = $user->updateKeys($original);
-               if (!$result) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t update user.'));
-                       return;
-               }
-               $user->query('COMMIT');
-
-               $this->show_form(_('The address was removed.'), TRUE);
-       }
-
-       function remove_incoming() {
-               $user = common_current_user();
-               
-               if (!$user->incomingemail) {
-                       $this->show_form(_('No incoming email address.'));
-                       return;
-               }
-               
-               $orig = clone($user);
-               $user->incomingemail = NULL;
-
-               if (!$user->updateKeys($orig)) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       $this->server_error(_("Couldn't update user record."));
-               }
-               
-               $this->show_form(_('Incoming email address removed.'), TRUE);
-       }
-
-       function new_incoming() {
-               $user = common_current_user();
-               
-               $orig = clone($user);
-               $user->incomingemail = mail_new_incoming_address();
-               
-               if (!$user->updateKeys($orig)) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       $this->server_error(_("Couldn't update user record."));
-               }
-
-               $this->show_form(_('New incoming email address added.'), TRUE);
-       }
-       
-       function email_exists($email) {
-               $user = common_current_user();
-               $other = User::staticGet('email', $email);
-               if (!$other) {
-                       return false;
-               } else {
-                       return $other->id != $user->id;
-               }
-       }
+    }
+
+    function remove_address() {
+
+        $user = common_current_user();
+        $email = $this->arg('email');
+
+        # Maybe an old tab open...?
+
+        if ($user->email != $email) {
+            $this->show_form(_('That is not your email address.'));
+            return;
+        }
+
+        $user->query('BEGIN');
+        $original = clone($user);
+        $user->email = NULL;
+        $result = $user->updateKeys($original);
+        if (!$result) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t update user.'));
+            return;
+        }
+        $user->query('COMMIT');
+
+        $this->show_form(_('The address was removed.'), TRUE);
+    }
+
+    function remove_incoming() {
+        $user = common_current_user();
+        
+        if (!$user->incomingemail) {
+            $this->show_form(_('No incoming email address.'));
+            return;
+        }
+        
+        $orig = clone($user);
+        $user->incomingemail = NULL;
+
+        if (!$user->updateKeys($orig)) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            $this->server_error(_("Couldn't update user record."));
+        }
+        
+        $this->show_form(_('Incoming email address removed.'), TRUE);
+    }
+
+    function new_incoming() {
+        $user = common_current_user();
+        
+        $orig = clone($user);
+        $user->incomingemail = mail_new_incoming_address();
+        
+        if (!$user->updateKeys($orig)) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            $this->server_error(_("Couldn't update user record."));
+        }
+
+        $this->show_form(_('New incoming email address added.'), TRUE);
+    }
+    
+    function email_exists($email) {
+        $user = common_current_user();
+        $other = User::staticGet('email', $email);
+        if (!$other) {
+            return false;
+        } else {
+            return $other->id != $user->id;
+        }
+    }
 }
index 8ee2d4cd36812392931078833652f4b86d9ebfc6..c964f451af8abbc9c82da53214bf9361f1db4d73 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,110 +23,110 @@ require_once(INSTALLDIR.'/lib/facebookaction.php');
 
 class FacebookhomeAction extends FacebookAction {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               $this->login();
-       }
+        $this->login();
+    }
 
-       function login() {
+    function login() {
 
-               $user = null;
+        $user = null;
 
-               $facebook = $this->get_facebook();
-               $fbuid = $facebook->require_login();
+        $facebook = $this->get_facebook();
+        $fbuid = $facebook->require_login();
 
-               # check to see whether there's already a Facebook link for this user
-               $flink = Foreign_link::getByForeignID($fbuid, 2); // 2 == Facebook
+        # check to see whether there's already a Facebook link for this user
+        $flink = Foreign_link::getByForeignID($fbuid, 2); // 2 == Facebook
 
-               if ($flink) {
+        if ($flink) {
 
-                       $user = $flink->getUser();
-                       $this->show_home($facebook, $fbuid, $user);
+            $user = $flink->getUser();
+            $this->show_home($facebook, $fbuid, $user);
 
-               } else {
+        } else {
 
-                       # Make the user put in her Laconica creds
-                       $nickname = common_canonical_nickname($this->trimmed('nickname'));
-                       $password = $this->arg('password');
+            # Make the user put in her Laconica creds
+            $nickname = common_canonical_nickname($this->trimmed('nickname'));
+            $password = $this->arg('password');
 
-                       if ($nickname) {
+            if ($nickname) {
 
-                               if (common_check_user($nickname, $password)) {
+                if (common_check_user($nickname, $password)) {
 
 
-                                       $user = User::staticGet('nickname', $nickname);
+                    $user = User::staticGet('nickname', $nickname);
 
-                                       if (!$user) {
-                                               echo '<fb:error message="Coudln\'t get user!" />';
-                                               $this->show_login_form();
-                                       }
+                    if (!$user) {
+                        echo '<fb:error message="Coudln\'t get user!" />';
+                        $this->show_login_form();
+                    }
 
-                                       $flink = DB_DataObject::factory('foreign_link');
-                                       $flink->user_id = $user->id;
-                                       $flink->foreign_id = $fbuid;
-                                       $flink->service = 2; # Facebook
-                                       $flink->created = common_sql_now();
+                    $flink = DB_DataObject::factory('foreign_link');
+                    $flink->user_id = $user->id;
+                    $flink->foreign_id = $fbuid;
+                    $flink->service = 2; # Facebook
+                    $flink->created = common_sql_now();
 
-                                       # $this->set_flags($flink, $noticesync, $replysync, $friendsync);
+                    # $this->set_flags($flink, $noticesync, $replysync, $friendsync);
 
-                                       $flink_id = $flink->insert();
+                    $flink_id = $flink->insert();
 
-                                       if ($flink_id) {
-                                               echo '<fb:success message="You can now use the Identi.ca from Facebook!" />';
-                                       }
+                    if ($flink_id) {
+                        echo '<fb:success message="You can now use the Identi.ca from Facebook!" />';
+                    }
 
-                                       $this->show_home($facebook, $fbuid, $user);
+                    $this->show_home($facebook, $fbuid, $user);
 
-                                       return;
-                               } else {
-                                       echo '<fb:error message="Incorrect username or password." />';
-                               }
-                       }
+                    return;
+                } else {
+                    echo '<fb:error message="Incorrect username or password." />';
+                }
+            }
 
-                       $this->show_login_form();
-               }
+            $this->show_login_form();
+        }
 
-       }
+    }
 
-       function show_home($facebook, $fbuid, $user) {
+    function show_home($facebook, $fbuid, $user) {
 
-               $this->show_header('Home');
+        $this->show_header('Home');
 
-               echo $this->show_notices($user);
-               $this->update_profile_box($facebook, $fbuid, $user);
+        echo $this->show_notices($user);
+        $this->update_profile_box($facebook, $fbuid, $user);
 
-               $this->show_footer();
-       }
+        $this->show_footer();
+    }
 
-       function show_notices($user) {
+    function show_notices($user) {
 
-               $page = $this->trimmed('page');
-               if (!$page) {
-                       $page = 1;
-               }
+        $page = $this->trimmed('page');
+        if (!$page) {
+            $page = 1;
+        }
 
-               $notice = $user->noticesWithFriends(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+        $notice = $user->noticesWithFriends(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
 
-               echo '<ul id="notices">';
+        echo '<ul id="notices">';
 
-               $cnt = 0;
+        $cnt = 0;
 
-               while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) {
-                       $cnt++;
+        while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) {
+            $cnt++;
 
-                       if ($cnt > NOTICES_PER_PAGE) {
-                               break;
-                       }
+            if ($cnt > NOTICES_PER_PAGE) {
+                break;
+            }
 
-                       echo $this->render_notice($notice);
-               }
+            echo $this->render_notice($notice);
+        }
 
-               echo '<ul>';
+        echo '<ul>';
 
-               $this->pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'index.php', array('nickname' => $user->nickname));
+        $this->pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'index.php', array('nickname' => $user->nickname));
 
-       }
+    }
 
 }
index 68b351fb93b96b4a967affedca7093cb9029f060..3a85a7c5c0f85f2a164178b347b185bb54faaaf2 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,24 +23,24 @@ require_once(INSTALLDIR.'/lib/facebookaction.php');
 
 class FacebookinviteAction extends FacebookAction {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               $this->display();
-       }
+        $this->display();
+    }
 
-       function display() {
+    function display() {
 
-               $facebook = $this->get_facebook();
+        $facebook = $this->get_facebook();
 
-               $fbuid = $facebook->require_login();
+        $fbuid = $facebook->require_login();
 
-               $this->show_header('Invite');
+        $this->show_header('Invite');
 
-               echo '<h2>Coming soon...</h2>';
+        echo '<h2>Coming soon...</h2>';
 
-               $this->show_footer();
+        $this->show_footer();
 
-       }
+    }
 
 }
index 2a7bdd03e0f624060991a8053194726dcaa60a71..1215f6622032e3ffcc3b9240879aaaccbbee59d8 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,43 +23,43 @@ require_once(INSTALLDIR.'/lib/facebookaction.php');
 
 class FacebookremoveAction extends FacebookAction {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               $secret = common_config('facebook', 'secret');
+        $secret = common_config('facebook', 'secret');
 
-               $sig = '';
+        $sig = '';
 
-               ksort($_POST);
+        ksort($_POST);
 
-               foreach ($_POST as $key => $val) {
-                       if (substr($key, 0, 7) == 'fb_sig_') {
-                               $sig .= substr($key, 7) . '=' . $val;
-                       }
-                }
+        foreach ($_POST as $key => $val) {
+            if (substr($key, 0, 7) == 'fb_sig_') {
+                $sig .= substr($key, 7) . '=' . $val;
+            }
+         }
 
-               $sig .= $secret;
-               $verify = md5($sig);
+        $sig .= $secret;
+        $verify = md5($sig);
 
-               if ($verify == $this->arg('fb_sig')) {
+        if ($verify == $this->arg('fb_sig')) {
 
-                       $flink = Foreign_link::getByForeignID($this->arg('fb_sig_user'), 2);
+            $flink = Foreign_link::getByForeignID($this->arg('fb_sig_user'), 2);
 
-                       common_debug("Removing foreign link to Facebook - local user ID: $flink->user_id, Facebook ID: $flink->foreign_id");
+            common_debug("Removing foreign link to Facebook - local user ID: $flink->user_id, Facebook ID: $flink->foreign_id");
 
-                       $result = $flink->delete();
+            $result = $flink->delete();
 
-                       if (!$result) {
-                               common_log_db_error($flink, 'DELETE', __FILE__);
-                               common_server_error(_('Couldn\'t remove Facebook user.'));
-                               return;
-                       }
+            if (!$result) {
+                common_log_db_error($flink, 'DELETE', __FILE__);
+                common_server_error(_('Couldn\'t remove Facebook user.'));
+                return;
+            }
 
-               } else {
-                       # Someone bad tried to remove facebook link?
-                       common_log(LOG_ERR, "Someone from $_SERVER[REMOTE_ADDR] " .
-                               'unsuccessfully tried to remove a foreign link to Facebook!');
-               }
-       }
+        } else {
+            # Someone bad tried to remove facebook link?
+            common_log(LOG_ERR, "Someone from $_SERVER[REMOTE_ADDR] " .
+                'unsuccessfully tried to remove a foreign link to Facebook!');
+        }
+    }
 
 }
index 4d7000d605e9e4e81b7593af0100817d0394a41e..a5ad9d07ac8c6c3884d896e8d42bae28b29537cf 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,30 +23,30 @@ require_once(INSTALLDIR.'/lib/facebookaction.php');
 
 class FacebooksettingsAction extends FacebookAction {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               $this->display();
-       }
+        $this->display();
+    }
 
-       function display() {
+    function display() {
 
-               $facebook = $this->get_facebook();
+        $facebook = $this->get_facebook();
 
-               $fbuid = $facebook->require_login();
+        $fbuid = $facebook->require_login();
 
-               $fbml = '<fb:if-section-not-added section="profile">'
-                       .'<h2>Add an Identi.ca box to your profile!</h2>'
-                       .'<fb:add-section-button section="profile"/>'
-                       .'</fb:if-section-not-added>';
+        $fbml = '<fb:if-section-not-added section="profile">'
+            .'<h2>Add an Identi.ca box to your profile!</h2>'
+            .'<fb:add-section-button section="profile"/>'
+            .'</fb:if-section-not-added>';
 
 
-               $this->show_header('Settings');
+        $this->show_header('Settings');
 
-               echo $fbml;
+        echo $fbml;
 
-               $this->show_footer();
+        $this->show_footer();
 
-       }
+    }
 
 }
index aede32902e62bd287976771e8563f9f5d9070a4c..c0b0324b5b04b84211c9e6086f75fb60cd2be24e 100644 (file)
@@ -23,72 +23,72 @@ require_once(INSTALLDIR.'/lib/mail.php');
 
 class FavorAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-                       return;
-               }
-
-               $user = common_current_user();
-
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       common_redirect(common_local_url('showfavorites', array('nickname' => $user->nickname)));
-                       return;
-               }
-
-               $id = $this->trimmed('notice');
-
-               $notice = Notice::staticGet($id);
-
-               # CSRF protection
-
-               $token = $this->trimmed('token-'.$notice->id);
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_("There was a problem with your session token. Try again, please."));
-                       return;
-               }
-
-               if ($user->hasFave($notice)) {
-                       $this->client_error(_('This notice is already a favorite!'));
-                       return;
-               }
-
-               $fave = Fave::addNew($user, $notice);
-
-               if (!$fave) {
-                       $this->server_error(_('Could not create favorite.'));
-                       return;
-               }
-
-               $this->notify($fave, $notice, $user);
-               $user->blowFavesCache();
-               
-               if ($this->boolean('ajax')) {
-                       common_start_html('text/xml;charset=utf-8', true);
-                       common_element_start('head');
-                       common_element('title', null, _('Disfavor favorite'));
-                       common_element_end('head');
-                       common_element_start('body');
-                       common_disfavor_form($notice);
-                       common_element_end('body');
-                       common_element_end('html');
-               } else {
-                       common_redirect(common_local_url('showfavorites',
-                                                                                        array('nickname' => $user->nickname)));
-               }
-       }
-
-       function notify($fave, $notice, $user) {
-           $other = User::staticGet('id', $notice->profile_id);
-               if ($other && $other->id != $user->id) {
-                       if ($other->email && $other->emailnotifyfav) {
-                               mail_notify_fave($other, $user, $notice);
-                       }
-                       # XXX: notify by IM
-                       # XXX: notify by SMS
-               }
-       }
+    function handle($args) {
+        parent::handle($args);
+
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+            return;
+        }
+
+        $user = common_current_user();
+
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            common_redirect(common_local_url('showfavorites', array('nickname' => $user->nickname)));
+            return;
+        }
+
+        $id = $this->trimmed('notice');
+
+        $notice = Notice::staticGet($id);
+
+        # CSRF protection
+
+        $token = $this->trimmed('token-'.$notice->id);
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_("There was a problem with your session token. Try again, please."));
+            return;
+        }
+
+        if ($user->hasFave($notice)) {
+            $this->client_error(_('This notice is already a favorite!'));
+            return;
+        }
+
+        $fave = Fave::addNew($user, $notice);
+
+        if (!$fave) {
+            $this->server_error(_('Could not create favorite.'));
+            return;
+        }
+
+        $this->notify($fave, $notice, $user);
+        $user->blowFavesCache();
+        
+        if ($this->boolean('ajax')) {
+            common_start_html('text/xml;charset=utf-8', true);
+            common_element_start('head');
+            common_element('title', null, _('Disfavor favorite'));
+            common_element_end('head');
+            common_element_start('body');
+            common_disfavor_form($notice);
+            common_element_end('body');
+            common_element_end('html');
+        } else {
+            common_redirect(common_local_url('showfavorites',
+                                             array('nickname' => $user->nickname)));
+        }
+    }
+
+    function notify($fave, $notice, $user) {
+        $other = User::staticGet('id', $notice->profile_id);
+        if ($other && $other->id != $user->id) {
+            if ($other->email && $other->emailnotifyfav) {
+                mail_notify_fave($other, $user, $notice);
+            }
+            # XXX: notify by IM
+            # XXX: notify by SMS
+        }
+    }
 
 }
index dc8070d060b1571f9143bb1b84ede62f8ef17b18..6a465df96a7503f544509707bd3b736ec741c155 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,77 +23,77 @@ require_once(INSTALLDIR.'/lib/stream.php');
 
 class FavoritedAction extends StreamAction {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
 
-               common_show_header(_('Popular notices'),
-                                                  array($this, 'show_header'), NULL,
-                                                  array($this, 'show_top'));
+        common_show_header(_('Popular notices'),
+                           array($this, 'show_header'), NULL,
+                           array($this, 'show_top'));
 
-               $this->show_notices($page);
+        $this->show_notices($page);
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function show_top() {
-               $instr = $this->get_instructions();
-               $output = common_markup_to_html($instr);
-               common_element_start('div', 'instructions');
-               common_raw($output);
-               common_element_end('div');
-               $this->public_views_menu();
-       }
+    function show_top() {
+        $instr = $this->get_instructions();
+        $output = common_markup_to_html($instr);
+        common_element_start('div', 'instructions');
+        common_raw($output);
+        common_element_end('div');
+        $this->public_views_menu();
+    }
 
-       function show_header() {
+    function show_header() {
         return;
-       }
+    }
 
-       function get_instructions() {
-               return _('Showing recently popular notices');
-       }
+    function get_instructions() {
+        return _('Showing recently popular notices');
+    }
 
-       function show_notices($page) {
+    function show_notices($page) {
 
-               $qry = 'SELECT notice.*, sum(exp(-(now() - fave.modified) / %s)) as weight ' .
-                               'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
-                               'GROUP BY fave.notice_id ' .
-                               'ORDER BY weight DESC';
+        $qry = 'SELECT notice.*, sum(exp(-(now() - fave.modified) / %s)) as weight ' .
+                'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
+                'GROUP BY fave.notice_id ' .
+                'ORDER BY weight DESC';
 
-               $offset = ($page - 1) * NOTICES_PER_PAGE;
-               $limit = NOTICES_PER_PAGE + 1;
+        $offset = ($page - 1) * NOTICES_PER_PAGE;
+        $limit = NOTICES_PER_PAGE + 1;
 
-               if (common_config('db','type') == 'pgsql') {
-                       $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
-               } else {
-                       $qry .= ' LIMIT ' . $offset . ', ' . $limit;
-               }
+        if (common_config('db','type') == 'pgsql') {
+            $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+        } else {
+            $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+        }
 
-               # Figure out how to cache this query
+        # Figure out how to cache this query
 
-               $notice = new Notice;
-               $notice->query(sprintf($qry, common_config('popular', 'dropoff')));
+        $notice = new Notice;
+        $notice->query(sprintf($qry, common_config('popular', 'dropoff')));
 
-               common_element_start('ul', array('id' => 'notices'));
+        common_element_start('ul', array('id' => 'notices'));
 
-               $cnt = 0;
+        $cnt = 0;
 
-               while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) {
-                       $cnt++;
+        while ($notice->fetch() && $cnt <= NOTICES_PER_PAGE) {
+            $cnt++;
 
-                       if ($cnt > NOTICES_PER_PAGE) {
-                               break;
-                       }
+            if ($cnt > NOTICES_PER_PAGE) {
+                break;
+            }
 
             $item = new NoticeListItem($notice);
             $item->show();
-               }
+        }
 
-               common_element_end('ul');
+        common_element_end('ul');
 
-               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'favorited');
-       }
+        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'favorited');
+    }
 
 }
index 25dd3861fa29fed97076d0bcad6974bd5ffc0e18..642d4f880269369e90baefcb43578911d8e802ee 100644 (file)
@@ -25,49 +25,49 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class FavoritesrssAction extends Rss10Action {
 
-       var $user = NULL;
-       
-       function init() {
-               $nickname = $this->trimmed('nickname');
-               $this->user = User::staticGet('nickname', $nickname);
+    var $user = NULL;
+    
+    function init() {
+        $nickname = $this->trimmed('nickname');
+        $this->user = User::staticGet('nickname', $nickname);
 
-               if (!$this->user) {
-                       common_user_error(_('No such user.'));
-                       return false;
-               } else {
-                       return true;
-               }
-       }
+        if (!$this->user) {
+            common_user_error(_('No such user.'));
+            return false;
+        } else {
+            return true;
+        }
+    }
 
-       function get_notices($limit=0) {
+    function get_notices($limit=0) {
 
-               $user = $this->user;
+        $user = $this->user;
 
-               $notice = $user->favoriteNotices(0, $limit);
+        $notice = $user->favoriteNotices(0, $limit);
 
-               $notices = array();
+        $notices = array();
 
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
 
-               return $notices;
-       }
+        return $notices;
+    }
 
-       function get_channel() {
-               $user = $this->user;
-               $c = array('url' => common_local_url('favoritesrss',
-                                                                                        array('nickname' =>
-                                                                                                  $user->nickname)),
-                                  'title' => sprintf(_("%s favorite notices"), $user->nickname),
-                                  'link' => common_local_url('showfavorites',
-                                                                                        array('nickname' =>
-                                                                                                  $user->nickname)),
-                                  'description' => sprintf(_('Feed of favorite notices of %s'), $user->nickname));
-               return $c;
-       }
+    function get_channel() {
+        $user = $this->user;
+        $c = array('url' => common_local_url('favoritesrss',
+                                             array('nickname' =>
+                                                   $user->nickname)),
+                   'title' => sprintf(_("%s favorite notices"), $user->nickname),
+                   'link' => common_local_url('showfavorites',
+                                             array('nickname' =>
+                                                   $user->nickname)),
+                   'description' => sprintf(_('Feed of favorite notices of %s'), $user->nickname));
+        return $c;
+    }
 
-       function get_image() {
-               return NULL;
-       }
+    function get_image() {
+        return NULL;
+    }
 }
\ No newline at end of file
index 96fbd89ab7d05440cd7bc3f588d20464a89b3ee2..2ff4f7745dbe2a622111ebd20b976a4b63e4c9d3 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -24,79 +24,79 @@ require_once(INSTALLDIR.'/lib/profilelist.php');
 
 class FeaturedAction extends StreamAction {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
 
-               common_show_header(_('Featured users'),
-                                                  array($this, 'show_header'), NULL,
-                                                  array($this, 'show_top'));
+        common_show_header(_('Featured users'),
+                           array($this, 'show_header'), NULL,
+                           array($this, 'show_top'));
 
-               $this->show_notices($page);
+        $this->show_notices($page);
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function show_top() {
-               $instr = $this->get_instructions();
-               $output = common_markup_to_html($instr);
-               common_element_start('div', 'instructions');
-               common_raw($output);
-               common_element_end('div');
-               $this->public_views_menu();
-       }
+    function show_top() {
+        $instr = $this->get_instructions();
+        $output = common_markup_to_html($instr);
+        common_element_start('div', 'instructions');
+        common_raw($output);
+        common_element_end('div');
+        $this->public_views_menu();
+    }
 
-       function show_header() {
-       }
+    function show_header() {
+    }
 
-       function get_instructions() {
-               return _('Featured users');
-       }
+    function get_instructions() {
+        return _('Featured users');
+    }
 
-       function show_notices($page) {
+    function show_notices($page) {
 
-               // XXX: Note I'm doing it this two-stage way because a raw query
-               // with a JOIN was *not* working. --Zach
+        // XXX: Note I'm doing it this two-stage way because a raw query
+        // with a JOIN was *not* working. --Zach
 
-               $featured_nicks = common_config('nickname', 'featured');
+        $featured_nicks = common_config('nickname', 'featured');
 
-               if (count($featured_nicks) > 0) {
+        if (count($featured_nicks) > 0) {
 
-                       $quoted = array();
+            $quoted = array();
 
-                       foreach ($featured_nicks as $nick) {
-                               $quoted[] = "'$nick'";
-                       }
+            foreach ($featured_nicks as $nick) {
+                $quoted[] = "'$nick'";
+            }
 
-                       $user = new User;
-                       $user->whereAdd(sprintf('nickname IN (%s)', implode(',', $quoted)));
-                       $user->limit(($page - 1) * PROFILES_PER_PAGE, PROFILES_PER_PAGE + 1);
-                       $user->orderBy('user.nickname ASC');
+            $user = new User;
+            $user->whereAdd(sprintf('nickname IN (%s)', implode(',', $quoted)));
+            $user->limit(($page - 1) * PROFILES_PER_PAGE, PROFILES_PER_PAGE + 1);
+            $user->orderBy('user.nickname ASC');
 
-                       $user->find();
+            $user->find();
 
-                       $profile_ids = array();
+            $profile_ids = array();
 
-                       while ($user->fetch()) {
-                               $profile_ids[] = $user->id;
-                       }
+            while ($user->fetch()) {
+                $profile_ids[] = $user->id;
+            }
 
-                       $profile = new Profile;
-                       $profile->whereAdd(sprintf('profile.id IN (%s)', implode(',', $profile_ids)));
-                       $profile->orderBy('nickname ASC');
+            $profile = new Profile;
+            $profile->whereAdd(sprintf('profile.id IN (%s)', implode(',', $profile_ids)));
+            $profile->orderBy('nickname ASC');
 
-                       $cnt = $profile->find();
+            $cnt = $profile->find();
 
-                       if ($cnt > 0) {
-                               $featured = new ProfileList($profile);
-                               $featured->show_list();
-                       }
+            if ($cnt > 0) {
+                $featured = new ProfileList($profile);
+                $featured->show_list();
+            }
 
-                       $profile->free();
+            $profile->free();
 
-                       common_pagination($page > 1, $cnt > PROFILES_PER_PAGE, $page, 'featured');
-               }
-       }
+            common_pagination($page > 1, $cnt > PROFILES_PER_PAGE, $page, 'featured');
+        }
+    }
 
 }
\ No newline at end of file
index 54d81b0b4e538efd0ba3c60d43f7d22566daaf53..07024e09151fc3fdf9f54df66f7791dd2a8ea182 100644 (file)
@@ -23,81 +23,81 @@ require_once(INSTALLDIR.'/lib/openid.php');
 
 class FinishaddopenidAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-               } else {
-                       $this->try_login();
-               }
-       }
-       
-       function try_login() {
-
-               $consumer =& oid_consumer();
-
-               $response = $consumer->complete(common_local_url('finishaddopenid'));
-
-               if ($response->status == Auth_OpenID_CANCEL) {
-                       $this->message(_('OpenID authentication cancelled.'));
-                       return;
-               } else if ($response->status == Auth_OpenID_FAILURE) {
-                       // Authentication failed; display the error message.
-                       $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message));
-               } else if ($response->status == Auth_OpenID_SUCCESS) {
-
-                       $display = $response->getDisplayIdentifier();
-                       $canonical = ($response->endpoint && $response->endpoint->canonicalID) ?
-                         $response->endpoint->canonicalID : $display;
-
-                       $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
-
-                       if ($sreg_resp) {
-                               $sreg = $sreg_resp->contents();
-                       }
-
-                       $cur =& common_current_user();
-                       $other = oid_get_user($canonical);
-
-                       if ($other) {
-                               if ($other->id == $cur->id) {
-                                       $this->message(_('You already have this OpenID!'));
-                               } else {
-                                       $this->message(_('Someone else already has this OpenID.'));
-                               }
-                               return;
-                       }
-
-                       # start a transaction
-
-                       $cur->query('BEGIN');
-
-                       $result = oid_link_user($cur->id, $canonical, $display);
-
-                       if (!$result) {
-                               $this->message(_('Error connecting user.'));
-                               return;
-                       }
-                       if ($sreg) {
-                               if (!oid_update_user($cur, $sreg)) {
-                                       $this->message(_('Error updating profile'));
-                                       return;
-                               }
-                       }
-
-                       # success!
-
-                       $cur->query('COMMIT');
-
-                       oid_set_last($display);
-
-                       common_redirect(common_local_url('openidsettings'));
-               }
-       }
-
-       function message($msg) {
-               common_show_header(_('OpenID Login'));
-               common_element('p', NULL, $msg);
-               common_show_footer();
-       }
+    function handle($args) {
+        parent::handle($args);
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+        } else {
+            $this->try_login();
+        }
+    }
+    
+    function try_login() {
+
+        $consumer =& oid_consumer();
+
+        $response = $consumer->complete(common_local_url('finishaddopenid'));
+
+        if ($response->status == Auth_OpenID_CANCEL) {
+            $this->message(_('OpenID authentication cancelled.'));
+            return;
+        } else if ($response->status == Auth_OpenID_FAILURE) {
+            // Authentication failed; display the error message.
+            $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message));
+        } else if ($response->status == Auth_OpenID_SUCCESS) {
+
+            $display = $response->getDisplayIdentifier();
+            $canonical = ($response->endpoint && $response->endpoint->canonicalID) ?
+              $response->endpoint->canonicalID : $display;
+
+            $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
+
+            if ($sreg_resp) {
+                $sreg = $sreg_resp->contents();
+            }
+
+            $cur =& common_current_user();
+            $other = oid_get_user($canonical);
+
+            if ($other) {
+                if ($other->id == $cur->id) {
+                    $this->message(_('You already have this OpenID!'));
+                } else {
+                    $this->message(_('Someone else already has this OpenID.'));
+                }
+                return;
+            }
+
+            # start a transaction
+
+            $cur->query('BEGIN');
+
+            $result = oid_link_user($cur->id, $canonical, $display);
+
+            if (!$result) {
+                $this->message(_('Error connecting user.'));
+                return;
+            }
+            if ($sreg) {
+                if (!oid_update_user($cur, $sreg)) {
+                    $this->message(_('Error updating profile'));
+                    return;
+                }
+            }
+
+            # success!
+
+            $cur->query('COMMIT');
+
+            oid_set_last($display);
+
+            common_redirect(common_local_url('openidsettings'));
+        }
+    }
+
+    function message($msg) {
+        common_show_header(_('OpenID Login'));
+        common_element('p', NULL, $msg);
+        common_show_footer();
+    }
 }
index 6dbaa3d1c6f0510054721ba5e52e48b76749b2d9..ea711f5c5fa2dbcf453cf7410ed7e32de9c56493 100644 (file)
@@ -23,43 +23,43 @@ require_once(INSTALLDIR.'/lib/openid.php');
 
 class FinishimmediateAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               $consumer = oid_consumer();
+        $consumer = oid_consumer();
 
-               $response = $consumer->complete(common_local_url('finishimmediate'));
+        $response = $consumer->complete(common_local_url('finishimmediate'));
 
-               if ($response->status == Auth_OpenID_SUCCESS) {
-                       $display = $response->getDisplayIdentifier();
-                       $canonical = ($response->endpoint->canonicalID) ?
-                         $response->endpoint->canonicalID : $response->getDisplayIdentifier();
+        if ($response->status == Auth_OpenID_SUCCESS) {
+            $display = $response->getDisplayIdentifier();
+            $canonical = ($response->endpoint->canonicalID) ?
+              $response->endpoint->canonicalID : $response->getDisplayIdentifier();
 
-                       $user = oid_get_user($canonical);
+            $user = oid_get_user($canonical);
 
-                       if ($user) {
-                               oid_update_user($user, $sreg);
-                               oid_set_last($display); # refresh for another year
-                               common_set_user($user->nickname);
-                               $this->go_backto();
-                               return;
-                       }
-               }
+            if ($user) {
+                oid_update_user($user, $sreg);
+                oid_set_last($display); # refresh for another year
+                common_set_user($user->nickname);
+                $this->go_backto();
+                return;
+            }
+        }
 
-               # Failure! Clear openid so we don't try it again
+        # Failure! Clear openid so we don't try it again
 
-               oid_clear_last();
-               $this->go_backto();
-               return;
-       }
+        oid_clear_last();
+        $this->go_backto();
+        return;
+    }
 
-       function go_backto() {
-               common_ensure_session();
-               $backto = $_SESSION['openid_immediate_backto'];
-               if (!$backto) {
-                       # gar. Well, push them to the public page
-                       $backto = common_local_url('public');
-               }
-               common_redirect($backto);
-       }
+    function go_backto() {
+        common_ensure_session();
+        $backto = $_SESSION['openid_immediate_backto'];
+        if (!$backto) {
+            # gar. Well, push them to the public page
+            $backto = common_local_url('public');
+        }
+        common_redirect($backto);
+    }
 }
index 766a08b208a60778e9edccc3ce1345d86e29a58f..a2a778f31081f4c51ceda1d1c7a279919ec01123 100644 (file)
@@ -23,414 +23,414 @@ require_once(INSTALLDIR.'/lib/openid.php');
 
 class FinishopenidloginAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-               if (common_logged_in()) {
-                       common_user_error(_('Already logged in.'));
-               } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $token = $this->trimmed('token');
-                       if (!$token || $token != common_session_token()) {
-                               $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                               return;
-                       }
-                       if ($this->arg('create')) {
-                               if (!$this->boolean('license')) {
-                                       $this->show_form(_('You can\'t register if you don\'t agree to the license.'),
-                                                                        $this->trimmed('newname'));
-                                       return;
-                               }
-                               $this->create_new_user();
-                       } else if ($this->arg('connect')) {
-                               $this->connect_user();
-                       } else {
-                               common_debug(print_r($this->args, true), __FILE__);
-                               $this->show_form(_('Something weird happened.'),
-                                                                $this->trimmed('newname'));
-                       }
-               } else {
-                       $this->try_login();
-               }
-       }
-
-       function show_top($error=NULL) {
-               if ($error) {
-                       common_element('div', array('class' => 'error'), $error);
-               } else {
-                       global $config;
-                       common_element('div', 'instructions',
-                                                  sprintf(_('This is the first time you\'ve logged into %s so we must connect your OpenID to a local account. You can either create a new account, or connect with your existing account, if you have one.'), $config['site']['name']));
-               }
-       }
-
-       function show_form($error=NULL, $username=NULL) {
-               common_show_header(_('OpenID Account Setup'), NULL, $error,
-                                                  array($this, 'show_top'));
-
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'account_connect',
-                                                                                  'action' => common_local_url('finishopenidlogin')));
-               common_hidden('token', common_session_token());
-               common_element('h2', NULL,
-                                          _('Create new account'));
-               common_element('p', NULL,
-                                          _('Create a new user with this nickname.'));
-               common_input('newname', _('New nickname'),
-                                        ($username) ? $username : '',
-                                        _('1-64 lowercase letters or numbers, no punctuation or spaces'));
-               common_element_start('p');
-               common_element('input', array('type' => 'checkbox',
-                                                                         'id' => 'license',
-                                                                         'name' => 'license',
-                                                                         'value' => 'true'));
-               common_text(_('My text and files are available under '));
-               common_element('a', array(href => common_config('license', 'url')),
-                                          common_config('license', 'title'));
-               common_text(_(' except this private data: password, email address, IM address, phone number.'));
-               common_element_end('p');
-               common_submit('create', _('Create'));
-               common_element('h2', NULL,
-                                          _('Connect existing account'));
-               common_element('p', NULL,
-                                          _('If you already have an account, login with your username and password to connect it to your OpenID.'));
-               common_input('nickname', _('Existing nickname'));
-               common_password('password', _('Password'));
-               common_submit('connect', _('Connect'));
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function try_login() {
-
-               $consumer = oid_consumer();
-
-               $response = $consumer->complete(common_local_url('finishopenidlogin'));
-
-               if ($response->status == Auth_OpenID_CANCEL) {
-                       $this->message(_('OpenID authentication cancelled.'));
-                       return;
-               } else if ($response->status == Auth_OpenID_FAILURE) {
-                       // Authentication failed; display the error message.
-                       $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message));
-               } else if ($response->status == Auth_OpenID_SUCCESS) {
-                       // This means the authentication succeeded; extract the
-                       // identity URL and Simple Registration data (if it was
-                       // returned).
-                       $display = $response->getDisplayIdentifier();
-                       $canonical = ($response->endpoint->canonicalID) ?
-                         $response->endpoint->canonicalID : $response->getDisplayIdentifier();
-
-                       $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
-
-                       if ($sreg_resp) {
-                               $sreg = $sreg_resp->contents();
-                       }
-
-                       $user = oid_get_user($canonical);
-
-                       if ($user) {
-                               oid_set_last($display);
-                               # XXX: commented out at @edd's request until better
-                               # control over how data flows from OpenID provider.
-                               # oid_update_user($user, $sreg);
-                               common_set_user($user);
-                               common_real_login(true);
-                               if (isset($_SESSION['openid_rememberme']) && $_SESSION['openid_rememberme']) {
-                                       common_rememberme($user);
-                               }
+    function handle($args) {
+        parent::handle($args);
+        if (common_logged_in()) {
+            common_user_error(_('Already logged in.'));
+        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $token = $this->trimmed('token');
+            if (!$token || $token != common_session_token()) {
+                $this->show_form(_('There was a problem with your session token. Try again, please.'));
+                return;
+            }
+            if ($this->arg('create')) {
+                if (!$this->boolean('license')) {
+                    $this->show_form(_('You can\'t register if you don\'t agree to the license.'),
+                                     $this->trimmed('newname'));
+                    return;
+                }
+                $this->create_new_user();
+            } else if ($this->arg('connect')) {
+                $this->connect_user();
+            } else {
+                common_debug(print_r($this->args, true), __FILE__);
+                $this->show_form(_('Something weird happened.'),
+                                 $this->trimmed('newname'));
+            }
+        } else {
+            $this->try_login();
+        }
+    }
+
+    function show_top($error=NULL) {
+        if ($error) {
+            common_element('div', array('class' => 'error'), $error);
+        } else {
+            global $config;
+            common_element('div', 'instructions',
+                           sprintf(_('This is the first time you\'ve logged into %s so we must connect your OpenID to a local account. You can either create a new account, or connect with your existing account, if you have one.'), $config['site']['name']));
+        }
+    }
+
+    function show_form($error=NULL, $username=NULL) {
+        common_show_header(_('OpenID Account Setup'), NULL, $error,
+                           array($this, 'show_top'));
+
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'account_connect',
+                                           'action' => common_local_url('finishopenidlogin')));
+        common_hidden('token', common_session_token());
+        common_element('h2', NULL,
+                       _('Create new account'));
+        common_element('p', NULL,
+                       _('Create a new user with this nickname.'));
+        common_input('newname', _('New nickname'),
+                     ($username) ? $username : '',
+                     _('1-64 lowercase letters or numbers, no punctuation or spaces'));
+        common_element_start('p');
+        common_element('input', array('type' => 'checkbox',
+                                      'id' => 'license',
+                                      'name' => 'license',
+                                      'value' => 'true'));
+        common_text(_('My text and files are available under '));
+        common_element('a', array(href => common_config('license', 'url')),
+                       common_config('license', 'title'));
+        common_text(_(' except this private data: password, email address, IM address, phone number.'));
+        common_element_end('p');
+        common_submit('create', _('Create'));
+        common_element('h2', NULL,
+                       _('Connect existing account'));
+        common_element('p', NULL,
+                       _('If you already have an account, login with your username and password to connect it to your OpenID.'));
+        common_input('nickname', _('Existing nickname'));
+        common_password('password', _('Password'));
+        common_submit('connect', _('Connect'));
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function try_login() {
+
+        $consumer = oid_consumer();
+
+        $response = $consumer->complete(common_local_url('finishopenidlogin'));
+
+        if ($response->status == Auth_OpenID_CANCEL) {
+            $this->message(_('OpenID authentication cancelled.'));
+            return;
+        } else if ($response->status == Auth_OpenID_FAILURE) {
+            // Authentication failed; display the error message.
+            $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message));
+        } else if ($response->status == Auth_OpenID_SUCCESS) {
+            // This means the authentication succeeded; extract the
+            // identity URL and Simple Registration data (if it was
+            // returned).
+            $display = $response->getDisplayIdentifier();
+            $canonical = ($response->endpoint->canonicalID) ?
+              $response->endpoint->canonicalID : $response->getDisplayIdentifier();
+
+            $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
+
+            if ($sreg_resp) {
+                $sreg = $sreg_resp->contents();
+            }
+
+            $user = oid_get_user($canonical);
+
+            if ($user) {
+                oid_set_last($display);
+                # XXX: commented out at @edd's request until better
+                # control over how data flows from OpenID provider.
+                # oid_update_user($user, $sreg);
+                common_set_user($user);
+                common_real_login(true);
+                if (isset($_SESSION['openid_rememberme']) && $_SESSION['openid_rememberme']) {
+                    common_rememberme($user);
+                }
                 unset($_SESSION['openid_rememberme']);
-                               $this->go_home($user->nickname);
-                       } else {
-                               $this->save_values($display, $canonical, $sreg);
-                               $this->show_form(NULL, $this->best_new_nickname($display, $sreg));
-                       }
-               }
-       }
-
-       function message($msg) {
-               common_show_header(_('OpenID Login'));
-               common_element('p', NULL, $msg);
-               common_show_footer();
-       }
-
-       function save_values($display, $canonical, $sreg) {
-               common_ensure_session();
-               $_SESSION['openid_display'] = $display;
-               $_SESSION['openid_canonical'] = $canonical;
-               $_SESSION['openid_sreg'] = $sreg;
-       }
-
-       function get_saved_values() {
-               return array($_SESSION['openid_display'],
-                                        $_SESSION['openid_canonical'],
-                                        $_SESSION['openid_sreg']);
-       }
-
-       function create_new_user() {
+                $this->go_home($user->nickname);
+            } else {
+                $this->save_values($display, $canonical, $sreg);
+                $this->show_form(NULL, $this->best_new_nickname($display, $sreg));
+            }
+        }
+    }
+
+    function message($msg) {
+        common_show_header(_('OpenID Login'));
+        common_element('p', NULL, $msg);
+        common_show_footer();
+    }
+
+    function save_values($display, $canonical, $sreg) {
+        common_ensure_session();
+        $_SESSION['openid_display'] = $display;
+        $_SESSION['openid_canonical'] = $canonical;
+        $_SESSION['openid_sreg'] = $sreg;
+    }
+
+    function get_saved_values() {
+        return array($_SESSION['openid_display'],
+                     $_SESSION['openid_canonical'],
+                     $_SESSION['openid_sreg']);
+    }
+
+    function create_new_user() {
 
         # FIXME: save invite code before redirect, and check here
 
-               if (common_config('site', 'closed') || common_config('site', 'inviteonly')) {
-                       common_user_error(_('Registration not allowed.'));
+        if (common_config('site', 'closed') || common_config('site', 'inviteonly')) {
+            common_user_error(_('Registration not allowed.'));
             return;
         }
 
-               $nickname = $this->trimmed('newname');
+        $nickname = $this->trimmed('newname');
 
-               if (!Validate::string($nickname, array('min_length' => 1,
-                                                                                          'max_length' => 64,
-                                                                                          'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
-                       $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
-                       return;
-               }
+        if (!Validate::string($nickname, array('min_length' => 1,
+                                               'max_length' => 64,
+                                               'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+            $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
+            return;
+        }
 
-               if (!User::allowed_nickname($nickname)) {
-                       $this->show_form(_('Nickname not allowed.'));
-                       return;
-               }
+        if (!User::allowed_nickname($nickname)) {
+            $this->show_form(_('Nickname not allowed.'));
+            return;
+        }
 
-               if (User::staticGet('nickname', $nickname)) {
-                       $this->show_form(_('Nickname already in use. Try another one.'));
-                       return;
-               }
+        if (User::staticGet('nickname', $nickname)) {
+            $this->show_form(_('Nickname already in use. Try another one.'));
+            return;
+        }
 
-               list($display, $canonical, $sreg) = $this->get_saved_values();
+        list($display, $canonical, $sreg) = $this->get_saved_values();
 
-               if (!$display || !$canonical) {
-                       common_server_error(_('Stored OpenID not found.'));
-                       return;
-               }
+        if (!$display || !$canonical) {
+            common_server_error(_('Stored OpenID not found.'));
+            return;
+        }
 
-               # Possible race condition... let's be paranoid
+        # Possible race condition... let's be paranoid
 
-               $other = oid_get_user($canonical);
+        $other = oid_get_user($canonical);
 
-               if ($other) {
-                       common_server_error(_('Creating new account for OpenID that already has a user.'));
-                       return;
-               }
+        if ($other) {
+            common_server_error(_('Creating new account for OpenID that already has a user.'));
+            return;
+        }
 
-               if ($sreg['country']) {
-                       if ($sreg['postcode']) {
-                               # XXX: use postcode to get city and region
-                               # XXX: also, store postcode somewhere -- it's valuable!
-                               $location = $sreg['postcode'] . ', ' . $sreg['country'];
-                       } else {
-                               $location = $sreg['country'];
-                       }
-               }
+        if ($sreg['country']) {
+            if ($sreg['postcode']) {
+                # XXX: use postcode to get city and region
+                # XXX: also, store postcode somewhere -- it's valuable!
+                $location = $sreg['postcode'] . ', ' . $sreg['country'];
+            } else {
+                $location = $sreg['country'];
+            }
+        }
 
-               if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
-                       $fullname = $sreg['fullname'];
-               }
+        if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
+            $fullname = $sreg['fullname'];
+        }
 
-               if ($sreg['email'] && Validate::email($sreg['email'], true)) {
-                       $email = $sreg['email'];
-               }
+        if ($sreg['email'] && Validate::email($sreg['email'], true)) {
+            $email = $sreg['email'];
+        }
 
-               # XXX: add language
-               # XXX: add timezone
+        # XXX: add language
+        # XXX: add timezone
 
-               $user = User::register(array('nickname' => $nickname,
-                                                                        'email' => $email,
-                                                                        'fullname' => $fullname,
-                                                                        'location' => $location));
+        $user = User::register(array('nickname' => $nickname,
+                                     'email' => $email,
+                                     'fullname' => $fullname,
+                                     'location' => $location));
 
-               $result = oid_link_user($user->id, $canonical, $display);
+        $result = oid_link_user($user->id, $canonical, $display);
 
-               oid_set_last($display);
-               common_set_user($user);
-               common_real_login(true);
+        oid_set_last($display);
+        common_set_user($user);
+        common_real_login(true);
         if (isset($_SESSION['openid_rememberme']) && $_SESSION['openid_rememberme']) {
-                       common_rememberme($user);
-               }
+            common_rememberme($user);
+        }
         unset($_SESSION['openid_rememberme']);
-               common_redirect(common_local_url('showstream', array('nickname' => $user->nickname)));
-       }
+        common_redirect(common_local_url('showstream', array('nickname' => $user->nickname)));
+    }
 
-       function connect_user() {
+    function connect_user() {
 
-               $nickname = $this->trimmed('nickname');
-               $password = $this->trimmed('password');
+        $nickname = $this->trimmed('nickname');
+        $password = $this->trimmed('password');
 
-               if (!common_check_user($nickname, $password)) {
-                       $this->show_form(_('Invalid username or password.'));
-                       return;
-               }
+        if (!common_check_user($nickname, $password)) {
+            $this->show_form(_('Invalid username or password.'));
+            return;
+        }
 
-               # They're legit!
+        # They're legit!
 
-               $user = User::staticGet('nickname', $nickname);
+        $user = User::staticGet('nickname', $nickname);
 
-               list($display, $canonical, $sreg) = $this->get_saved_values();
+        list($display, $canonical, $sreg) = $this->get_saved_values();
 
-               if (!$display || !$canonical) {
-                       common_server_error(_('Stored OpenID not found.'));
-                       return;
-               }
+        if (!$display || !$canonical) {
+            common_server_error(_('Stored OpenID not found.'));
+            return;
+        }
 
-               $result = oid_link_user($user->id, $canonical, $display);
+        $result = oid_link_user($user->id, $canonical, $display);
 
-               if (!$result) {
-                       common_server_error(_('Error connecting user to OpenID.'));
-                       return;
-               }
+        if (!$result) {
+            common_server_error(_('Error connecting user to OpenID.'));
+            return;
+        }
 
-               oid_update_user($user, $sreg);
-               oid_set_last($display);
-               common_set_user($user);
-               common_real_login(true);
+        oid_update_user($user, $sreg);
+        oid_set_last($display);
+        common_set_user($user);
+        common_real_login(true);
         if (isset($_SESSION['openid_rememberme']) && $_SESSION['openid_rememberme']) {
-                       common_rememberme($user);
-               }
-               unset($_SESSION['openid_rememberme']);
-               $this->go_home($user->nickname);
-       }
-
-       function go_home($nickname) {
-               $url = common_get_returnto();
-               if ($url) {
-                       # We don't have to return to it again
-                       common_set_returnto(NULL);
-               } else {
-                       $url = common_local_url('all',
-                                                                       array('nickname' =>
-                                                                                 $nickname));
-               }
-               common_redirect($url);
-       }
-
-       function best_new_nickname($display, $sreg) {
-
-               # Try the passed-in nickname
-
-               if ($sreg['nickname']) {
-                       $nickname = $this->nicknamize($sreg['nickname']);
-                       if ($this->is_new_nickname($nickname)) {
-                               return $nickname;
-                       }
-               }
-
-               # Try the full name
-
-               if ($sreg['fullname']) {
-                       $fullname = $this->nicknamize($sreg['fullname']);
-                       if ($this->is_new_nickname($fullname)) {
-                               return $fullname;
-                       }
-               }
-
-               # Try the URL
-
-               $from_url = $this->openid_to_nickname($display);
-
-               if ($from_url && $this->is_new_nickname($from_url)) {
-                       return $from_url;
-               }
-
-               # XXX: others?
-
-               return NULL;
-       }
-
-       function is_new_nickname($str) {
-               if (!Validate::string($str, array('min_length' => 1,
-                                                                                 'max_length' => 64,
-                                                                                 'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
-                       return false;
-               }
-       if (!User::allowed_nickname($str)) {
-                       return false;
-               }
-               if (User::staticGet('nickname', $str)) {
-                       return false;
-               }
-               return true;
-       }
-
-       function openid_to_nickname($openid) {
+            common_rememberme($user);
+        }
+        unset($_SESSION['openid_rememberme']);
+        $this->go_home($user->nickname);
+    }
+
+    function go_home($nickname) {
+        $url = common_get_returnto();
+        if ($url) {
+            # We don't have to return to it again
+            common_set_returnto(NULL);
+        } else {
+            $url = common_local_url('all',
+                                    array('nickname' =>
+                                          $nickname));
+        }
+        common_redirect($url);
+    }
+
+    function best_new_nickname($display, $sreg) {
+
+        # Try the passed-in nickname
+
+        if ($sreg['nickname']) {
+            $nickname = $this->nicknamize($sreg['nickname']);
+            if ($this->is_new_nickname($nickname)) {
+                return $nickname;
+            }
+        }
+
+        # Try the full name
+
+        if ($sreg['fullname']) {
+            $fullname = $this->nicknamize($sreg['fullname']);
+            if ($this->is_new_nickname($fullname)) {
+                return $fullname;
+            }
+        }
+
+        # Try the URL
+
+        $from_url = $this->openid_to_nickname($display);
+
+        if ($from_url && $this->is_new_nickname($from_url)) {
+            return $from_url;
+        }
+
+        # XXX: others?
+
+        return NULL;
+    }
+
+    function is_new_nickname($str) {
+        if (!Validate::string($str, array('min_length' => 1,
+                                          'max_length' => 64,
+                                          'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+            return false;
+        }
+    if (!User::allowed_nickname($str)) {
+            return false;
+        }
+        if (User::staticGet('nickname', $str)) {
+            return false;
+        }
+        return true;
+    }
+
+    function openid_to_nickname($openid) {
         if (Auth_Yadis_identifierScheme($openid) == 'XRI') {
-                       return $this->xri_to_nickname($openid);
-               } else {
-                       return $this->url_to_nickname($openid);
-               }
-       }
+            return $this->xri_to_nickname($openid);
+        } else {
+            return $this->url_to_nickname($openid);
+        }
+    }
 
-       # We try to use an OpenID URL as a legal Laconica user name in this order
-       # 1. Plain hostname, like http://evanp.myopenid.com/
-       # 2. One element in path, like http://profile.typekey.com/EvanProdromou/
-       #    or http://getopenid.com/evanprodromou
+    # We try to use an OpenID URL as a legal Laconica user name in this order
+    # 1. Plain hostname, like http://evanp.myopenid.com/
+    # 2. One element in path, like http://profile.typekey.com/EvanProdromou/
+    #    or http://getopenid.com/evanprodromou
 
     function url_to_nickname($openid) {
-               static $bad = array('query', 'user', 'password', 'port', 'fragment');
-
-           $parts = parse_url($openid);
-
-               # If any of these parts exist, this won't work
-
-               foreach ($bad as $badpart) {
-                       if (array_key_exists($badpart, $parts)) {
-                               return NULL;
-                       }
-               }
-
-               # We just have host and/or path
-
-               # If it's just a host...
-               if (array_key_exists('host', $parts) &&
-                       (!array_key_exists('path', $parts) || strcmp($parts['path'], '/') == 0))
-               {
-                       $hostparts = explode('.', $parts['host']);
-
-                       # Try to catch common idiom of nickname.service.tld
-
-                       if ((count($hostparts) > 2) &&
-                               (strlen($hostparts[count($hostparts) - 2]) > 3) && # try to skip .co.uk, .com.au
-                               (strcmp($hostparts[0], 'www') != 0))
-                       {
-                               return $this->nicknamize($hostparts[0]);
-                       } else {
-                               # Do the whole hostname
-                               return $this->nicknamize($parts['host']);
-                       }
-               } else {
-                       if (array_key_exists('path', $parts)) {
-                               # Strip starting, ending slashes
-                               $path = preg_replace('@/$@', '', $parts['path']);
-                               $path = preg_replace('@^/@', '', $path);
-                               if (strpos($path, '/') === false) {
-                                       return $this->nicknamize($path);
-                               }
-                       }
-               }
-
-               return NULL;
-       }
-
-       function xri_to_nickname($xri) {
-               $base = $this->xri_base($xri);
-
-               if (!$base) {
-                       return NULL;
-               } else {
-                       # =evan.prodromou
-                       # or @gratis*evan.prodromou
-                       $parts = explode('*', substr($base, 1));
-                       return $this->nicknamize(array_pop($parts));
-               }
-       }
-
-       function xri_base($xri) {
-               if (substr($xri, 0, 6) == 'xri://') {
-                       return substr($xri, 6);
-               } else {
-                       return $xri;
-               }
-       }
-
-       # Given a string, try to make it work as a nickname
-
-       function nicknamize($str) {
-               $str = preg_replace('/\W/', '', $str);
-               return strtolower($str);
-       }
+        static $bad = array('query', 'user', 'password', 'port', 'fragment');
+
+        $parts = parse_url($openid);
+
+        # If any of these parts exist, this won't work
+
+        foreach ($bad as $badpart) {
+            if (array_key_exists($badpart, $parts)) {
+                return NULL;
+            }
+        }
+
+        # We just have host and/or path
+
+        # If it's just a host...
+        if (array_key_exists('host', $parts) &&
+            (!array_key_exists('path', $parts) || strcmp($parts['path'], '/') == 0))
+        {
+            $hostparts = explode('.', $parts['host']);
+
+            # Try to catch common idiom of nickname.service.tld
+
+            if ((count($hostparts) > 2) &&
+                (strlen($hostparts[count($hostparts) - 2]) > 3) && # try to skip .co.uk, .com.au
+                (strcmp($hostparts[0], 'www') != 0))
+            {
+                return $this->nicknamize($hostparts[0]);
+            } else {
+                # Do the whole hostname
+                return $this->nicknamize($parts['host']);
+            }
+        } else {
+            if (array_key_exists('path', $parts)) {
+                # Strip starting, ending slashes
+                $path = preg_replace('@/$@', '', $parts['path']);
+                $path = preg_replace('@^/@', '', $path);
+                if (strpos($path, '/') === false) {
+                    return $this->nicknamize($path);
+                }
+            }
+        }
+
+        return NULL;
+    }
+
+    function xri_to_nickname($xri) {
+        $base = $this->xri_base($xri);
+
+        if (!$base) {
+            return NULL;
+        } else {
+            # =evan.prodromou
+            # or @gratis*evan.prodromou
+            $parts = explode('*', substr($base, 1));
+            return $this->nicknamize(array_pop($parts));
+        }
+    }
+
+    function xri_base($xri) {
+        if (substr($xri, 0, 6) == 'xri://') {
+            return substr($xri, 6);
+        } else {
+            return $xri;
+        }
+    }
+
+    # Given a string, try to make it work as a nickname
+
+    function nicknamize($str) {
+        $str = preg_replace('/\W/', '', $str);
+        return strtolower($str);
+    }
 }
index 58040683fdb44bed058e280b903633f382920902..c3387cf0235a0e3528562fe1446166a3878a90c1 100644 (file)
@@ -23,174 +23,174 @@ require_once(INSTALLDIR.'/lib/omb.php');
 
 class FinishremotesubscribeAction extends Action {
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               if (common_logged_in()) {
-                       common_user_error(_('You can use the local subscription!'));
-                   return;
-               }
+        if (common_logged_in()) {
+            common_user_error(_('You can use the local subscription!'));
+            return;
+        }
+
+        $omb = $_SESSION['oauth_authorization_request'];
+
+        if (!$omb) {
+            common_user_error(_('Not expecting this response!'));
+            return;
+        }
+
+        common_debug('stored request: '.print_r($omb,true), __FILE__);
+
+        common_remove_magic_from_request();
+        $req = OAuthRequest::from_request();
 
-               $omb = $_SESSION['oauth_authorization_request'];
+        $token = $req->get_parameter('oauth_token');
 
-               if (!$omb) {
-                       common_user_error(_('Not expecting this response!'));
-                       return;
-               }
+        # I think this is the success metric
 
-               common_debug('stored request: '.print_r($omb,true), __FILE__);
+        if ($token != $omb['token']) {
+            common_user_error(_('Not authorized.'));
+            return;
+        }
 
-               common_remove_magic_from_request();
-               $req = OAuthRequest::from_request();
+        $version = $req->get_parameter('omb_version');
+
+        if ($version != OMB_VERSION_01) {
+            common_user_error(_('Unknown version of OMB protocol.'));
+            return;
+        }
 
-               $token = $req->get_parameter('oauth_token');
+        $nickname = $req->get_parameter('omb_listener_nickname');
 
-               # I think this is the success metric
+        if (!$nickname) {
+            common_user_error(_('No nickname provided by remote server.'));
+            return;
+        }
 
-               if ($token != $omb['token']) {
-                       common_user_error(_('Not authorized.'));
-                       return;
-               }
-
-               $version = $req->get_parameter('omb_version');
-
-               if ($version != OMB_VERSION_01) {
-                       common_user_error(_('Unknown version of OMB protocol.'));
-                       return;
-               }
-
-               $nickname = $req->get_parameter('omb_listener_nickname');
-
-               if (!$nickname) {
-                       common_user_error(_('No nickname provided by remote server.'));
-                       return;
-               }
-
-               $profile_url = $req->get_parameter('omb_listener_profile');
-
-               if (!$profile_url) {
-                       common_user_error(_('No profile URL returned by server.'));
-                       return;
-               }
-
-               if (!Validate::uri($profile_url, array('allowed_schemes' => array('http', 'https')))) {
-                       common_user_error(_('Invalid profile URL returned by server.'));
-                       return;
-               }
-
-               if ($profile_url == common_local_url('showstream', array('nickname' => $nickname))) {
-                       common_user_error(_('You can use the local subscription!'));
-                   return;
-               }
-
-               common_debug('listenee: "'.$omb['listenee'].'"', __FILE__);
-
-               $user = User::staticGet('nickname', $omb['listenee']);
-
-               if (!$user) {
-                       common_user_error(_('User being listened to doesn\'t exist.'));
-                       return;
-               }
-
-               $other = User::staticGet('uri', $omb['listener']);
-
-               if ($other) {
-                       common_user_error(_('You can use the local subscription!'));
-                       return;
-               }
-
-               $fullname = $req->get_parameter('omb_listener_fullname');
-               $homepage = $req->get_parameter('omb_listener_homepage');
-               $bio = $req->get_parameter('omb_listener_bio');
-               $location = $req->get_parameter('omb_listener_location');
-               $avatar_url = $req->get_parameter('omb_listener_avatar');
-
-               list($newtok, $newsecret) = $this->access_token($omb);
-
-               if (!$newtok || !$newsecret) {
-                       common_user_error(_('Couldn\'t convert request tokens to access tokens.'));
-                       return;
-               }
-
-               # XXX: possible attack point; subscribe and return someone else's profile URI
-
-               $remote = Remote_profile::staticGet('uri', $omb['listener']);
-
-               if ($remote) {
-                       $exists = true;
-                       $profile = Profile::staticGet($remote->id);
-                       $orig_remote = clone($remote);
-                       $orig_profile = clone($profile);
-                       # XXX: compare current postNotice and updateProfile URLs to the ones
-                       # stored in the DB to avoid (possibly...) above attack
-               } else {
-                       $exists = false;
-                       $remote = new Remote_profile();
-                       $remote->uri = $omb['listener'];
-                       $profile = new Profile();
-               }
-
-               $profile->nickname = $nickname;
-               $profile->profileurl = $profile_url;
-
-               if ($fullname) {
-                       $profile->fullname = $fullname;
-               }
-               if ($homepage) {
-                       $profile->homepage = $homepage;
-               }
-               if ($bio) {
-                       $profile->bio = $bio;
-               }
-               if ($location) {
-                       $profile->location = $location;
-               }
-
-               if ($exists) {
-                       $profile->update($orig_profile);
-               } else {
-                       $profile->created = DB_DataObject_Cast::dateTime(); # current time
-                       $id = $profile->insert();
-                       if (!$id) {
-                               common_server_error(_('Error inserting new profile'));
-                               return;
-                       }
-                       $remote->id = $id;
-               }
-
-               if ($avatar_url) {
-                       if (!$this->add_avatar($profile, $avatar_url)) {
-                               common_server_error(_('Error inserting avatar'));
-                               return;
-                       }
-               }
-
-               $remote->postnoticeurl = $omb['post_notice_url'];
-               $remote->updateprofileurl = $omb['update_profile_url'];
-
-               if ($exists) {
-                       if (!$remote->update($orig_remote)) {
-                               common_server_error(_('Error updating remote profile'));
-                               return;
-                       }
-               } else {
-                       $remote->created = DB_DataObject_Cast::dateTime(); # current time
-                       if (!$remote->insert()) {
-                               common_server_error(_('Error inserting remote profile'));
-                               return;
-                       }
-               }
+        $profile_url = $req->get_parameter('omb_listener_profile');
+
+        if (!$profile_url) {
+            common_user_error(_('No profile URL returned by server.'));
+            return;
+        }
+
+        if (!Validate::uri($profile_url, array('allowed_schemes' => array('http', 'https')))) {
+            common_user_error(_('Invalid profile URL returned by server.'));
+            return;
+        }
+
+        if ($profile_url == common_local_url('showstream', array('nickname' => $nickname))) {
+            common_user_error(_('You can use the local subscription!'));
+            return;
+        }
+
+        common_debug('listenee: "'.$omb['listenee'].'"', __FILE__);
+
+        $user = User::staticGet('nickname', $omb['listenee']);
+
+        if (!$user) {
+            common_user_error(_('User being listened to doesn\'t exist.'));
+            return;
+        }
+
+        $other = User::staticGet('uri', $omb['listener']);
+
+        if ($other) {
+            common_user_error(_('You can use the local subscription!'));
+            return;
+        }
+
+        $fullname = $req->get_parameter('omb_listener_fullname');
+        $homepage = $req->get_parameter('omb_listener_homepage');
+        $bio = $req->get_parameter('omb_listener_bio');
+        $location = $req->get_parameter('omb_listener_location');
+        $avatar_url = $req->get_parameter('omb_listener_avatar');
+
+        list($newtok, $newsecret) = $this->access_token($omb);
+
+        if (!$newtok || !$newsecret) {
+            common_user_error(_('Couldn\'t convert request tokens to access tokens.'));
+            return;
+        }
+
+        # XXX: possible attack point; subscribe and return someone else's profile URI
+
+        $remote = Remote_profile::staticGet('uri', $omb['listener']);
+
+        if ($remote) {
+            $exists = true;
+            $profile = Profile::staticGet($remote->id);
+            $orig_remote = clone($remote);
+            $orig_profile = clone($profile);
+            # XXX: compare current postNotice and updateProfile URLs to the ones
+            # stored in the DB to avoid (possibly...) above attack
+        } else {
+            $exists = false;
+            $remote = new Remote_profile();
+            $remote->uri = $omb['listener'];
+            $profile = new Profile();
+        }
+
+        $profile->nickname = $nickname;
+        $profile->profileurl = $profile_url;
+
+        if ($fullname) {
+            $profile->fullname = $fullname;
+        }
+        if ($homepage) {
+            $profile->homepage = $homepage;
+        }
+        if ($bio) {
+            $profile->bio = $bio;
+        }
+        if ($location) {
+            $profile->location = $location;
+        }
+
+        if ($exists) {
+            $profile->update($orig_profile);
+        } else {
+            $profile->created = DB_DataObject_Cast::dateTime(); # current time
+            $id = $profile->insert();
+            if (!$id) {
+                common_server_error(_('Error inserting new profile'));
+                return;
+            }
+            $remote->id = $id;
+        }
+
+        if ($avatar_url) {
+            if (!$this->add_avatar($profile, $avatar_url)) {
+                common_server_error(_('Error inserting avatar'));
+                return;
+            }
+        }
+
+        $remote->postnoticeurl = $omb['post_notice_url'];
+        $remote->updateprofileurl = $omb['update_profile_url'];
+
+        if ($exists) {
+            if (!$remote->update($orig_remote)) {
+                common_server_error(_('Error updating remote profile'));
+                return;
+            }
+        } else {
+            $remote->created = DB_DataObject_Cast::dateTime(); # current time
+            if (!$remote->insert()) {
+                common_server_error(_('Error inserting remote profile'));
+                return;
+            }
+        }
 
         if ($user->hasBlocked($profile)) {
             $this->client_error(_('That user has blocked you from subscribing.'));
             return;
         }
 
-               $sub = new Subscription();
+        $sub = new Subscription();
 
-               $sub->subscriber = $remote->id;
-               $sub->subscribed = $user->id;
+        $sub->subscriber = $remote->id;
+        $sub->subscribed = $user->id;
 
         $sub_exists = false;
 
@@ -202,8 +202,8 @@ class FinishremotesubscribeAction extends Action {
             $sub->created = DB_DataObject_Cast::dateTime(); # current time
         }
 
-               $sub->token = $newtok;
-               $sub->secret = $newsecret;
+        $sub->token = $newtok;
+        $sub->secret = $newsecret;
 
         if ($sub_exists) {
             $result = $sub->update($orig_sub);
@@ -211,78 +211,78 @@ class FinishremotesubscribeAction extends Action {
             $result = $sub->insert();
         }
 
-               if (!$result) {
+        if (!$result) {
             common_log_db_error($sub, ($sub_exists) ? 'UPDATE' : 'INSERT', __FILE__);
-                       common_user_error(_('Couldn\'t insert new subscription.'));
-                       return;
-               }
+            common_user_error(_('Couldn\'t insert new subscription.'));
+            return;
+        }
 
-               # Notify user, if necessary
+        # Notify user, if necessary
 
-               mail_subscribe_notify_profile($user, $profile);
+        mail_subscribe_notify_profile($user, $profile);
 
-               # Clear the data
-               unset($_SESSION['oauth_authorization_request']);
+        # Clear the data
+        unset($_SESSION['oauth_authorization_request']);
 
-               # If we show subscriptions in reverse chron order, this should
-               # show up close to the top of the page
+        # If we show subscriptions in reverse chron order, this should
+        # show up close to the top of the page
 
-               common_redirect(common_local_url('subscribers', array('nickname' =>
-                                                                                                                        $user->nickname)));
-       }
+        common_redirect(common_local_url('subscribers', array('nickname' =>
+                                                             $user->nickname)));
+    }
 
-       function add_avatar($profile, $url) {
-               $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar');
-               copy($url, $temp_filename);
-               return $profile->setOriginal($temp_filename);
-       }
+    function add_avatar($profile, $url) {
+        $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar');
+        copy($url, $temp_filename);
+        return $profile->setOriginal($temp_filename);
+    }
 
-       function access_token($omb) {
+    function access_token($omb) {
 
-               common_debug('starting request for access token', __FILE__);
+        common_debug('starting request for access token', __FILE__);
 
-               $con = omb_oauth_consumer();
-               $tok = new OAuthToken($omb['token'], $omb['secret']);
+        $con = omb_oauth_consumer();
+        $tok = new OAuthToken($omb['token'], $omb['secret']);
 
-               common_debug('using request token "'.$tok.'"', __FILE__);
+        common_debug('using request token "'.$tok.'"', __FILE__);
 
-               $url = $omb['access_token_url'];
+        $url = $omb['access_token_url'];
 
-               common_debug('using access token url "'.$url.'"', __FILE__);
+        common_debug('using access token url "'.$url.'"', __FILE__);
 
-               # XXX: Is this the right thing to do? Strip off GET params and make them
-               # POST params? Seems wrong to me.
+        # XXX: Is this the right thing to do? Strip off GET params and make them
+        # POST params? Seems wrong to me.
 
-               $parsed = parse_url($url);
-               $params = array();
-               parse_str($parsed['query'], $params);
+        $parsed = parse_url($url);
+        $params = array();
+        parse_str($parsed['query'], $params);
 
-               $req = OAuthRequest::from_consumer_and_token($con, $tok, "POST", $url, $params);
+        $req = OAuthRequest::from_consumer_and_token($con, $tok, "POST", $url, $params);
 
-               $req->set_parameter('omb_version', OMB_VERSION_01);
+        $req->set_parameter('omb_version', OMB_VERSION_01);
 
-               # XXX: test to see if endpoint accepts this signature method
+        # XXX: test to see if endpoint accepts this signature method
 
-               $req->sign_request(omb_hmac_sha1(), $con, $tok);
+        $req->sign_request(omb_hmac_sha1(), $con, $tok);
 
-               # We re-use this tool's fetcher, since it's pretty good
+        # We re-use this tool's fetcher, since it's pretty good
 
-               common_debug('posting to access token url "'.$req->get_normalized_http_url().'"', __FILE__);
-               common_debug('posting request data "'.$req->to_postdata().'"', __FILE__);
+        common_debug('posting to access token url "'.$req->get_normalized_http_url().'"', __FILE__);
+        common_debug('posting request data "'.$req->to_postdata().'"', __FILE__);
 
-               $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
-               $result = $fetcher->post($req->get_normalized_http_url(),
-                                                                $req->to_postdata(),
+        $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+        $result = $fetcher->post($req->get_normalized_http_url(),
+                                 $req->to_postdata(),
                                  array('User-Agent' => 'Laconica/' . LACONICA_VERSION));
 
-               common_debug('got result: "'.print_r($result,TRUE).'"', __FILE__);
+        common_debug('got result: "'.print_r($result,TRUE).'"', __FILE__);
 
-               if ($result->status != 200) {
-                       return NULL;
-               }
+        if ($result->status != 200) {
+            return NULL;
+        }
 
-               parse_str($result->body, $return);
+        parse_str($result->body, $return);
 
-               return array($return['oauth_token'], $return['oauth_token_secret']);
-       }
+        return array($return['oauth_token'], $return['oauth_token_secret']);
+    }
 }
index 6811fc05af647808fd384934c79e20d0bfc44f57..310ba2c19fcdb2c7d2a87224f67d1177b08e2a45 100644 (file)
@@ -25,178 +25,178 @@ define('BOTH', 0);
 
 class FoafAction extends Action {
 
-       function is_readonly() {
-               return true;
-       }
-
-       function handle($args) {
-               parent::handle($args);
-
-               $nickname = $this->trimmed('nickname');
-
-               $user = User::staticGet('nickname', $nickname);
-
-               if (!$user) {
-                       common_user_error(_('No such user.'), 404);
-                       return;
-               }
-
-               $profile = $user->getProfile();
-
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'), 500);
-                       return;
-               }
-
-               header('Content-Type: application/rdf+xml');
-
-               common_start_xml();
-               common_element_start('rdf:RDF', array('xmlns:rdf' =>
-                                                                                         'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
-                                                                                         'xmlns:rdfs' =>
-                                                                                         'http://www.w3.org/2000/01/rdf-schema#',
-                                                                                         'xmlns:geo' =>
-                                                                                         'http://www.w3.org/2003/01/geo/wgs84_pos#',
-                                                                                         'xmlns' => 'http://xmlns.com/foaf/0.1/'));
-
-               # This is the document about the user
-
-               $this->show_ppd('', $user->uri);
-
-               # XXX: might not be a person
-               common_element_start('Person', array('rdf:about' =>
-                                                                                        $user->uri));
-               common_element('mbox_sha1sum', NULL, sha1('mailto:' . $user->email));
-               if ($profile->fullname) {
-                       common_element('name', NULL, $profile->fullname);
-               }
-               if ($profile->homepage) {
-                       common_element('homepage', array('rdf:resource' => $profile->homepage));
-               }
-               if ($profile->bio) {
-                       common_element('rdfs:comment', NULL, $profile->bio);
-               }
-               # XXX: more structured location data
-               if ($profile->location) {
-                       common_element_start('based_near');
-                       common_element_start('geo:SpatialThing');
-                       common_element('name', NULL, $profile->location);
-                       common_element_end('geo:SpatialThing');
-                       common_element_end('based_near');
-               }
-
-               $this->show_microblogging_account($profile, common_root_url());
-
-               $avatar = $profile->getOriginalAvatar();
-
-               if ($avatar) {
-                       common_element_start('img');
-                       common_element_start('Image', array('rdf:about' => $avatar->url));
-                       foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
-                               $scaled = $profile->getAvatar($size);
-                               if (!$scaled->original) { # sometimes the original has one of our scaled sizes
-                                       common_element_start('thumbnail');
-                                       common_element('Image', array('rdf:about' => $scaled->url));
-                                       common_element_end('thumbnail');
-                               }
-                       }
-                       common_element_end('Image');
-                       common_element_end('img');
-               }
-
-               # Get people user is subscribed to
-
-               $person = array();
-
-               $sub = new Subscription();
-               $sub->subscriber = $profile->id;
-               $sub->whereAdd('subscriber != subscribed');
-               
-               if ($sub->find()) {
-                       while ($sub->fetch()) {
-                               if ($sub->token) {
-                                       $other = Remote_profile::staticGet('id', $sub->subscribed);
-                               } else {
-                                       $other = User::staticGet('id', $sub->subscribed);
-                               }
-                               if (!$other) {
-                                       common_debug('Got a bad subscription: '.print_r($sub,TRUE));
-                                       continue;
-                               }
-                               common_element('knows', array('rdf:resource' => $other->uri));
-                               $person[$other->uri] = array(LISTENEE, $other);
-                       }
-               }
-
-               # Get people who subscribe to user
-
-               $sub = new Subscription();
-               $sub->subscribed = $profile->id;
-               $sub->whereAdd('subscriber != subscribed');
-
-               if ($sub->find()) {
-                       while ($sub->fetch()) {
-                               if ($sub->token) {
-                                       $other = Remote_profile::staticGet('id', $sub->subscriber);
-                               } else {
-                                       $other = User::staticGet('id', $sub->subscriber);
-                               }
-                               if (!$other) {
-                                       common_debug('Got a bad subscription: '.print_r($sub,TRUE));
-                                       continue;
-                               }
-                               if (array_key_exists($other->uri, $person)) {
-                                       $person[$other->uri][0] = BOTH;
-                               } else {
-                                       $person[$other->uri] = array(LISTENER, $other);
-                               }
-                       }
-               }
-
-               common_element_end('Person');
-
-               foreach ($person as $uri => $p) {
-                       $foaf_url = NULL;
-                       if ($p[1] instanceof User) {
-                               $foaf_url = common_local_url('foaf', array('nickname' => $p[1]->nickname));
-                       }
-                       $profile = Profile::staticGet($p[1]->id);
-                       common_element_start('Person', array('rdf:about' => $uri));
-                       if ($p[0] == LISTENER || $p[0] == BOTH) {
-                               common_element('knows', array('rdf:resource' => $user->uri));
-                       }
-                       $this->show_microblogging_account($profile, ($p[1] instanceof User) ?
-                                                                                         common_root_url() : NULL);
-                       if ($foaf_url) {
-                               common_element('rdfs:seeAlso', array('rdf:resource' => $foaf_url));
-                       }
-                       common_element_end('Person');
-                       if ($foaf_url) {
-                               $this->show_ppd($foaf_url, $uri);
-                       }
-               }
-
-               common_element_end('rdf:RDF');
-       }
-
-       function show_ppd($foaf_url, $person_uri) {
-               common_element_start('PersonalProfileDocument', array('rdf:about' => $foaf_url));
-               common_element('maker', array('rdf:resource' => $person_uri));
-               common_element('primaryTopic', array('rdf:resource' => $person_uri));
-               common_element_end('PersonalProfileDocument');
-       }
-
-       function show_microblogging_account($profile, $service=NULL) {
-               # Their account
-               common_element_start('holdsAccount');
-               common_element_start('OnlineAccount');
-               if ($service) {
-                       common_element('accountServiceHomepage', array('rdf:resource' =>
-                                                                                                                  $service));
-               }
-               common_element('accountName', NULL, $profile->nickname);
-               common_element('homepage', array('rdf:resource' => $profile->profileurl));
-               common_element_end('OnlineAccount');
-               common_element_end('holdsAccount');
-       }
+    function is_readonly() {
+        return true;
+    }
+
+    function handle($args) {
+        parent::handle($args);
+
+        $nickname = $this->trimmed('nickname');
+
+        $user = User::staticGet('nickname', $nickname);
+
+        if (!$user) {
+            common_user_error(_('No such user.'), 404);
+            return;
+        }
+
+        $profile = $user->getProfile();
+
+        if (!$profile) {
+            common_server_error(_('User has no profile.'), 500);
+            return;
+        }
+
+        header('Content-Type: application/rdf+xml');
+
+        common_start_xml();
+        common_element_start('rdf:RDF', array('xmlns:rdf' =>
+                                              'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
+                                              'xmlns:rdfs' =>
+                                              'http://www.w3.org/2000/01/rdf-schema#',
+                                              'xmlns:geo' =>
+                                              'http://www.w3.org/2003/01/geo/wgs84_pos#',
+                                              'xmlns' => 'http://xmlns.com/foaf/0.1/'));
+
+        # This is the document about the user
+
+        $this->show_ppd('', $user->uri);
+
+        # XXX: might not be a person
+        common_element_start('Person', array('rdf:about' =>
+                                             $user->uri));
+        common_element('mbox_sha1sum', NULL, sha1('mailto:' . $user->email));
+        if ($profile->fullname) {
+            common_element('name', NULL, $profile->fullname);
+        }
+        if ($profile->homepage) {
+            common_element('homepage', array('rdf:resource' => $profile->homepage));
+        }
+        if ($profile->bio) {
+            common_element('rdfs:comment', NULL, $profile->bio);
+        }
+        # XXX: more structured location data
+        if ($profile->location) {
+            common_element_start('based_near');
+            common_element_start('geo:SpatialThing');
+            common_element('name', NULL, $profile->location);
+            common_element_end('geo:SpatialThing');
+            common_element_end('based_near');
+        }
+
+        $this->show_microblogging_account($profile, common_root_url());
+
+        $avatar = $profile->getOriginalAvatar();
+
+        if ($avatar) {
+            common_element_start('img');
+            common_element_start('Image', array('rdf:about' => $avatar->url));
+            foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
+                $scaled = $profile->getAvatar($size);
+                if (!$scaled->original) { # sometimes the original has one of our scaled sizes
+                    common_element_start('thumbnail');
+                    common_element('Image', array('rdf:about' => $scaled->url));
+                    common_element_end('thumbnail');
+                }
+            }
+            common_element_end('Image');
+            common_element_end('img');
+        }
+
+        # Get people user is subscribed to
+
+        $person = array();
+
+        $sub = new Subscription();
+        $sub->subscriber = $profile->id;
+        $sub->whereAdd('subscriber != subscribed');
+        
+        if ($sub->find()) {
+            while ($sub->fetch()) {
+                if ($sub->token) {
+                    $other = Remote_profile::staticGet('id', $sub->subscribed);
+                } else {
+                    $other = User::staticGet('id', $sub->subscribed);
+                }
+                if (!$other) {
+                    common_debug('Got a bad subscription: '.print_r($sub,TRUE));
+                    continue;
+                }
+                common_element('knows', array('rdf:resource' => $other->uri));
+                $person[$other->uri] = array(LISTENEE, $other);
+            }
+        }
+
+        # Get people who subscribe to user
+
+        $sub = new Subscription();
+        $sub->subscribed = $profile->id;
+        $sub->whereAdd('subscriber != subscribed');
+
+        if ($sub->find()) {
+            while ($sub->fetch()) {
+                if ($sub->token) {
+                    $other = Remote_profile::staticGet('id', $sub->subscriber);
+                } else {
+                    $other = User::staticGet('id', $sub->subscriber);
+                }
+                if (!$other) {
+                    common_debug('Got a bad subscription: '.print_r($sub,TRUE));
+                    continue;
+                }
+                if (array_key_exists($other->uri, $person)) {
+                    $person[$other->uri][0] = BOTH;
+                } else {
+                    $person[$other->uri] = array(LISTENER, $other);
+                }
+            }
+        }
+
+        common_element_end('Person');
+
+        foreach ($person as $uri => $p) {
+            $foaf_url = NULL;
+            if ($p[1] instanceof User) {
+                $foaf_url = common_local_url('foaf', array('nickname' => $p[1]->nickname));
+            }
+            $profile = Profile::staticGet($p[1]->id);
+            common_element_start('Person', array('rdf:about' => $uri));
+            if ($p[0] == LISTENER || $p[0] == BOTH) {
+                common_element('knows', array('rdf:resource' => $user->uri));
+            }
+            $this->show_microblogging_account($profile, ($p[1] instanceof User) ?
+                                              common_root_url() : NULL);
+            if ($foaf_url) {
+                common_element('rdfs:seeAlso', array('rdf:resource' => $foaf_url));
+            }
+            common_element_end('Person');
+            if ($foaf_url) {
+                $this->show_ppd($foaf_url, $uri);
+            }
+        }
+
+        common_element_end('rdf:RDF');
+    }
+
+    function show_ppd($foaf_url, $person_uri) {
+        common_element_start('PersonalProfileDocument', array('rdf:about' => $foaf_url));
+        common_element('maker', array('rdf:resource' => $person_uri));
+        common_element('primaryTopic', array('rdf:resource' => $person_uri));
+        common_element_end('PersonalProfileDocument');
+    }
+
+    function show_microblogging_account($profile, $service=NULL) {
+        # Their account
+        common_element_start('holdsAccount');
+        common_element_start('OnlineAccount');
+        if ($service) {
+            common_element('accountServiceHomepage', array('rdf:resource' =>
+                                                           $service));
+        }
+        common_element('accountName', NULL, $profile->nickname);
+        common_element('homepage', array('rdf:resource' => $profile->profileurl));
+        common_element_end('OnlineAccount');
+        common_element_end('holdsAccount');
+    }
 }
index 0aa7631dc2c2fc59314ce269aad42cf65a4985cb..d0c47f7fdd6c49e2534c9c213e64beb2dd271920 100644 (file)
@@ -24,247 +24,247 @@ require_once(INSTALLDIR.'/lib/jabber.php');
 
 class ImsettingsAction extends SettingsAction {
 
-       function get_instructions() {
-               return _('You can send and receive notices through Jabber/GTalk [instant messages](%%doc.im%%). Configure your address and settings below.');
-       }
-
-       function show_form($msg=NULL, $success=false) {
-               $user = common_current_user();
-               $this->form_header(_('IM Settings'), $msg, $success);
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'imsettings',
-                                                                                  'action' =>
-                                                                                  common_local_url('imsettings')));
-               common_hidden('token', common_session_token());
-
-               common_element('h2', NULL, _('Address'));
-
-               if ($user->jabber) {
-                       common_element_start('p');
-                       common_element('span', 'address confirmed', $user->jabber);
-                       common_element('span', 'input_instructions',
-                                      _('Current confirmed Jabber/GTalk address.'));
-                       common_hidden('jabber', $user->jabber);
-                       common_element_end('p');
-                       common_submit('remove', _('Remove'));
-               } else {
-                       $confirm = $this->get_confirmation();
-                       if ($confirm) {
-                               common_element_start('p');
-                               common_element('span', 'address unconfirmed', $confirm->address);
-                               common_element('span', 'input_instructions',
-                                             sprintf(_('Awaiting confirmation on this address. Check your Jabber/GTalk account for a message with further instructions. (Did you add %s to your buddy list?)'), jabber_daemon_address()));
-                               common_hidden('jabber', $confirm->address);
-                               common_element_end('p');
-                               common_submit('cancel', _('Cancel'));
-                       } else {
-                               common_input('jabber', _('IM Address'),
-                                                       ($this->arg('jabber')) ? $this->arg('jabber') : NULL,
-                                                sprintf(_('Jabber or GTalk address, like "UserName@example.org". First, make sure to add %s to your buddy list in your IM client or on GTalk.'), jabber_daemon_address()));
-                               common_submit('add', _('Add'));
-                       }
-               }
-
-               common_element('h2', NULL, _('Preferences'));
-
-               common_checkbox('jabbernotify',
-                               _('Send me notices through Jabber/GTalk.'),
-                               $user->jabbernotify);
-               common_checkbox('updatefrompresence',
-                               _('Post a notice when my Jabber/GTalk status changes.'),
-                               $user->updatefrompresence);
-               common_checkbox('jabberreplies',
-                               _('Send me replies through Jabber/GTalk from people I\'m not subscribed to.'),
-                               $user->jabberreplies);
-               common_checkbox('jabbermicroid',
-                               _('Publish a MicroID for my Jabber/GTalk address.'),
-                               $user->jabbermicroid);
-               common_submit('save', _('Save'));
-
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function get_confirmation() {
-               $user = common_current_user();
-               $confirm = new Confirm_address();
-               $confirm->user_id = $user->id;
-               $confirm->address_type = 'jabber';
-               if ($confirm->find(TRUE)) {
-                       return $confirm;
-               } else {
-                       return NULL;
-               }
-       }
-
-       function handle_post() {
-
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               if ($this->arg('save')) {
-                       $this->save_preferences();
-               } else if ($this->arg('add')) {
-                       $this->add_address();
-               } else if ($this->arg('cancel')) {
-                       $this->cancel_confirmation();
-               } else if ($this->arg('remove')) {
-                       $this->remove_address();
-               } else {
-                       $this->show_form(_('Unexpected form submission.'));
-               }
-       }
-
-       function save_preferences() {
-
-               $jabbernotify = $this->boolean('jabbernotify');
-               $updatefrompresence = $this->boolean('updatefrompresence');
-               $jabberreplies = $this->boolean('jabberreplies');
-               $jabbermicroid = $this->boolean('jabbermicroid');
-
-               $user = common_current_user();
-
-               assert(!is_null($user)); # should already be checked
-
-               $user->query('BEGIN');
-
-               $original = clone($user);
-
-               $user->jabbernotify = $jabbernotify;
-               $user->updatefrompresence = $updatefrompresence;
-               $user->jabberreplies = $jabberreplies;
-               $user->jabbermicroid = $jabbermicroid;
-
-               $result = $user->update($original);
-
-               if ($result === FALSE) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t update user.'));
-                       return;
-               }
-
-               $user->query('COMMIT');
-
-               $this->show_form(_('Preferences saved.'), true);
-       }
-
-       function add_address() {
-
-               $user = common_current_user();
-
-               $jabber = $this->trimmed('jabber');
-
-               # Some validation
-
-               if (!$jabber) {
-                       $this->show_form(_('No Jabber ID.'));
-                       return;
-               }
-
-               $jabber = jabber_normalize_jid($jabber);
-
-               if (!$jabber) {
-                   $this->show_form(_('Cannot normalize that Jabber ID'));
-                   return;
-               }
-               if (!jabber_valid_base_jid($jabber)) {
-                   $this->show_form(_('Not a valid Jabber ID'));
-                   return;
-               } else if ($user->jabber == $jabber) {
-                   $this->show_form(_('That is already your Jabber ID.'));
-                   return;
-               } else if ($this->jabber_exists($jabber)) {
-                   $this->show_form(_('Jabber ID already belongs to another user.'));
-                   return;
-               }
-
-               $confirm = new Confirm_address();
-               $confirm->address = $jabber;
-               $confirm->address_type = 'jabber';
-               $confirm->user_id = $user->id;
-               $confirm->code = common_confirmation_code(64);
-
-               $result = $confirm->insert();
-
-               if ($result === FALSE) {
-                       common_log_db_error($confirm, 'INSERT', __FILE__);
-                       common_server_error(_('Couldn\'t insert confirmation code.'));
-                       return;
-               }
-
-               if (!common_config('queue', 'enabled')) {
-                       jabber_confirm_address($confirm->code,
-                                                                  $user->nickname,
-                                                                  $jabber);
-               }
-
-               $msg = sprintf(_('A confirmation code was sent to the IM address you added. You must approve %s for sending messages to you.'), jabber_daemon_address());
-
-               $this->show_form($msg, TRUE);
-       }
-
-       function cancel_confirmation() {
-               $jabber = $this->arg('jabber');
-               $confirm = $this->get_confirmation();
-               if (!$confirm) {
-                       $this->show_form(_('No pending confirmation to cancel.'));
-                       return;
-               }
-               if ($confirm->address != $jabber) {
-                       $this->show_form(_('That is the wrong IM address.'));
-                       return;
-               }
+    function get_instructions() {
+        return _('You can send and receive notices through Jabber/GTalk [instant messages](%%doc.im%%). Configure your address and settings below.');
+    }
+
+    function show_form($msg=NULL, $success=false) {
+        $user = common_current_user();
+        $this->form_header(_('IM Settings'), $msg, $success);
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'imsettings',
+                                           'action' =>
+                                           common_local_url('imsettings')));
+        common_hidden('token', common_session_token());
+
+        common_element('h2', NULL, _('Address'));
+
+        if ($user->jabber) {
+            common_element_start('p');
+            common_element('span', 'address confirmed', $user->jabber);
+            common_element('span', 'input_instructions',
+                           _('Current confirmed Jabber/GTalk address.'));
+            common_hidden('jabber', $user->jabber);
+            common_element_end('p');
+            common_submit('remove', _('Remove'));
+        } else {
+            $confirm = $this->get_confirmation();
+            if ($confirm) {
+                common_element_start('p');
+                common_element('span', 'address unconfirmed', $confirm->address);
+                common_element('span', 'input_instructions',
+                                sprintf(_('Awaiting confirmation on this address. Check your Jabber/GTalk account for a message with further instructions. (Did you add %s to your buddy list?)'), jabber_daemon_address()));
+                common_hidden('jabber', $confirm->address);
+                common_element_end('p');
+                common_submit('cancel', _('Cancel'));
+            } else {
+                common_input('jabber', _('IM Address'),
+                             ($this->arg('jabber')) ? $this->arg('jabber') : NULL,
+                         sprintf(_('Jabber or GTalk address, like "UserName@example.org". First, make sure to add %s to your buddy list in your IM client or on GTalk.'), jabber_daemon_address()));
+                common_submit('add', _('Add'));
+            }
+        }
+
+        common_element('h2', NULL, _('Preferences'));
+
+        common_checkbox('jabbernotify',
+                        _('Send me notices through Jabber/GTalk.'),
+                        $user->jabbernotify);
+        common_checkbox('updatefrompresence',
+                        _('Post a notice when my Jabber/GTalk status changes.'),
+                        $user->updatefrompresence);
+        common_checkbox('jabberreplies',
+                        _('Send me replies through Jabber/GTalk from people I\'m not subscribed to.'),
+                        $user->jabberreplies);
+        common_checkbox('jabbermicroid',
+                        _('Publish a MicroID for my Jabber/GTalk address.'),
+                        $user->jabbermicroid);
+        common_submit('save', _('Save'));
+
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function get_confirmation() {
+        $user = common_current_user();
+        $confirm = new Confirm_address();
+        $confirm->user_id = $user->id;
+        $confirm->address_type = 'jabber';
+        if ($confirm->find(TRUE)) {
+            return $confirm;
+        } else {
+            return NULL;
+        }
+    }
+
+    function handle_post() {
+
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        if ($this->arg('save')) {
+            $this->save_preferences();
+        } else if ($this->arg('add')) {
+            $this->add_address();
+        } else if ($this->arg('cancel')) {
+            $this->cancel_confirmation();
+        } else if ($this->arg('remove')) {
+            $this->remove_address();
+        } else {
+            $this->show_form(_('Unexpected form submission.'));
+        }
+    }
+
+    function save_preferences() {
+
+        $jabbernotify = $this->boolean('jabbernotify');
+        $updatefrompresence = $this->boolean('updatefrompresence');
+        $jabberreplies = $this->boolean('jabberreplies');
+        $jabbermicroid = $this->boolean('jabbermicroid');
+
+        $user = common_current_user();
+
+        assert(!is_null($user)); # should already be checked
+
+        $user->query('BEGIN');
+
+        $original = clone($user);
+
+        $user->jabbernotify = $jabbernotify;
+        $user->updatefrompresence = $updatefrompresence;
+        $user->jabberreplies = $jabberreplies;
+        $user->jabbermicroid = $jabbermicroid;
+
+        $result = $user->update($original);
+
+        if ($result === FALSE) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t update user.'));
+            return;
+        }
+
+        $user->query('COMMIT');
+
+        $this->show_form(_('Preferences saved.'), true);
+    }
+
+    function add_address() {
+
+        $user = common_current_user();
+
+        $jabber = $this->trimmed('jabber');
+
+        # Some validation
+
+        if (!$jabber) {
+            $this->show_form(_('No Jabber ID.'));
+            return;
+        }
+
+        $jabber = jabber_normalize_jid($jabber);
+
+        if (!$jabber) {
+            $this->show_form(_('Cannot normalize that Jabber ID'));
+            return;
+        }
+        if (!jabber_valid_base_jid($jabber)) {
+            $this->show_form(_('Not a valid Jabber ID'));
+            return;
+        } else if ($user->jabber == $jabber) {
+            $this->show_form(_('That is already your Jabber ID.'));
+            return;
+        } else if ($this->jabber_exists($jabber)) {
+            $this->show_form(_('Jabber ID already belongs to another user.'));
+            return;
+        }
+
+          $confirm = new Confirm_address();
+           $confirm->address = $jabber;
+           $confirm->address_type = 'jabber';
+           $confirm->user_id = $user->id;
+           $confirm->code = common_confirmation_code(64);
+
+        $result = $confirm->insert();
+
+        if ($result === FALSE) {
+            common_log_db_error($confirm, 'INSERT', __FILE__);
+            common_server_error(_('Couldn\'t insert confirmation code.'));
+            return;
+        }
+
+        if (!common_config('queue', 'enabled')) {
+            jabber_confirm_address($confirm->code,
+                                   $user->nickname,
+                                   $jabber);
+        }
+
+        $msg = sprintf(_('A confirmation code was sent to the IM address you added. You must approve %s for sending messages to you.'), jabber_daemon_address());
+
+        $this->show_form($msg, TRUE);
+    }
+
+    function cancel_confirmation() {
+        $jabber = $this->arg('jabber');
+        $confirm = $this->get_confirmation();
+        if (!$confirm) {
+            $this->show_form(_('No pending confirmation to cancel.'));
+            return;
+        }
+        if ($confirm->address != $jabber) {
+            $this->show_form(_('That is the wrong IM address.'));
+            return;
+        }
 
         $result = $confirm->delete();
 
         if (!$result) {
-                       common_log_db_error($confirm, 'DELETE', __FILE__);
+            common_log_db_error($confirm, 'DELETE', __FILE__);
             $this->server_error(_('Couldn\'t delete email confirmation.'));
             return;
         }
 
         $this->show_form(_('Confirmation cancelled.'), TRUE);
-       }
-
-       function remove_address() {
-
-               $user = common_current_user();
-               $jabber = $this->arg('jabber');
-
-               # Maybe an old tab open...?
-
-               if ($user->jabber != $jabber) {
-                   $this->show_form(_('That is not your Jabber ID.'));
-                   return;
-               }
-
-               $user->query('BEGIN');
-               $original = clone($user);
-               $user->jabber = NULL;
-               $result = $user->updateKeys($original);
-               if (!$result) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t update user.'));
-                       return;
-               }
-               $user->query('COMMIT');
-
-               # XXX: unsubscribe to the old address
-
-               $this->show_form(_('The address was removed.'), TRUE);
-       }
-
-       function jabber_exists($jabber) {
-               $user = common_current_user();
-               $other = User::staticGet('jabber', $jabber);
-               if (!$other) {
-                       return false;
-               } else {
-                       return $other->id != $user->id;
-               }
-       }
+    }
+
+    function remove_address() {
+
+        $user = common_current_user();
+        $jabber = $this->arg('jabber');
+
+        # Maybe an old tab open...?
+
+        if ($user->jabber != $jabber) {
+            $this->show_form(_('That is not your Jabber ID.'));
+            return;
+        }
+
+        $user->query('BEGIN');
+        $original = clone($user);
+        $user->jabber = NULL;
+        $result = $user->updateKeys($original);
+        if (!$result) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t update user.'));
+            return;
+        }
+        $user->query('COMMIT');
+
+        # XXX: unsubscribe to the old address
+
+        $this->show_form(_('The address was removed.'), TRUE);
+    }
+
+    function jabber_exists($jabber) {
+        $user = common_current_user();
+        $other = User::staticGet('jabber', $jabber);
+        if (!$other) {
+            return false;
+        } else {
+            return $other->id != $user->id;
+        }
+    }
 }
index c7d92085c163faff7999baba8f08186e6ae79e35..e5cc6ad0191c973403355fc20554c49680d64f5a 100644 (file)
@@ -21,179 +21,179 @@ if (!defined('LACONICA')) { exit(1); }
 
 class InviteAction extends Action {
 
-       function is_readonly() {
-               return false;
-       }
+    function is_readonly() {
+        return false;
+    }
 
     function handle($args) {
         parent::handle($args);
-               if (!common_logged_in()) {
-                       $this->client_error(sprintf(_('You must be logged in to invite other users to use %s'),
-                                                                               common_config('site', 'name')));
-                       return;
-               } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $this->send_invitations();
-               } else {
-                       $this->show_form();
-               }
-       }
-
-       function send_invitations() {
-
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               $user = common_current_user();
-               $profile = $user->getProfile();
-
-               $bestname = $profile->getBestName();
-               $sitename = common_config('site', 'name');
-               $personal = $this->trimmed('personal');
-
-               $addresses = explode("\n", $this->trimmed('addresses'));
-
-               foreach ($addresses as $email) {
-                       $email = trim($email);
-                       if (!Validate::email($email, true)) {
-                               $this->show_form(sprintf(_('Invalid email address: %s'), $email));
-                               return;
-                       }
-               }
-
-               $already = array();
-               $subbed = array();
-
-               foreach ($addresses as $email) {
-                       $email = common_canonical_email($email);
-                       $other = User::staticGet('email', $email);
-                       if ($other) {
-                               if ($user->isSubscribed($other)) {
-                                       $already[] = $other;
-                               } else {
-                                       subs_subscribe_to($user, $other);
-                                       $subbed[] = $other;
-                               }
-                       } else {
-                               $sent[] = $email;
-                               $this->send_invitation($email, $user, $personal);
-                       }
-               }
-
-               common_show_header(_('Invitation(s) sent'));
-               if ($already) {
-                       common_element('p', NULL, _('You are already subscribed to these users:'));
-                       common_element_start('ul');
-                       foreach ($already as $other) {
-                               common_element('li', NULL, sprintf(_('%s (%s)'), $other->nickname, $other->email));
-                       }
-                       common_element_end('ul');
-               }
-               if ($subbed) {
-                       common_element('p', NULL, _('These people are already users and you were automatically subscribed to them:'));
-                       common_element_start('ul');
-                       foreach ($subbed as $other) {
-                               common_element('li', NULL, sprintf(_('%s (%s)'), $other->nickname, $other->email));
-                       }
-                       common_element_end('ul');
-               }
-               if ($sent) {
-                       common_element('p', NULL, _('Invitation(s) sent to the following people:'));
-                       common_element_start('ul');
-                       foreach ($sent as $other) {
-                               common_element('li', NULL, $other);
-                       }
-                       common_element_end('ul');
-                       common_element('p', NULL, _('You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!'));
-               }
-               common_show_footer();
-       }
-
-       function show_top($error=NULL) {
-               if ($error) {
-                       common_element('p', 'error', $error);
-               } else {
-                       common_element_start('div', 'instructions');
-                       common_element('p', NULL,
-                                                  _('Use this form to invite your friends and colleagues to use this service.'));
-                       common_element_end('div');
-               }
-       }
-
-       function show_form($error=NULL) {
-
-               global $config;
-
-               common_show_header(_('Invite new users'), NULL, $error, array($this, 'show_top'));
-
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'invite',
-                                                                                  'action' => common_local_url('invite')));
-               common_hidden('token', common_session_token());
-
-               common_textarea('addresses', _('Email addresses'),
-                                               $this->trimmed('addresses'),
-                                               _('Addresses of friends to invite (one per line)'));
-
-               common_textarea('personal', _('Personal message'),
-                                               $this->trimmed('personal'),
-                                               _('Optionally add a personal message to the invitation.'));
-
-               common_submit('send', _('Send'));
-
-               common_element_end('form');
-
-               common_show_footer();
-       }
-
-       function send_invitation($email, $user, $personal) {
-
-               $profile = $user->getProfile();
-               $bestname = $profile->getBestName();
-
-               $sitename = common_config('site', 'name');
-
-               $invite = new Invitation();
-
-               $invite->address = $email;
-               $invite->address_type = 'email';
-               $invite->code = common_confirmation_code(128);
-               $invite->user_id = $user->id;
-               $invite->created = common_sql_now();
-
-               if (!$invite->insert()) {
-                       common_log_db_error($invite, 'INSERT', __FILE__);
-                       return false;
-               }
-
-               $recipients = array($email);
-
-               $headers['From'] = mail_notify_from();
-               $headers['To'] = $email;
-               $headers['Subject'] = sprintf(_('%1$s has invited you to join them on %2$s'), $bestname, $sitename);
-
-               $body = sprintf(_("%1\$s has invited you to join them on %2\$s (%3\$s).\n\n".
-                                                 "%2\$s is a micro-blogging service that lets you keep up-to-date with people you know and people who interest you.\n\n".
-                                                 "You can also share news about yourself, your thoughts, or your life online with people who know about you. ".
-                                                 "It's also great for meeting new people who share your interests.\n\n".
-                                                 "%1\$s said:\n\n%4\$s\n\n".
-                                                 "You can see %1\$s's profile page on %2\$s here:\n\n".
-                                                 "%5\$s\n\n".
-                                                 "If you'd like to try the service, click on the link below to accept the invitation.\n\n".
-                                                 "%6\$s\n\n".
-                                                 "If not, you can ignore this message. Thanks for your patience and your time.\n\n".
-                                                 "Sincerely, %2\$s\n"),
-                                               $bestname,
-                                               $sitename,
-                                               common_root_url(),
-                                               $personal,
-                                               common_local_url('showstream', array('nickname' => $user->nickname)),
-                                               common_local_url('register', array('code' => $invite->code)));
-
-               mail_send($recipients, $headers, $body);
-       }
+        if (!common_logged_in()) {
+            $this->client_error(sprintf(_('You must be logged in to invite other users to use %s'),
+                                        common_config('site', 'name')));
+            return;
+        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->send_invitations();
+        } else {
+            $this->show_form();
+        }
+    }
+
+    function send_invitations() {
+
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        $user = common_current_user();
+        $profile = $user->getProfile();
+
+        $bestname = $profile->getBestName();
+        $sitename = common_config('site', 'name');
+        $personal = $this->trimmed('personal');
+
+        $addresses = explode("\n", $this->trimmed('addresses'));
+
+        foreach ($addresses as $email) {
+            $email = trim($email);
+            if (!Validate::email($email, true)) {
+                $this->show_form(sprintf(_('Invalid email address: %s'), $email));
+                return;
+            }
+        }
+
+        $already = array();
+        $subbed = array();
+
+        foreach ($addresses as $email) {
+            $email = common_canonical_email($email);
+            $other = User::staticGet('email', $email);
+            if ($other) {
+                if ($user->isSubscribed($other)) {
+                    $already[] = $other;
+                } else {
+                    subs_subscribe_to($user, $other);
+                    $subbed[] = $other;
+                }
+            } else {
+                $sent[] = $email;
+                $this->send_invitation($email, $user, $personal);
+            }
+        }
+
+        common_show_header(_('Invitation(s) sent'));
+        if ($already) {
+            common_element('p', NULL, _('You are already subscribed to these users:'));
+            common_element_start('ul');
+            foreach ($already as $other) {
+                common_element('li', NULL, sprintf(_('%s (%s)'), $other->nickname, $other->email));
+            }
+            common_element_end('ul');
+        }
+        if ($subbed) {
+            common_element('p', NULL, _('These people are already users and you were automatically subscribed to them:'));
+            common_element_start('ul');
+            foreach ($subbed as $other) {
+                common_element('li', NULL, sprintf(_('%s (%s)'), $other->nickname, $other->email));
+            }
+            common_element_end('ul');
+        }
+        if ($sent) {
+            common_element('p', NULL, _('Invitation(s) sent to the following people:'));
+            common_element_start('ul');
+            foreach ($sent as $other) {
+                common_element('li', NULL, $other);
+            }
+            common_element_end('ul');
+            common_element('p', NULL, _('You will be notified when your invitees accept the invitation and register on the site. Thanks for growing the community!'));
+        }
+        common_show_footer();
+    }
+
+    function show_top($error=NULL) {
+        if ($error) {
+            common_element('p', 'error', $error);
+        } else {
+            common_element_start('div', 'instructions');
+            common_element('p', NULL,
+                           _('Use this form to invite your friends and colleagues to use this service.'));
+            common_element_end('div');
+        }
+    }
+
+    function show_form($error=NULL) {
+
+        global $config;
+
+        common_show_header(_('Invite new users'), NULL, $error, array($this, 'show_top'));
+
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'invite',
+                                           'action' => common_local_url('invite')));
+        common_hidden('token', common_session_token());
+
+        common_textarea('addresses', _('Email addresses'),
+                        $this->trimmed('addresses'),
+                        _('Addresses of friends to invite (one per line)'));
+
+        common_textarea('personal', _('Personal message'),
+                        $this->trimmed('personal'),
+                        _('Optionally add a personal message to the invitation.'));
+
+        common_submit('send', _('Send'));
+
+        common_element_end('form');
+
+        common_show_footer();
+    }
+
+    function send_invitation($email, $user, $personal) {
+
+        $profile = $user->getProfile();
+        $bestname = $profile->getBestName();
+
+        $sitename = common_config('site', 'name');
+
+        $invite = new Invitation();
+
+        $invite->address = $email;
+        $invite->address_type = 'email';
+        $invite->code = common_confirmation_code(128);
+        $invite->user_id = $user->id;
+        $invite->created = common_sql_now();
+
+        if (!$invite->insert()) {
+            common_log_db_error($invite, 'INSERT', __FILE__);
+            return false;
+        }
+
+        $recipients = array($email);
+
+        $headers['From'] = mail_notify_from();
+        $headers['To'] = $email;
+        $headers['Subject'] = sprintf(_('%1$s has invited you to join them on %2$s'), $bestname, $sitename);
+
+        $body = sprintf(_("%1\$s has invited you to join them on %2\$s (%3\$s).\n\n".
+                          "%2\$s is a micro-blogging service that lets you keep up-to-date with people you know and people who interest you.\n\n".
+                          "You can also share news about yourself, your thoughts, or your life online with people who know about you. ".
+                          "It's also great for meeting new people who share your interests.\n\n".
+                          "%1\$s said:\n\n%4\$s\n\n".
+                          "You can see %1\$s's profile page on %2\$s here:\n\n".
+                          "%5\$s\n\n".
+                          "If you'd like to try the service, click on the link below to accept the invitation.\n\n".
+                          "%6\$s\n\n".
+                          "If not, you can ignore this message. Thanks for your patience and your time.\n\n".
+                          "Sincerely, %2\$s\n"),
+                        $bestname,
+                        $sitename,
+                        common_root_url(),
+                        $personal,
+                        common_local_url('showstream', array('nickname' => $user->nickname)),
+                        common_local_url('register', array('code' => $invite->code)));
+
+        mail_send($recipients, $headers, $body);
+    }
 
 }
index ccec9cf8a787818e20cb518f64b44bfd31b30336..5e4d451491d44fcb935f6017450137f978fc4193 100644 (file)
@@ -21,132 +21,132 @@ if (!defined('LACONICA')) { exit(1); }
 
 class LoginAction extends Action {
 
-       function is_readonly() {
-               return true;
-       }
+    function is_readonly() {
+        return true;
+    }
 
-       function handle($args) {
-               parent::handle($args);
-               if (common_is_real_login()) {
-                       common_user_error(_('Already logged in.'));
-               } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $this->check_login();
-               } else {
-                       $this->show_form();
-               }
-       }
+    function handle($args) {
+        parent::handle($args);
+        if (common_is_real_login()) {
+            common_user_error(_('Already logged in.'));
+        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->check_login();
+        } else {
+            $this->show_form();
+        }
+    }
 
-       function check_login() {
-               # XXX: login throttle
+    function check_login() {
+        # XXX: login throttle
 
-               # CSRF protection - token set in common_notice_form()
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        # CSRF protection - token set in common_notice_form()
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
-               $nickname = common_canonical_nickname($this->trimmed('nickname'));
-               $password = $this->arg('password');
-               if (common_check_user($nickname, $password)) {
-                       # success!
-                       if (!common_set_user($nickname)) {
-                               common_server_error(_('Error setting user.'));
-                               return;
-                       }
-                       common_real_login(true);
-                       if ($this->boolean('rememberme')) {
-                               common_debug('Adding rememberme cookie for ' . $nickname);
-                               common_rememberme();
-                       }
-                       # success!
-                       $url = common_get_returnto();
-                       if ($url) {
-                               # We don't have to return to it again
-                               common_set_returnto(NULL);
-                       } else {
-                               $url = common_local_url('all',
-                                                                               array('nickname' =>
-                                                                                         $nickname));
-                       }
-                       common_redirect($url);
-               } else {
-                       $this->show_form(_('Incorrect username or password.'));
-                       return;
-               }
+        $nickname = common_canonical_nickname($this->trimmed('nickname'));
+        $password = $this->arg('password');
+        if (common_check_user($nickname, $password)) {
+            # success!
+            if (!common_set_user($nickname)) {
+                common_server_error(_('Error setting user.'));
+                return;
+            }
+            common_real_login(true);
+            if ($this->boolean('rememberme')) {
+                common_debug('Adding rememberme cookie for ' . $nickname);
+                common_rememberme();
+            }
+            # success!
+            $url = common_get_returnto();
+            if ($url) {
+                # We don't have to return to it again
+                common_set_returnto(NULL);
+            } else {
+                $url = common_local_url('all',
+                                        array('nickname' =>
+                                              $nickname));
+            }
+            common_redirect($url);
+        } else {
+            $this->show_form(_('Incorrect username or password.'));
+            return;
+        }
 
-               # success!
-               if (!common_set_user($user)) {
-                       common_server_error(_('Error setting user.'));
-                       return;
-               }
+        # success!
+        if (!common_set_user($user)) {
+            common_server_error(_('Error setting user.'));
+            return;
+        }
 
-               common_real_login(true);
+        common_real_login(true);
 
-               if ($this->boolean('rememberme')) {
-                       common_debug('Adding rememberme cookie for ' . $nickname);
-                       common_rememberme($user);
-               }
-               # success!
-               $url = common_get_returnto();
-               if ($url) {
-                       # We don't have to return to it again
-                       common_set_returnto(NULL);
-               } else {
-                       $url = common_local_url('all',
-                                                                       array('nickname' =>
-                                                                                 $nickname));
-               }
-               common_redirect($url);
-       }
+        if ($this->boolean('rememberme')) {
+            common_debug('Adding rememberme cookie for ' . $nickname);
+            common_rememberme($user);
+        }
+        # success!
+        $url = common_get_returnto();
+        if ($url) {
+            # We don't have to return to it again
+            common_set_returnto(NULL);
+        } else {
+            $url = common_local_url('all',
+                                    array('nickname' =>
+                                          $nickname));
+        }
+        common_redirect($url);
+    }
 
-       function show_form($error=NULL) {
-               common_show_header(_('Login'), NULL, $error, array($this, 'show_top'));
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'login',
-                                                                                  'action' => common_local_url('login')));
-               common_input('nickname', _('Nickname'));
-               common_password('password', _('Password'));
-               common_checkbox('rememberme', _('Remember me'), false,
-                               _('Automatically login in the future; ' .
-                                  'not for shared computers!'));
-               common_submit('submit', _('Login'));
-               common_hidden('token', common_session_token());
-               common_element_end('form');
-               common_element_start('p');
-               common_element('a', array('href' => common_local_url('recoverpassword')),
-                                          _('Lost or forgotten password?'));
-               common_element_end('p');
-               common_show_footer();
-       }
+    function show_form($error=NULL) {
+        common_show_header(_('Login'), NULL, $error, array($this, 'show_top'));
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'login',
+                                           'action' => common_local_url('login')));
+        common_input('nickname', _('Nickname'));
+        common_password('password', _('Password'));
+        common_checkbox('rememberme', _('Remember me'), false,
+                        _('Automatically login in the future; ' .
+                           'not for shared computers!'));
+        common_submit('submit', _('Login'));
+        common_hidden('token', common_session_token());
+        common_element_end('form');
+        common_element_start('p');
+        common_element('a', array('href' => common_local_url('recoverpassword')),
+                       _('Lost or forgotten password?'));
+        common_element_end('p');
+        common_show_footer();
+    }
 
-       function get_instructions() {
-               if (common_logged_in() &&
-                       !common_is_real_login() &&
-                       common_get_returnto())
-               {
-                       # rememberme logins have to reauthenticate before
-                       # changing any profile settings (cookie-stealing protection)
-                       return _('For security reasons, please re-enter your ' .
-                                        'user name and password ' .
-                                        'before changing your settings.');
-               } else {
-                       return _('Login with your username and password. ' .
-                                        'Don\'t have a username yet? ' .
-                                        '[Register](%%action.register%%) a new account, or ' .
-                                        'try [OpenID](%%action.openidlogin%%). ');
-               }
-       }
+    function get_instructions() {
+        if (common_logged_in() &&
+            !common_is_real_login() &&
+            common_get_returnto())
+        {
+            # rememberme logins have to reauthenticate before
+            # changing any profile settings (cookie-stealing protection)
+            return _('For security reasons, please re-enter your ' .
+                     'user name and password ' .
+                     'before changing your settings.');
+        } else {
+            return _('Login with your username and password. ' .
+                     'Don\'t have a username yet? ' .
+                     '[Register](%%action.register%%) a new account, or ' .
+                     'try [OpenID](%%action.openidlogin%%). ');
+        }
+    }
 
-       function show_top($error=NULL) {
-               if ($error) {
-                       common_element('p', 'error', $error);
-               } else {
-                       $instr = $this->get_instructions();
-                       $output = common_markup_to_html($instr);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-               }
-       }
+    function show_top($error=NULL) {
+        if ($error) {
+            common_element('p', 'error', $error);
+        } else {
+            $instr = $this->get_instructions();
+            $output = common_markup_to_html($instr);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('div');
+        }
+    }
 }
index f00fa0ba7f2f39298e77cdd365099b3d53cb8954..5f7b9d502db6f5b50e329afb7589c23ef8517252 100644 (file)
@@ -22,20 +22,20 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/lib/openid.php');
 
 class LogoutAction extends Action {
-       
-       function is_readonly() {
-               return true;
-       }
-       
-       function handle($args) {
-               parent::handle($args);
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-               } else {
-                       common_set_user(NULL);
-                       common_real_login(false); # not logged in
-                       common_forgetme(); # don't log back in!
-                       common_redirect(common_local_url('public'));
-               }
-       }
+    
+    function is_readonly() {
+        return true;
+    }
+    
+    function handle($args) {
+        parent::handle($args);
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+        } else {
+            common_set_user(NULL);
+            common_real_login(false); # not logged in
+            common_forgetme(); # don't log back in!
+            common_redirect(common_local_url('public'));
+        }
+    }
 }
index 104467d2979c33fec91ae1a71301334dc522995d..ced4b0d1e58c31d8a7dbc885a140fcb73cff097c 100644 (file)
@@ -21,26 +21,26 @@ if (!defined('LACONICA')) { exit(1); }
 
 class MicrosummaryAction extends Action {
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               $nickname = common_canonical_nickname($this->arg('nickname'));
-               $user = User::staticGet('nickname', $nickname);
+        $nickname = common_canonical_nickname($this->arg('nickname'));
+        $user = User::staticGet('nickname', $nickname);
 
-               if (!$user) {
-                       $this->client_error(_('No such user'), 404);
-                       return;
-               }
-               
-               $notice = $user->getCurrentNotice();
-               
-               if (!$notice) {
-                       $this->client_error(_('No current status'), 404);
-               }
-               
-               header('Content-Type: text/plain');
-               
-               print $user->nickname . ': ' . $notice->content;
-       }
+        if (!$user) {
+            $this->client_error(_('No such user'), 404);
+            return;
+        }
+        
+        $notice = $user->getCurrentNotice();
+        
+        if (!$notice) {
+            $this->client_error(_('No current status'), 404);
+        }
+        
+        header('Content-Type: text/plain');
+        
+        print $user->nickname . ': ' . $notice->content;
+    }
 }
index da48fc7e7a07ad8806d6d2b0bd807952690585f9..121fc4246191676d18bf65675e4e93c6775b00a1 100644 (file)
 if (!defined('LACONICA')) { exit(1); }
 
 class NewmessageAction extends Action {
-       
-       function handle($args) {
-               parent::handle($args);
-
-               if (!common_logged_in()) {
-                       $this->client_error(_('Not logged in.'), 403);
-               } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $this->save_new_message();
-               } else {
-                       $this->show_form();
-               }
-       }
-
-       function save_new_message() {
-               $user = common_current_user();
-               assert($user); # XXX: maybe an error instead...
-
-               # CSRF protection
-               
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-               
-               $content = $this->trimmed('content');
-               $to = $this->trimmed('to');
-               
-               if (!$content) {
-                       $this->show_form(_('No content!'));
-                       return;
-               } else {
-                       $content_shortened = common_shorten_links($content);
-
-                       if (mb_strlen($content_shortened) > 140) {
-                               common_debug("Content = '$content_shortened'", __FILE__);
-                               common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__);
-                               $this->show_form(_('That\'s too long. Max message size is 140 chars.'));
-                               return;
-                       }
-               }
-
-               $other = User::staticGet('id', $to);
-               
-               if (!$other) {
-                       $this->show_form(_('No recipient specified.'));
-                       return;
-               } else if (!$user->mutuallySubscribed($other)) {
-                       $this->client_error(_('You can\'t send a message to this user.'), 404);
-                       return;
-               } else if ($user->id == $other->id) {
-                       $this->client_error(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'), 403);
-                       return;
-               }
-               
-               $message = Message::saveNew($user->id, $other->id, $content, 'web');
-               
-               if (is_string($message)) {
-                       $this->show_form($message);
-                       return;
-               }
-
-               $this->notify($user, $other, $message);
-
-               $url = common_local_url('outbox', array('nickname' => $user->nickname));
-
-               common_redirect($url, 303);
-       }
-
-       function show_top($params) {
-
-               list($content, $user, $to) = $params;
-               
-               assert(!is_null($user));
-
-               common_message_form($content, $user, $to);
-       }
-
-       function show_form($msg=NULL) {
-               
-               $content = $this->trimmed('content');
-               $user = common_current_user();
-
-               $to = $this->trimmed('to');
-               
-               $other = User::staticGet('id', $to);
-
-               if (!$other) {
-                       $this->client_error(_('No such user'), 404);
-                       return;
-               }
-
-               if (!$user->mutuallySubscribed($other)) {
-                       $this->client_error(_('You can\'t send a message to this user.'), 404);
-                       return;
-               }
-               
-               common_show_header(_('New message'), NULL,
-                                                  array($content, $user, $other),
-                                  array($this, 'show_top'));
-               
-               if ($msg) {
-                       common_element('p', array('id'=>'error'), $msg);
-               }
-               
-               common_show_footer();
-       }
-       
-       function notify($from, $to, $message) {
-               mail_notify_message($message, $from, $to);
-               # XXX: Jabber, SMS notifications... probably queued
-       }
+    
+    function handle($args) {
+        parent::handle($args);
+
+        if (!common_logged_in()) {
+            $this->client_error(_('Not logged in.'), 403);
+        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->save_new_message();
+        } else {
+            $this->show_form();
+        }
+    }
+
+    function save_new_message() {
+        $user = common_current_user();
+        assert($user); # XXX: maybe an error instead...
+
+        # CSRF protection
+        
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+        
+        $content = $this->trimmed('content');
+        $to = $this->trimmed('to');
+        
+        if (!$content) {
+            $this->show_form(_('No content!'));
+            return;
+        } else {
+            $content_shortened = common_shorten_links($content);
+
+            if (mb_strlen($content_shortened) > 140) {
+                common_debug("Content = '$content_shortened'", __FILE__);
+                common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__);
+                $this->show_form(_('That\'s too long. Max message size is 140 chars.'));
+                return;
+            }
+        }
+
+        $other = User::staticGet('id', $to);
+        
+        if (!$other) {
+            $this->show_form(_('No recipient specified.'));
+            return;
+        } else if (!$user->mutuallySubscribed($other)) {
+            $this->client_error(_('You can\'t send a message to this user.'), 404);
+            return;
+        } else if ($user->id == $other->id) {
+            $this->client_error(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'), 403);
+            return;
+        }
+        
+        $message = Message::saveNew($user->id, $other->id, $content, 'web');
+        
+        if (is_string($message)) {
+            $this->show_form($message);
+            return;
+        }
+
+        $this->notify($user, $other, $message);
+
+        $url = common_local_url('outbox', array('nickname' => $user->nickname));
+
+        common_redirect($url, 303);
+    }
+
+    function show_top($params) {
+
+        list($content, $user, $to) = $params;
+        
+        assert(!is_null($user));
+
+        common_message_form($content, $user, $to);
+    }
+
+    function show_form($msg=NULL) {
+        
+        $content = $this->trimmed('content');
+        $user = common_current_user();
+
+        $to = $this->trimmed('to');
+        
+        $other = User::staticGet('id', $to);
+
+        if (!$other) {
+            $this->client_error(_('No such user'), 404);
+            return;
+        }
+
+        if (!$user->mutuallySubscribed($other)) {
+            $this->client_error(_('You can\'t send a message to this user.'), 404);
+            return;
+        }
+        
+        common_show_header(_('New message'), NULL,
+                           array($content, $user, $other),
+                           array($this, 'show_top'));
+        
+        if ($msg) {
+            common_element('p', array('id'=>'error'), $msg);
+        }
+        
+        common_show_footer();
+    }
+    
+    function notify($from, $to, $message) {
+        mail_notify_message($message, $from, $to);
+        # XXX: Jabber, SMS notifications... probably queued
+    }
 }
index 42b48923f56b8d104f68a58bc57b9e3410e224ba..7c3ad881546dd3e3cc852281504a4fd311c6ef68 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,132 +23,132 @@ require_once INSTALLDIR . '/lib/noticelist.php';
 
 class NewnoticeAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-               } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-
-                       # CSRF protection - token set in common_notice_form()
-                       $token = $this->trimmed('token');
-                       if (!$token || $token != common_session_token()) {
-                               $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                               return;
-                       }
-
-                       $this->save_new_notice();
-               } else {
-                       $this->show_form();
-               }
-       }
-
-       function save_new_notice() {
-
-               $user = common_current_user();
-               assert($user); # XXX: maybe an error instead...
-               $content = $this->trimmed('status_textarea');
-
-               if (!$content) {
-                       $this->show_form(_('No content!'));
-                       return;
-               } else {
-                       $content_shortened = common_shorten_links($content);
-
-                       if (mb_strlen($content_shortened) > 140) {
-                               common_debug("Content = '$content_shortened'", __FILE__);
-                               common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__);
-                               $this->show_form(_('That\'s too long. Max notice size is 140 chars.'));
-                               return;
-                       }
-               }
-
-               $inter = new CommandInterpreter();
-
-               $cmd = $inter->handle_command($user, $content_shortened);
-
-               if ($cmd) {
-                       if ($this->boolean('ajax')) {
-                               $cmd->execute(new AjaxWebChannel());
-                       } else {
-                               $cmd->execute(new WebChannel());
-                       }
-                       return;
-               }
-
-               $replyto = $this->trimmed('inreplyto');
-
-               $notice = Notice::saveNew($user->id, $content, 'web', 1, ($replyto == 'false') ? NULL : $replyto);
-
-               if (is_string($notice)) {
-                       $this->show_form($notice);
-                       return;
-               }
-
-               common_broadcast_notice($notice);
-
-               if ($this->boolean('ajax')) {
-                       common_start_html('text/xml;charset=utf-8', true);
-                       common_element_start('head');
-                       common_element('title', null, _('Notice posted'));
-                       common_element_end('head');
-                       common_element_start('body');
-                       $this->show_notice($notice);
-                       common_element_end('body');
-                       common_element_end('html');
-               } else {
-                       $returnto = $this->trimmed('returnto');
-
-                       if ($returnto) {
-                               $url = common_local_url($returnto,
-                                                                               array('nickname' => $user->nickname));
-                       } else {
-                               $url = common_local_url('shownotice',
-                                                                               array('notice' => $notice->id));
-                       }
-                       common_redirect($url, 303);
-               }
-       }
-
-       function ajax_error_msg($msg) {
-               common_start_html('text/xml;charset=utf-8', true);
-               common_element_start('head');
-               common_element('title', null, _('Ajax Error'));
-               common_element_end('head');
-               common_element_start('body');
-               common_element('p', array('id' => 'error'), $msg);
-               common_element_end('body');
-               common_element_end('html');
-       }
-
-       function show_top($content=NULL) {
-               common_notice_form(NULL, $content);
-       }
-
-       function show_form($msg=NULL) {
-               if ($msg && $this->boolean('ajax')) {
-                       $this->ajax_error_msg($msg);
-                       return;
-               }
-               $content = $this->trimmed('status_textarea');
-               if (!$content) {
-                       $replyto = $this->trimmed('replyto');
-                       $profile = Profile::staticGet('nickname', $replyto);
-                       if ($profile) {
-                               $content = '@' . $profile->nickname . ' ';
-                       }
-               }
-               common_show_header(_('New notice'), NULL, $content,
-                                                  array($this, 'show_top'));
-               if ($msg) {
-                       common_element('p', array('id' => 'error'), $msg);
-               }
-               common_show_footer();
-       }
-
-       function show_notice($notice) {
+    function handle($args) {
+        parent::handle($args);
+
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+
+            # CSRF protection - token set in common_notice_form()
+            $token = $this->trimmed('token');
+            if (!$token || $token != common_session_token()) {
+                $this->client_error(_('There was a problem with your session token. Try again, please.'));
+                return;
+            }
+
+            $this->save_new_notice();
+        } else {
+            $this->show_form();
+        }
+    }
+
+    function save_new_notice() {
+
+        $user = common_current_user();
+        assert($user); # XXX: maybe an error instead...
+        $content = $this->trimmed('status_textarea');
+
+        if (!$content) {
+            $this->show_form(_('No content!'));
+            return;
+        } else {
+            $content_shortened = common_shorten_links($content);
+
+            if (mb_strlen($content_shortened) > 140) {
+                common_debug("Content = '$content_shortened'", __FILE__);
+                common_debug("mb_strlen(\$content) = " . mb_strlen($content_shortened), __FILE__);
+                $this->show_form(_('That\'s too long. Max notice size is 140 chars.'));
+                return;
+            }
+        }
+
+        $inter = new CommandInterpreter();
+
+        $cmd = $inter->handle_command($user, $content_shortened);
+
+        if ($cmd) {
+            if ($this->boolean('ajax')) {
+                $cmd->execute(new AjaxWebChannel());
+            } else {
+                $cmd->execute(new WebChannel());
+            }
+            return;
+        }
+
+        $replyto = $this->trimmed('inreplyto');
+
+        $notice = Notice::saveNew($user->id, $content, 'web', 1, ($replyto == 'false') ? NULL : $replyto);
+
+        if (is_string($notice)) {
+            $this->show_form($notice);
+            return;
+        }
+
+        common_broadcast_notice($notice);
+
+        if ($this->boolean('ajax')) {
+            common_start_html('text/xml;charset=utf-8', true);
+            common_element_start('head');
+            common_element('title', null, _('Notice posted'));
+            common_element_end('head');
+            common_element_start('body');
+            $this->show_notice($notice);
+            common_element_end('body');
+            common_element_end('html');
+        } else {
+            $returnto = $this->trimmed('returnto');
+
+            if ($returnto) {
+                $url = common_local_url($returnto,
+                                        array('nickname' => $user->nickname));
+            } else {
+                $url = common_local_url('shownotice',
+                                        array('notice' => $notice->id));
+            }
+            common_redirect($url, 303);
+        }
+    }
+
+    function ajax_error_msg($msg) {
+        common_start_html('text/xml;charset=utf-8', true);
+        common_element_start('head');
+        common_element('title', null, _('Ajax Error'));
+        common_element_end('head');
+        common_element_start('body');
+        common_element('p', array('id' => 'error'), $msg);
+        common_element_end('body');
+        common_element_end('html');
+    }
+
+    function show_top($content=NULL) {
+        common_notice_form(NULL, $content);
+    }
+
+    function show_form($msg=NULL) {
+        if ($msg && $this->boolean('ajax')) {
+            $this->ajax_error_msg($msg);
+            return;
+        }
+        $content = $this->trimmed('status_textarea');
+        if (!$content) {
+            $replyto = $this->trimmed('replyto');
+            $profile = Profile::staticGet('nickname', $replyto);
+            if ($profile) {
+                $content = '@' . $profile->nickname . ' ';
+            }
+        }
+        common_show_header(_('New notice'), NULL, $content,
+                           array($this, 'show_top'));
+        if ($msg) {
+            common_element('p', array('id' => 'error'), $msg);
+        }
+        common_show_footer();
+    }
+
+    function show_notice($notice) {
         $nli = new NoticeListItem($notice);
         $nli->show();
-       }
+    }
 
 }
index 96e4d777fa3aca01c86ea3a0d39285535e014ffd..53d78e199918923e82d20cdcf8f3e06dcaaeccaf 100644 (file)
@@ -25,140 +25,140 @@ require_once(INSTALLDIR.'/lib/searchaction.php');
 
 class NoticesearchAction extends SearchAction {
 
-       function get_instructions() {
-               return _('Search for notices on %%site.name%% by their contents. Separate search terms by spaces; they must be 3 characters or more.');
-       }
+    function get_instructions() {
+        return _('Search for notices on %%site.name%% by their contents. Separate search terms by spaces; they must be 3 characters or more.');
+    }
 
-       function get_title() {
-               return _('Text search');
-       }
+    function get_title() {
+        return _('Text search');
+    }
 
-       function show_results($q, $page) {
+    function show_results($q, $page) {
 
-               $notice = new Notice();
+        $notice = new Notice();
 
-               # lcase it for comparison
-               $q = strtolower($q);
+        # lcase it for comparison
+        $q = strtolower($q);
 
         $search_engine = $notice->getSearchEngine('identica_notices');
 
         $search_engine->set_sort_mode('chron');
-               # Ask for an extra to see if there's more.
-               $search_engine->limit((($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
+        # Ask for an extra to see if there's more.
+        $search_engine->limit((($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
 
         if (false === $search_engine->query($q)) {
             $cnt = 0;
         }
         else {
-               $cnt = $notice->find();
+            $cnt = $notice->find();
         }
-               if ($cnt > 0) {
-                       $terms = preg_split('/[\s,]+/', $q);
-                       common_element_start('ul', array('id' => 'notices'));
-                       for ($i = 0; $i < min($cnt, NOTICES_PER_PAGE); $i++) {
-                               if ($notice->fetch()) {
-                                       $this->show_notice($notice, $terms);
-                               } else {
-                                       // shouldn't happen!
-                                       break;
-                               }
-                       }
-                       common_element_end('ul');
-               } else {
-                       common_element('p', 'error', _('No results'));
-               }
-
-               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'noticesearch', array('q' => $q));
-       }
-
-       function show_header($arr) {
-               if ($arr) {
-                       $q = $arr[0];
-               }
-               if ($q) {
-                       common_element('link', array('rel' => 'alternate',
-                                                                                'href' => common_local_url('noticesearchrss',
-                                                                                                                                       array('q' => $q)),
-                                                                                'type' => 'application/rss+xml',
-                                                                                'title' => _('Search Stream Feed')));
-               }
-       }
-
-       # XXX: refactor and combine with StreamAction::show_notice()
-
-       function show_notice($notice, $terms) {
-               $profile = $notice->getProfile();
-               if (!$profile) {
-                       common_log_db_error($notice, 'SELECT', __FILE__);
-                       $this->server_error(_('Notice without matching profile'));
-                       return;
-               }
-               # XXX: RDFa
-               common_element_start('li', array('class' => 'notice_single',
-                                                                                 'id' => 'notice-' . $notice->id));
-               $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
-               common_element_start('a', array('href' => $profile->profileurl));
-               common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
-                                                                       'class' => 'avatar stream',
-                                                                       'width' => AVATAR_STREAM_SIZE,
-                                                                       'height' => AVATAR_STREAM_SIZE,
-                                                                       'alt' =>
-                                                                       ($profile->fullname) ? $profile->fullname :
-                                                                       $profile->nickname));
-               common_element_end('a');
-               common_element('a', array('href' => $profile->profileurl,
-                                                                 'class' => 'nickname'),
-                                          $profile->nickname);
-               # FIXME: URL, image, video, audio
-               common_element_start('p', array('class' => 'content'));
-               if ($notice->rendered) {
-                       common_raw($this->highlight($notice->rendered, $terms));
-               } else {
-                       # XXX: may be some uncooked notices in the DB,
-                       # we cook them right now. This should probably disappear in future
-                       # versions (>> 0.4.x)
-                       common_raw($this->highlight(common_render_content($notice->content, $notice), $terms));
-               }
-               common_element_end('p');
-               $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
-               common_element_start('p', 'time');
-               common_element('a', array('class' => 'permalink',
-                                                                 'href' => $noticeurl,
-                                                                 'title' => common_exact_date($notice->created)),
-                                          common_date_string($notice->created));
-               if ($notice->reply_to) {
-                       $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to));
-                       common_text(' (');
-                       common_element('a', array('class' => 'inreplyto',
-                                                                         'href' => $replyurl),
-                                                  _('in reply to...'));
-                       common_text(')');
-               }
-               common_element_start('a',
-                                                        array('href' => common_local_url('newnotice',
-                                                                                                                         array('replyto' => $profile->nickname)),
-                                                                  'onclick' => 'doreply("'.$profile->nickname.'"); return false',
-                                                                  'title' => _('reply'),
-                                                                  'class' => 'replybutton'));
-               common_hidden('posttoken', common_session_token());
-               
-               common_raw('&rarr;');
-               common_element_end('a');
-               common_element_end('p');
-               common_element_end('li');
-       }
-
-       function highlight($text, $terms) {
-               /* Highligh serach terms */
-               $pattern = '/('.implode('|',array_map('htmlspecialchars', $terms)).')/i';
-               $result = preg_replace($pattern, '<strong>\\1</strong>', $text);
-
-               /* Remove highlighting from inside links, loop incase multiple highlights in links */
-               $pattern = '/(href="[^"]*)<strong>('.implode('|',array_map('htmlspecialchars', $terms)).')<\/strong>([^"]*")/iU';
-               do {
-                       $result = preg_replace($pattern, '\\1\\2\\3', $result, -1, $count);
-               } while ($count);
-               return $result;
-       }
+        if ($cnt > 0) {
+            $terms = preg_split('/[\s,]+/', $q);
+            common_element_start('ul', array('id' => 'notices'));
+            for ($i = 0; $i < min($cnt, NOTICES_PER_PAGE); $i++) {
+                if ($notice->fetch()) {
+                    $this->show_notice($notice, $terms);
+                } else {
+                    // shouldn't happen!
+                    break;
+                }
+            }
+            common_element_end('ul');
+        } else {
+            common_element('p', 'error', _('No results'));
+        }
+
+        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'noticesearch', array('q' => $q));
+    }
+
+    function show_header($arr) {
+        if ($arr) {
+            $q = $arr[0];
+        }
+        if ($q) {
+            common_element('link', array('rel' => 'alternate',
+                                         'href' => common_local_url('noticesearchrss',
+                                                                    array('q' => $q)),
+                                         'type' => 'application/rss+xml',
+                                         'title' => _('Search Stream Feed')));
+        }
+    }
+
+    # XXX: refactor and combine with StreamAction::show_notice()
+
+    function show_notice($notice, $terms) {
+        $profile = $notice->getProfile();
+        if (!$profile) {
+            common_log_db_error($notice, 'SELECT', __FILE__);
+            $this->server_error(_('Notice without matching profile'));
+            return;
+        }
+        # XXX: RDFa
+        common_element_start('li', array('class' => 'notice_single',
+                                          'id' => 'notice-' . $notice->id));
+        $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
+        common_element_start('a', array('href' => $profile->profileurl));
+        common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
+                                    'class' => 'avatar stream',
+                                    'width' => AVATAR_STREAM_SIZE,
+                                    'height' => AVATAR_STREAM_SIZE,
+                                    'alt' =>
+                                    ($profile->fullname) ? $profile->fullname :
+                                    $profile->nickname));
+        common_element_end('a');
+        common_element('a', array('href' => $profile->profileurl,
+                                  'class' => 'nickname'),
+                       $profile->nickname);
+        # FIXME: URL, image, video, audio
+        common_element_start('p', array('class' => 'content'));
+        if ($notice->rendered) {
+            common_raw($this->highlight($notice->rendered, $terms));
+        } else {
+            # XXX: may be some uncooked notices in the DB,
+            # we cook them right now. This should probably disappear in future
+            # versions (>> 0.4.x)
+            common_raw($this->highlight(common_render_content($notice->content, $notice), $terms));
+        }
+        common_element_end('p');
+        $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
+        common_element_start('p', 'time');
+        common_element('a', array('class' => 'permalink',
+                                  'href' => $noticeurl,
+                                  'title' => common_exact_date($notice->created)),
+                       common_date_string($notice->created));
+        if ($notice->reply_to) {
+            $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to));
+            common_text(' (');
+            common_element('a', array('class' => 'inreplyto',
+                                      'href' => $replyurl),
+                           _('in reply to...'));
+            common_text(')');
+        }
+        common_element_start('a',
+                             array('href' => common_local_url('newnotice',
+                                                              array('replyto' => $profile->nickname)),
+                                   'onclick' => 'doreply("'.$profile->nickname.'"); return false',
+                                   'title' => _('reply'),
+                                   'class' => 'replybutton'));
+        common_hidden('posttoken', common_session_token());
+        
+        common_raw('&rarr;');
+        common_element_end('a');
+        common_element_end('p');
+        common_element_end('li');
+    }
+
+    function highlight($text, $terms) {
+        /* Highligh serach terms */
+        $pattern = '/('.implode('|',array_map('htmlspecialchars', $terms)).')/i';
+        $result = preg_replace($pattern, '<strong>\\1</strong>', $text);
+
+        /* Remove highlighting from inside links, loop incase multiple highlights in links */
+        $pattern = '/(href="[^"]*)<strong>('.implode('|',array_map('htmlspecialchars', $terms)).')<\/strong>([^"]*")/iU';
+        do {
+            $result = preg_replace($pattern, '\\1\\2\\3', $result, -1, $count);
+        } while ($count);
+        return $result;
+    }
 }
index 0f38515a020f8145fbbd2cd19153e66c60f70f4b..a7df62ca025e89fd1fddb9db3e5d85e4e7abb9b7 100644 (file)
@@ -25,46 +25,46 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class NoticesearchrssAction extends Rss10Action {
 
-       function init() {
-               return true;
-       }
+    function init() {
+        return true;
+    }
 
-       function get_notices($limit=0) {
+    function get_notices($limit=0) {
 
-               $q = $this->trimmed('q');
-               $notices = array();
+        $q = $this->trimmed('q');
+        $notices = array();
 
-               $notice = new Notice();
+        $notice = new Notice();
 
-               # lcase it for comparison
-               $q = strtolower($q);
+        # lcase it for comparison
+        $q = strtolower($q);
 
         $search_engine = $notice->getSearchEngine('identica_notices');
         $search_engine->set_sort_mode('chron');
 
-               if (!$limit) $limit = 20;
+        if (!$limit) $limit = 20;
         $search_engine->limit(0, $limit, true);
         $search_engine->query($q);
-               $notice->find();
+        $notice->find();
 
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
 
-               return $notices;
-       }
+        return $notices;
+    }
 
-       function get_channel() {
-               global $config;
-               $q = $this->trimmed('q');
-               $c = array('url' => common_local_url('noticesearchrss', array('q' => $q)),
-                                  'title' => $config['site']['name'] . sprintf(_(' Search Stream for "%s"'), $q),
-                                  'link' => common_local_url('noticesearch', array('q' => $q)),
-                                  'description' => sprintf(_('All updates matching search term "%s"'), $q));
-               return $c;
-       }
+    function get_channel() {
+        global $config;
+        $q = $this->trimmed('q');
+        $c = array('url' => common_local_url('noticesearchrss', array('q' => $q)),
+                   'title' => $config['site']['name'] . sprintf(_(' Search Stream for "%s"'), $q),
+                   'link' => common_local_url('noticesearch', array('q' => $q)),
+                   'description' => sprintf(_('All updates matching search term "%s"'), $q));
+        return $c;
+    }
 
-       function get_image() {
-               return NULL;
-       }
+    function get_image() {
+        return NULL;
+    }
 }
index 677f58800517244a6ae5a507517cccd34667630c..6f3b4c95c5723aad31185d8df14bc0334737feab 100644 (file)
@@ -23,62 +23,62 @@ require_once(INSTALLDIR.'/lib/mail.php');
 
 class NudgeAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               if (!common_logged_in()) {
-                       $this->client_error(_('Not logged in.'));
-                       return;
-               }
+        if (!common_logged_in()) {
+            $this->client_error(_('Not logged in.'));
+            return;
+        }
 
-               $user = common_current_user();
-               $other = User::staticGet('nickname', $this->arg('nickname'));
+        $user = common_current_user();
+        $other = User::staticGet('nickname', $this->arg('nickname'));
 
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       common_redirect(common_local_url('showstream', array('nickname' => $other->nickname)));
-                       return;
-               }
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            common_redirect(common_local_url('showstream', array('nickname' => $other->nickname)));
+            return;
+        }
 
-               # CSRF protection
+        # CSRF protection
 
-               $token = $this->trimmed('token');
-               
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        $token = $this->trimmed('token');
+        
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
         if (!$other->email || !$other->emailnotifynudge) {
             $this->client_error(_('This user doesn\'t allow nudges or hasn\'t confirmed or set his email yet.'));
             return;
         }
 
-               $this->notify($user, $other);
+        $this->notify($user, $other);
 
-               if ($this->boolean('ajax')) {
-                       common_start_html('text/xml;charset=utf-8', true);
-                       common_element_start('head');
-                       common_element('title', null, _('Nudge sent'));
-                       common_element_end('head');
-                       common_element_start('body');
-                       common_nudge_response();
-                       common_element_end('body');
-                       common_element_end('html');
-               } else {
+        if ($this->boolean('ajax')) {
+            common_start_html('text/xml;charset=utf-8', true);
+            common_element_start('head');
+            common_element('title', null, _('Nudge sent'));
+            common_element_end('head');
+            common_element_start('body');
+            common_nudge_response();
+            common_element_end('body');
+            common_element_end('html');
+        } else {
             // display a confirmation to the user
-                       common_redirect(common_local_url('showstream',
-                                                                                        array('nickname' => $other->nickname)));
-               }
-       }
+            common_redirect(common_local_url('showstream',
+                                             array('nickname' => $other->nickname)));
+        }
+    }
 
-       function notify($user, $other) {
-               if ($other->id != $user->id) {
-                       if ($other->email && $other->emailnotifynudge) {
-                               mail_notify_nudge($user, $other);
-                       }
-                       # XXX: notify by IM
-                       # XXX: notify by SMS
-               }
-       }
+    function notify($user, $other) {
+        if ($other->id != $user->id) {
+            if ($other->email && $other->emailnotifynudge) {
+                mail_notify_nudge($user, $other);
+            }
+            # XXX: notify by IM
+            # XXX: notify by SMS
+        }
+    }
 }
 
index 1b289dbeab3ab8e865be36e190890614685b9677..6192dfc3406824df88671bbfb958f2bf5f984c46 100644 (file)
@@ -23,70 +23,70 @@ require_once(INSTALLDIR.'/lib/openid.php');
 
 class OpenidloginAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-               if (common_logged_in()) {
-                       common_user_error(_('Already logged in.'));
-               } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $openid_url = $this->trimmed('openid_url');
+    function handle($args) {
+        parent::handle($args);
+        if (common_logged_in()) {
+            common_user_error(_('Already logged in.'));
+        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $openid_url = $this->trimmed('openid_url');
 
-                       # CSRF protection
-                       $token = $this->trimmed('token');
-                       if (!$token || $token != common_session_token()) {
-                               $this->show_form(_('There was a problem with your session token. Try again, please.'), $openid_url);
-                               return;
-                       }
+            # CSRF protection
+            $token = $this->trimmed('token');
+            if (!$token || $token != common_session_token()) {
+                $this->show_form(_('There was a problem with your session token. Try again, please.'), $openid_url);
+                return;
+            }
 
-                       $rememberme = $this->boolean('rememberme');
-                       
-                       common_ensure_session();
-                       
-                       $_SESSION['openid_rememberme'] = $rememberme;
-                       
-                       $result = oid_authenticate($openid_url,
-                                                                          'finishopenidlogin');
-                       
-                       if (is_string($result)) { # error message
-                               unset($_SESSION['openid_rememberme']);
-                               $this->show_form($result, $openid_url);
-                       }
-               } else {
-                       $openid_url = oid_get_last();
-                       $this->show_form(NULL, $openid_url);
-               }
-       }
+            $rememberme = $this->boolean('rememberme');
+            
+            common_ensure_session();
+            
+            $_SESSION['openid_rememberme'] = $rememberme;
+            
+            $result = oid_authenticate($openid_url,
+                                       'finishopenidlogin');
+            
+            if (is_string($result)) { # error message
+                unset($_SESSION['openid_rememberme']);
+                $this->show_form($result, $openid_url);
+            }
+        } else {
+            $openid_url = oid_get_last();
+            $this->show_form(NULL, $openid_url);
+        }
+    }
 
-       function get_instructions() {
-               return _('Login with an [OpenID](%%doc.openid%%) account.');
-       }
+    function get_instructions() {
+        return _('Login with an [OpenID](%%doc.openid%%) account.');
+    }
 
-       function show_top($error=NULL) {
-               if ($error) {
-                       common_element('div', array('class' => 'error'), $error);
-               } else {
-                       $instr = $this->get_instructions();
-                       $output = common_markup_to_html($instr);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-               }
-       }
+    function show_top($error=NULL) {
+        if ($error) {
+            common_element('div', array('class' => 'error'), $error);
+        } else {
+            $instr = $this->get_instructions();
+            $output = common_markup_to_html($instr);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('div');
+        }
+    }
 
-       function show_form($error=NULL, $openid_url) {
-               common_show_header(_('OpenID Login'), NULL, $error, array($this, 'show_top'));
-               $formaction = common_local_url('openidlogin');
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'openidlogin',
-                                                                                  'action' => $formaction));
-               common_hidden('token', common_session_token());
-               common_input('openid_url', _('OpenID URL'),
-                                        $openid_url,
-                                        _('Your OpenID URL'));
-               common_checkbox('rememberme', _('Remember me'), false,
-                               _('Automatically login in the future; ' .
-                                  'not for shared computers!'));
-               common_submit('submit', _('Login'));
-               common_element_end('form');
-               common_show_footer();
-       }
+    function show_form($error=NULL, $openid_url) {
+        common_show_header(_('OpenID Login'), NULL, $error, array($this, 'show_top'));
+        $formaction = common_local_url('openidlogin');
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'openidlogin',
+                                           'action' => $formaction));
+        common_hidden('token', common_session_token());
+        common_input('openid_url', _('OpenID URL'),
+                     $openid_url,
+                     _('Your OpenID URL'));
+        common_checkbox('rememberme', _('Remember me'), false,
+                        _('Automatically login in the future; ' .
+                           'not for shared computers!'));
+        common_submit('submit', _('Login'));
+        common_element_end('form');
+        common_show_footer();
+    }
 }
index f539d111f9e302abef5daf1f98c6e5b355839879..dd575bb737837c97b4f1426d38950223ebd037e1 100644 (file)
@@ -24,133 +24,133 @@ require_once(INSTALLDIR.'/lib/openid.php');
 
 class OpenidsettingsAction extends SettingsAction {
 
-       function get_instructions() {
-               return _('[OpenID](%%doc.openid%%) lets you log into many sites ' .
-                         ' with the same user account. '.
-                         ' Manage your associated OpenIDs from here.');
-       }
-
-       function show_form($msg=NULL, $success=false) {
-
-               $user = common_current_user();
-
-               $this->form_header(_('OpenID settings'), $msg, $success);
-
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'openidadd',
-                                                                                  'action' =>
-                                                                                  common_local_url('openidsettings')));
-               common_hidden('token', common_session_token());
-               common_element('h2', NULL, _('Add OpenID'));
-               common_element('p', NULL,
-                                          _('If you want to add an OpenID to your account, ' .
-                                                 'enter it in the box below and click "Add".'));
-               common_element_start('p');
-               common_element('label', array('for' => 'openid_url'),
-                                          _('OpenID URL'));
-               common_element('input', array('name' => 'openid_url',
-                                                                         'type' => 'text',
-                                                                         'id' => 'openid_url'));
-               common_element('input', array('type' => 'submit',
-                                                                         'id' => 'add',
-                                                                         'name' => 'add',
-                                                                         'class' => 'submit',
-                                                                         'value' => _('Add')));
-               common_element_end('p');
-               common_element_end('form');
-
-               $oid = new User_openid();
-               $oid->user_id = $user->id;
-
-               $cnt = $oid->find();
-
-               if ($cnt > 0) {
-
-                       common_element('h2', NULL, _('Remove OpenID'));
-
-                       if ($cnt == 1 && !$user->password) {
-
-                               common_element('p', NULL,
-                                                          _('Removing your only OpenID would make it impossible to log in! ' .
-                                                                 'If you need to remove it, add another OpenID first.'));
-
-                               if ($oid->fetch()) {
-                                       common_element_start('p');
-                                       common_element('a', array('href' => $oid->canonical),
-                                                                  $oid->display);
-                                       common_element_end('p');
-                               }
-
-                       } else {
-
-                               common_element('p', NULL,
-                                                          _('You can remove an OpenID from your account '.
-                                                                 'by clicking the button marked "Remove".'));
-                               $idx = 0;
-
-                               while ($oid->fetch()) {
-                                       common_element_start('form', array('method' => 'POST',
-                                                                                                          'id' => 'openiddelete' . $idx,
-                                                                                                          'action' =>
-                                                                                                          common_local_url('openidsettings')));
-                                       common_element_start('p');
-                                       common_hidden('token', common_session_token());
-                                       common_element('a', array('href' => $oid->canonical),
-                                                                  $oid->display);
-                                       common_element('input', array('type' => 'hidden',
-                                                                                                 'id' => 'openid_url'.$idx,
-                                                                                                 'name' => 'openid_url',
-                                                                                                 'value' => $oid->canonical));
-                                       common_element('input', array('type' => 'submit',
-                                                                                                 'id' => 'remove'.$idx,
-                                                                                                 'name' => 'remove',
-                                                                                                 'class' => 'submit',
-                                                                                                 'value' => _('Remove')));
-                                       common_element_end('p');
-                                       common_element_end('form');
-                                       $idx++;
-                               }
-                       }
-               }
-
-               common_show_footer();
-       }
-
-       function handle_post() {
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               if ($this->arg('add')) {
-                       $result = oid_authenticate($this->trimmed('openid_url'), 'finishaddopenid');
-                       if (is_string($result)) { # error message
-                               $this->show_form($result);
-                       }
-               } else if ($this->arg('remove')) {
-                       $this->remove_openid();
-               } else {
-                       $this->show_form(_('Something weird happened.'));
-               }
-       }
-
-       function remove_openid() {
-
-               $openid_url = $this->trimmed('openid_url');
-               $oid = User_openid::staticGet('canonical', $openid_url);
-               if (!$oid) {
-                       $this->show_form(_('No such OpenID.'));
-                       return;
-               }
-               $cur = common_current_user();
-               if (!$cur || $oid->user_id != $cur->id) {
-                       $this->show_form(_('That OpenID does not belong to you.'));
-                       return;
-               }
-               $oid->delete();
-               $this->show_form(_('OpenID removed.'), true);
-               return;
-       }
+    function get_instructions() {
+        return _('[OpenID](%%doc.openid%%) lets you log into many sites ' .
+                  ' with the same user account. '.
+                  ' Manage your associated OpenIDs from here.');
+    }
+
+    function show_form($msg=NULL, $success=false) {
+
+        $user = common_current_user();
+
+        $this->form_header(_('OpenID settings'), $msg, $success);
+
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'openidadd',
+                                           'action' =>
+                                           common_local_url('openidsettings')));
+        common_hidden('token', common_session_token());
+        common_element('h2', NULL, _('Add OpenID'));
+        common_element('p', NULL,
+                       _('If you want to add an OpenID to your account, ' .
+                          'enter it in the box below and click "Add".'));
+        common_element_start('p');
+        common_element('label', array('for' => 'openid_url'),
+                       _('OpenID URL'));
+        common_element('input', array('name' => 'openid_url',
+                                      'type' => 'text',
+                                      'id' => 'openid_url'));
+        common_element('input', array('type' => 'submit',
+                                      'id' => 'add',
+                                      'name' => 'add',
+                                      'class' => 'submit',
+                                      'value' => _('Add')));
+        common_element_end('p');
+        common_element_end('form');
+
+        $oid = new User_openid();
+        $oid->user_id = $user->id;
+
+        $cnt = $oid->find();
+
+        if ($cnt > 0) {
+
+            common_element('h2', NULL, _('Remove OpenID'));
+
+            if ($cnt == 1 && !$user->password) {
+
+                common_element('p', NULL,
+                               _('Removing your only OpenID would make it impossible to log in! ' .
+                                  'If you need to remove it, add another OpenID first.'));
+
+                if ($oid->fetch()) {
+                    common_element_start('p');
+                    common_element('a', array('href' => $oid->canonical),
+                                   $oid->display);
+                    common_element_end('p');
+                }
+
+            } else {
+
+                common_element('p', NULL,
+                               _('You can remove an OpenID from your account '.
+                                  'by clicking the button marked "Remove".'));
+                $idx = 0;
+
+                while ($oid->fetch()) {
+                    common_element_start('form', array('method' => 'POST',
+                                                       'id' => 'openiddelete' . $idx,
+                                                       'action' =>
+                                                       common_local_url('openidsettings')));
+                    common_element_start('p');
+                    common_hidden('token', common_session_token());
+                    common_element('a', array('href' => $oid->canonical),
+                                   $oid->display);
+                    common_element('input', array('type' => 'hidden',
+                                                  'id' => 'openid_url'.$idx,
+                                                  'name' => 'openid_url',
+                                                  'value' => $oid->canonical));
+                    common_element('input', array('type' => 'submit',
+                                                  'id' => 'remove'.$idx,
+                                                  'name' => 'remove',
+                                                  'class' => 'submit',
+                                                  'value' => _('Remove')));
+                    common_element_end('p');
+                    common_element_end('form');
+                    $idx++;
+                }
+            }
+        }
+
+        common_show_footer();
+    }
+
+    function handle_post() {
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        if ($this->arg('add')) {
+            $result = oid_authenticate($this->trimmed('openid_url'), 'finishaddopenid');
+            if (is_string($result)) { # error message
+                $this->show_form($result);
+            }
+        } else if ($this->arg('remove')) {
+            $this->remove_openid();
+        } else {
+            $this->show_form(_('Something weird happened.'));
+        }
+    }
+
+    function remove_openid() {
+
+        $openid_url = $this->trimmed('openid_url');
+        $oid = User_openid::staticGet('canonical', $openid_url);
+        if (!$oid) {
+            $this->show_form(_('No such OpenID.'));
+            return;
+        }
+        $cur = common_current_user();
+        if (!$cur || $oid->user_id != $cur->id) {
+            $this->show_form(_('That OpenID does not belong to you.'));
+            return;
+        }
+        $oid->delete();
+        $this->show_form(_('OpenID removed.'), true);
+        return;
+    }
 }
index 0f366be4ca6f717126f39d41976a4cce1682348f..707e929fb1fcf5c61f6a33e3cb777a817b3f111d 100644 (file)
@@ -21,39 +21,39 @@ if (!defined('LACONICA')) { exit(1); }
 
 class OpensearchAction extends Action {
 
-       function handle($args) {
-
-               parent::handle($args);
-
-               $type = $this->trimmed('type');
-
-               $short_name = '';
-               if ($type == 'people') {
-                       $type = 'peoplesearch';
-                       $short_name = _('People Search');
-               } else {
-                       $short_name = _('Notice Search');
-                       $type = 'noticesearch';
-               }
-
-               header('Content-Type: text/html');
-
-               common_start_xml();
-               common_element_start('OpenSearchDescription', array('xmlns' => 'http://a9.com/-/spec/opensearch/1.1/'));
-
-               $short_name =  common_config('site', 'name').' '.$short_name;
-               common_element('ShortName', NULL, $short_name);
-               common_element('Contact', NULL, common_config('site', 'email'));
-               common_element('Url', array('type' => 'text/html', 'method' => 'get',
-                                          'template' => str_replace('---', '{searchTerms}', common_local_url($type, array('q' => '---')))));
-               common_element('Image', array('height' => 16, 'width' => 16, 'type' => 'image/vnd.microsoft.icon'), common_path('favicon.ico'));
-               common_element('Image', array('height' => 50, 'width' => 50, 'type' => 'image/png'), theme_path('logo.png'));
-               common_element('AdultContent', NULL, 'false');
-               common_element('Language', NULL, common_language());
-               common_element('OutputEncoding', NULL, 'UTF-8');
-               common_element('InputEncoding', NULL, 'UTF-8');
-
-               common_element_end('OpenSearchDescription');
-               common_end_xml();
-       }
+    function handle($args) {
+
+        parent::handle($args);
+
+        $type = $this->trimmed('type');
+
+        $short_name = '';
+        if ($type == 'people') {
+            $type = 'peoplesearch';
+            $short_name = _('People Search');
+        } else {
+            $short_name = _('Notice Search');
+            $type = 'noticesearch';
+        }
+
+        header('Content-Type: text/html');
+
+        common_start_xml();
+        common_element_start('OpenSearchDescription', array('xmlns' => 'http://a9.com/-/spec/opensearch/1.1/'));
+
+        $short_name =  common_config('site', 'name').' '.$short_name;
+        common_element('ShortName', NULL, $short_name);
+        common_element('Contact', NULL, common_config('site', 'email'));
+        common_element('Url', array('type' => 'text/html', 'method' => 'get',
+                       'template' => str_replace('---', '{searchTerms}', common_local_url($type, array('q' => '---')))));
+        common_element('Image', array('height' => 16, 'width' => 16, 'type' => 'image/vnd.microsoft.icon'), common_path('favicon.ico'));
+        common_element('Image', array('height' => 50, 'width' => 50, 'type' => 'image/png'), theme_path('logo.png'));
+        common_element('AdultContent', NULL, 'false');
+        common_element('Language', NULL, common_language());
+        common_element('OutputEncoding', NULL, 'UTF-8');
+        common_element('InputEncoding', NULL, 'UTF-8');
+
+        common_element_end('OpenSearchDescription');
+        common_end_xml();
+    }
 }
index eccf90e91b3a0d7122036d468873e6ec29523f7c..9b824cea2f39b8efe7952c71d082cc662d03a999 100644 (file)
@@ -23,159 +23,159 @@ require_once(INSTALLDIR.'/lib/settingsaction.php');
 
 class OthersettingsAction extends SettingsAction {
 
-       function get_instructions() {
-               return _('Manage various other options.');
-       }
+    function get_instructions() {
+        return _('Manage various other options.');
+    }
 
-       function show_form($msg=NULL, $success=false) {
-               $user = common_current_user();
+    function show_form($msg=NULL, $success=false) {
+        $user = common_current_user();
 
-               $this->form_header(_('Other Settings'), $msg, $success);
+        $this->form_header(_('Other Settings'), $msg, $success);
 
-               common_element('h2', NULL, _('URL Auto-shortening'));
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'othersettings',
-                                                                                  'action' =>
-                                                                                  common_local_url('othersettings')));
-               common_hidden('token', common_session_token());
+        common_element('h2', NULL, _('URL Auto-shortening'));
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'othersettings',
+                                           'action' =>
+                                           common_local_url('othersettings')));
+        common_hidden('token', common_session_token());
 
-               $services = array(
-                       '' => 'None',
+        $services = array(
+            '' => 'None',
             'ur1.ca' => 'ur1.ca (free service)',
             '2tu.us' => '2tu.us (free service)',
             'ptiturl.com' => 'ptiturl.com',
             'bit.ly' => 'bit.ly',
-                       'tinyurl.com' => 'tinyurl.com',
-                       'is.gd' => 'is.gd',
-                       'snipr.com' => 'snipr.com',
-                       'metamark.net' => 'metamark.net'
-               );
+            'tinyurl.com' => 'tinyurl.com',
+            'is.gd' => 'is.gd',
+            'snipr.com' => 'snipr.com',
+            'metamark.net' => 'metamark.net'
+        );
 
-               common_dropdown('urlshorteningservice', _('Service'), $services, _('Automatic shortening service to use.'), FALSE, $user->urlshorteningservice);
+        common_dropdown('urlshorteningservice', _('Service'), $services, _('Automatic shortening service to use.'), FALSE, $user->urlshorteningservice);
 
-               common_submit('save', _('Save'));
+        common_submit('save', _('Save'));
 
-               common_element_end('form');
+        common_element_end('form');
 
-//             common_element('h2', NULL, _('Delete my account'));
-//             $this->show_delete_form();
+//        common_element('h2', NULL, _('Delete my account'));
+//        $this->show_delete_form();
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function show_feeds_list($feeds) {
-               common_element_start('div', array('class' => 'feedsdel'));
-               common_element('p', null, 'Feeds:');
-               common_element_start('ul', array('class' => 'xoxo'));
+    function show_feeds_list($feeds) {
+        common_element_start('div', array('class' => 'feedsdel'));
+        common_element('p', null, 'Feeds:');
+        common_element_start('ul', array('class' => 'xoxo'));
 
-               foreach ($feeds as $key => $value) {
-                       $this->common_feed_item($feeds[$key]);
-               }
-               common_element_end('ul');
-               common_element_end('div');
-       }
+        foreach ($feeds as $key => $value) {
+            $this->common_feed_item($feeds[$key]);
+        }
+        common_element_end('ul');
+        common_element_end('div');
+    }
 
     //TODO move to common.php (and retrace its origin)
-       function common_feed_item($feed) {
+    function common_feed_item($feed) {
         $user = common_current_user();
-               $nickname = $user->nickname;
-
-               switch($feed['item']) {
-                       case 'notices': default:
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "$nickname's ".$feed['version']." notice feed";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'foaf':
-                               $feed_classname = "foaf";
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "$nickname's FOAF file";
-                               $feed['textContent'] = "FOAF";
-                               break;
-               }
-               common_element_start('li');
-               common_element('a', array('href' => $feed['href'],
-                                                                 'class' => $feed_classname,
-                                                                 'type' => $feed_mimetype,
-                                                                 'title' => $feed_title),
-                                                       $feed['textContent']);
-               common_element_end('li');
-       }
-
-//     function show_delete_form() {
-//             $user = common_current_user();
+        $nickname = $user->nickname;
+
+        switch($feed['item']) {
+            case 'notices': default:
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "$nickname's ".$feed['version']." notice feed";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'foaf':
+                $feed_classname = "foaf";
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "$nickname's FOAF file";
+                $feed['textContent'] = "FOAF";
+                break;
+        }
+        common_element_start('li');
+        common_element('a', array('href' => $feed['href'],
+                                  'class' => $feed_classname,
+                                  'type' => $feed_mimetype,
+                                  'title' => $feed_title),
+                            $feed['textContent']);
+        common_element_end('li');
+    }
+
+//    function show_delete_form() {
+//        $user = common_current_user();
 //      $notices = DB_DataObject::factory('notice');
 //      $notices->profile_id = $user->id;
 //      $notice_count = (int) $notices->count();
 //
-//             common_element_start('form', array('method' => 'POST',
-//                                                                                'id' => 'delete',
-//                                                                                'action' =>
-//                                                                                common_local_url('deleteprofile')));
+//        common_element_start('form', array('method' => 'POST',
+//                                           'id' => 'delete',
+//                                           'action' =>
+//                                           common_local_url('deleteprofile')));
 //
-//             common_hidden('token', common_session_token());
+//        common_hidden('token', common_session_token());
 //      common_element('p', null, "You can copy your notices and contacts by saving the two links below before deleting your account. Be careful, this operation cannot be undone.");
 //
-//             $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('limit' => $notice_count, 'nickname' => $user->nickname)),
-//                                                                                       'type' => 'rss',
-//                                                                                       'version' => 'RSS 1.0',
-//                                                                                       'item' => 'notices'),
-//                                                                      1=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
-//                                                                                       'type' => 'rdf',
-//                                                                                       'version' => 'FOAF',
-//                                                                                       'item' => 'foaf')));
+//        $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('limit' => $notice_count, 'nickname' => $user->nickname)),
+//                                              'type' => 'rss',
+//                                              'version' => 'RSS 1.0',
+//                                              'item' => 'notices'),
+//                                     1=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
+//                                              'type' => 'rdf',
+//                                              'version' => 'FOAF',
+//                                              'item' => 'foaf')));
 //
-//             common_submit('deleteaccount', _('Delete my account'));
-//             common_element_end('form');
-//     }
+//        common_submit('deleteaccount', _('Delete my account'));
+//        common_element_end('form');
+//    }
 
-       function handle_post() {
+    function handle_post() {
 
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
-               if ($this->arg('save')) {
-                       $this->save_preferences();
-               }else {
-                       $this->show_form(_('Unexpected form submission.'));
-               }
-       }
+        if ($this->arg('save')) {
+            $this->save_preferences();
+        }else {
+            $this->show_form(_('Unexpected form submission.'));
+        }
+    }
 
-       function save_preferences() {
+    function save_preferences() {
 
-               $urlshorteningservice = $this->trimmed('urlshorteningservice');
+        $urlshorteningservice = $this->trimmed('urlshorteningservice');
 
-               if (!is_null($urlshorteningservice) && strlen($urlshorteningservice) > 50) {
-                       $this->show_form(_('URL shortening service is too long (max 50 chars).'));
-                       return;
-               }
+        if (!is_null($urlshorteningservice) && strlen($urlshorteningservice) > 50) {
+            $this->show_form(_('URL shortening service is too long (max 50 chars).'));
+            return;
+        }
 
-               $user = common_current_user();
+        $user = common_current_user();
 
-               assert(!is_null($user)); # should already be checked
+        assert(!is_null($user)); # should already be checked
 
-               $user->query('BEGIN');
+        $user->query('BEGIN');
 
-               $original = clone($user);
+        $original = clone($user);
 
-               $user->urlshorteningservice = $urlshorteningservice;
+        $user->urlshorteningservice = $urlshorteningservice;
 
-               $result = $user->update($original);
+        $result = $user->update($original);
 
-               if ($result === FALSE) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t update user.'));
-                       return;
-               }
+        if ($result === FALSE) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t update user.'));
+            return;
+        }
 
-               $user->query('COMMIT');
+        $user->query('COMMIT');
 
-               $this->show_form(_('Preferences saved.'), true);
-       }
+        $this->show_form(_('Preferences saved.'), true);
+    }
 }
index 2e54233ec1c607bb2f112809feec616c0064b450..f89de53f713937dea249c3f6d73c560ee5d25019 100644 (file)
@@ -24,61 +24,61 @@ require_once(INSTALLDIR.'/lib/profilelist.php');
 
 class PeoplesearchAction extends SearchAction {
 
-       function get_instructions() {
-               return _('Search for people on %%site.name%% by their name, location, or interests. ' .
-                                 'Separate the terms by spaces; they must be 3 characters or more.');
-       }
+    function get_instructions() {
+        return _('Search for people on %%site.name%% by their name, location, or interests. ' .
+                  'Separate the terms by spaces; they must be 3 characters or more.');
+    }
 
-       function get_title() {
-               return _('People search');
-       }
+    function get_title() {
+        return _('People search');
+    }
 
-       function show_results($q, $page) {
+    function show_results($q, $page) {
 
-               $profile = new Profile();
+        $profile = new Profile();
 
-               # lcase it for comparison
-               $q = strtolower($q);
+        # lcase it for comparison
+        $q = strtolower($q);
 
         $search_engine = $profile->getSearchEngine('identica_people');
 
         $search_engine->set_sort_mode('chron');
-               # Ask for an extra to see if there's more.
+        # Ask for an extra to see if there's more.
         $search_engine->limit((($page-1)*PROFILES_PER_PAGE), PROFILES_PER_PAGE + 1);
         if (false === $search_engine->query($q)) {
             $cnt = 0;
         }
         else {
-                   $cnt = $profile->find();
+            $cnt = $profile->find();
+        }
+        if ($cnt > 0) {
+            $terms = preg_split('/[\s,]+/', $q);
+            $results = new PeopleSearchResults($profile, $terms);
+            $results->show_list();
+        } else {
+            common_element('p', 'error', _('No results'));
         }
-               if ($cnt > 0) {
-                       $terms = preg_split('/[\s,]+/', $q);
-                       $results = new PeopleSearchResults($profile, $terms);
-                       $results->show_list();
-               } else {
-                       common_element('p', 'error', _('No results'));
-               }
 
-               $profile->free();
-               
-               common_pagination($page > 1, $cnt > PROFILES_PER_PAGE,
-                                                 $page, 'peoplesearch', array('q' => $q));
-       }
+        $profile->free();
+        
+        common_pagination($page > 1, $cnt > PROFILES_PER_PAGE,
+                          $page, 'peoplesearch', array('q' => $q));
+    }
 }
 
 class PeopleSearchResults extends ProfileList {
 
-       var $terms = NULL;
-       var $pattern = NULL;
-       
-       function __construct($profile, $terms) {
-               parent::__construct($profile);
-               $this->terms = array_map('preg_quote', 
-                                                                array_map('htmlspecialchars', $terms));
-               $this->pattern = '/('.implode('|',$terms).')/i';
-       }
-       
-       function highlight($text) {
-               return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
-       }
+    var $terms = NULL;
+    var $pattern = NULL;
+    
+    function __construct($profile, $terms) {
+        parent::__construct($profile);
+        $this->terms = array_map('preg_quote', 
+                                 array_map('htmlspecialchars', $terms));
+        $this->pattern = '/('.implode('|',$terms).')/i';
+    }
+    
+    function highlight($text) {
+        return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
+    }
 }
index c508e05943c50382cb6f9d966a0b7bb31418381a..f03a3c8af463bb548f0abe213e9d64caed0d10f9 100644 (file)
@@ -22,82 +22,82 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/lib/profilelist.php');
 
 class PeopletagAction extends Action {
-       
-       function handle($args) {
+    
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               $tag = $this->trimmed('tag');
-               
-               if (!common_valid_profile_tag($tag)) {
-                       $this->client_error(sprintf(_('Not a valid people tag: %s'), $tag));
-                       return;
-               }
+        $tag = $this->trimmed('tag');
+        
+        if (!common_valid_profile_tag($tag)) {
+            $this->client_error(sprintf(_('Not a valid people tag: %s'), $tag));
+            return;
+        }
 
-               $page = $this->trimmed('page');
-               
-               if (!$page) {
-                       $page = 1;
-               }
-               
-               # Looks like we're good; show the header
+        $page = $this->trimmed('page');
+        
+        if (!$page) {
+            $page = 1;
+        }
+        
+        # Looks like we're good; show the header
 
-               common_show_header(sprintf(_('Users self-tagged with %s - page %d'), $tag, $page),
-                                                  NULL, $tag, array($this, 'show_top'));
+        common_show_header(sprintf(_('Users self-tagged with %s - page %d'), $tag, $page),
+                           NULL, $tag, array($this, 'show_top'));
 
-               $this->show_people($tag, $page);
+        $this->show_people($tag, $page);
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function show_people($tag, $page) {
-               
-               $profile = new Profile();
+    function show_people($tag, $page) {
+        
+        $profile = new Profile();
 
-               $offset = ($page-1)*PROFILES_PER_PAGE;
-               $limit = PROFILES_PER_PAGE + 1;
-               
-               if (common_config('db','type') == 'pgsql') {
-                       $lim = ' LIMIT ' . $limit . ' OFFSET ' . $offset;
-               } else {
-                       $lim = ' LIMIT ' . $offset . ', ' . $limit;
-               }
+        $offset = ($page-1)*PROFILES_PER_PAGE;
+        $limit = PROFILES_PER_PAGE + 1;
+        
+        if (common_config('db','type') == 'pgsql') {
+            $lim = ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+        } else {
+            $lim = ' LIMIT ' . $offset . ', ' . $limit;
+        }
 
-               # XXX: memcached this
-               
-               $profile->query(sprintf('SELECT profile.* ' .
-                                                               'FROM profile JOIN profile_tag ' .
-                                                               'ON profile.id = profile_tag.tagger ' .
-                                                               'WHERE profile_tag.tagger = profile_tag.tagged ' .
-                                                               'AND tag = "%s" ' .
-                                                               'ORDER BY profile_tag.modified DESC ' . 
-                                                               $lim, $tag));
+        # XXX: memcached this
+        
+        $profile->query(sprintf('SELECT profile.* ' .
+                                'FROM profile JOIN profile_tag ' .
+                                'ON profile.id = profile_tag.tagger ' .
+                                'WHERE profile_tag.tagger = profile_tag.tagged ' .
+                                'AND tag = "%s" ' .
+                                'ORDER BY profile_tag.modified DESC ' . 
+                                $lim, $tag));
 
-               $pl = new ProfileList($profile);
-               $cnt = $pl->show_list();
-               
-               common_pagination($page > 1,
-                                                 $cnt > PROFILES_PER_PAGE,
-                                                 $page,
-                                                 $this->trimmed('action'),
-                                                 array('tag' => $tag));
-       }
-       
-       function show_top($tag) {
-               $instr = sprintf(_('These are users who have tagged themselves "%s" ' .
-                                                  'to show a common interest, characteristic, hobby or job.'), $tag);
-               common_element_start('div', 'instructions');
-               common_element_start('p');
-               common_text($instr);
-               common_element_end('p');
-               common_element_end('div');
-       }
+        $pl = new ProfileList($profile);
+        $cnt = $pl->show_list();
+        
+        common_pagination($page > 1,
+                          $cnt > PROFILES_PER_PAGE,
+                          $page,
+                          $this->trimmed('action'),
+                          array('tag' => $tag));
+    }
+    
+    function show_top($tag) {
+        $instr = sprintf(_('These are users who have tagged themselves "%s" ' .
+                           'to show a common interest, characteristic, hobby or job.'), $tag);
+        common_element_start('div', 'instructions');
+        common_element_start('p');
+        common_text($instr);
+        common_element_end('p');
+        common_element_end('div');
+    }
 
-       function get_title() {
-               return NULL;
-       }
+    function get_title() {
+        return NULL;
+    }
 
-       function show_header($arr) {
-               return;
-       }
+    function show_header($arr) {
+        return;
+    }
 }
index 243081f1222540eb00e7a828c1205e881536d4a5..66e4dc806c618088e9417a2c2567098c5259ced9 100644 (file)
@@ -22,67 +22,67 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/lib/omb.php');
 
 class PostnoticeAction extends Action {
-       function handle($args) {
-               parent::handle($args);
-               try {
-                       common_remove_magic_from_request();
-                       $req = OAuthRequest::from_request();
-                       # Note: server-to-server function!
-                       $server = omb_oauth_server();
-                       list($consumer, $token) = $server->verify_request($req);
-                       if ($this->save_notice($req, $consumer, $token)) {
-                               print "omb_version=".OMB_VERSION_01;
-                       }
-               } catch (OAuthException $e) {
-                       common_server_error($e->getMessage());
-                       return;
-               }
-       }
+    function handle($args) {
+        parent::handle($args);
+        try {
+            common_remove_magic_from_request();
+            $req = OAuthRequest::from_request();
+            # Note: server-to-server function!
+            $server = omb_oauth_server();
+            list($consumer, $token) = $server->verify_request($req);
+            if ($this->save_notice($req, $consumer, $token)) {
+                print "omb_version=".OMB_VERSION_01;
+            }
+        } catch (OAuthException $e) {
+            common_server_error($e->getMessage());
+            return;
+        }
+    }
 
-       function save_notice(&$req, &$consumer, &$token) {
-               $version = $req->get_parameter('omb_version');
-               if ($version != OMB_VERSION_01) {
-                       common_user_error(_('Unsupported OMB version'), 400);
-                       return false;
-               }
-               # First, check to see
-               $listenee =  $req->get_parameter('omb_listenee');
-               $remote_profile = Remote_profile::staticGet('uri', $listenee);
-               if (!$remote_profile) {
-                       common_user_error(_('Profile unknown'), 403);
-                       return false;
-               }
-               $sub = Subscription::staticGet('token', $token->key);
-               if (!$sub) {
-                       common_user_error(_('No such subscription'), 403);
-                       return false;
-               }
-               $content = $req->get_parameter('omb_notice_content');
+    function save_notice(&$req, &$consumer, &$token) {
+        $version = $req->get_parameter('omb_version');
+        if ($version != OMB_VERSION_01) {
+            common_user_error(_('Unsupported OMB version'), 400);
+            return false;
+        }
+        # First, check to see
+        $listenee =  $req->get_parameter('omb_listenee');
+        $remote_profile = Remote_profile::staticGet('uri', $listenee);
+        if (!$remote_profile) {
+            common_user_error(_('Profile unknown'), 403);
+            return false;
+        }
+        $sub = Subscription::staticGet('token', $token->key);
+        if (!$sub) {
+            common_user_error(_('No such subscription'), 403);
+            return false;
+        }
+        $content = $req->get_parameter('omb_notice_content');
         $content_shortened = common_shorten_links($content);
         if (mb_strlen($content_shortened) > 140) {
             common_user_error(_('Invalid notice content'), 400);
             return false;
         }
-               $notice_uri = $req->get_parameter('omb_notice');
-               if (!Validate::uri($notice_uri) &&
-                       !common_valid_tag($notice_uri)) {
-                       common_user_error(_('Invalid notice uri'), 400);
-                       return false;
-               }
-               $notice_url = $req->get_parameter('omb_notice_url');
-               if ($notice_url && !common_valid_http_url($notice_url)) {
-                       common_user_error(_('Invalid notice url'), 400);
-                       return false;
-               }
-               $notice = Notice::staticGet('uri', $notice_uri);
-               if (!$notice) {
-                       $notice = Notice::saveNew($remote_profile->id, $content, 'omb', false, 0, $notice_uri);
-                       if (is_string($notice)) {
-                               common_server_serror($notice, 500);
-                               return false;
-                       }
-                       common_broadcast_notice($notice, true);
-               }
-               return true;
-       }
+        $notice_uri = $req->get_parameter('omb_notice');
+        if (!Validate::uri($notice_uri) &&
+            !common_valid_tag($notice_uri)) {
+            common_user_error(_('Invalid notice uri'), 400);
+            return false;
+        }
+        $notice_url = $req->get_parameter('omb_notice_url');
+        if ($notice_url && !common_valid_http_url($notice_url)) {
+            common_user_error(_('Invalid notice url'), 400);
+            return false;
+        }
+        $notice = Notice::staticGet('uri', $notice_uri);
+        if (!$notice) {
+            $notice = Notice::saveNew($remote_profile->id, $content, 'omb', false, 0, $notice_uri);
+            if (is_string($notice)) {
+                common_server_serror($notice, 500);
+                return false;
+            }
+            common_broadcast_notice($notice, true);
+        }
+        return true;
+    }
 }
index ed2623c9bbedce124bcb8661881583904ef141db..3d92161ab13b29a68c6aeae7c254351cfdc9ef4d 100644 (file)
@@ -23,417 +23,417 @@ require_once(INSTALLDIR.'/lib/settingsaction.php');
 
 class ProfilesettingsAction extends SettingsAction {
 
-       function get_instructions() {
-               return _('You can update your personal profile info here '.
-                                 'so people know more about you.');
-       }
-
-       function show_form($msg=NULL, $success=false) {
-               $this->form_header(_('Profile settings'), $msg, $success);
-               $this->show_settings_form();
-               common_element('h2', NULL, _('Avatar'));
-               $this->show_avatar_form();
-               common_element('h2', NULL, _('Change password'));
-               $this->show_password_form();
-//             common_element('h2', NULL, _('Delete my account'));
-//             $this->show_delete_form();
-               common_show_footer();
-       }
-
-       function handle_post() {
-
-               # CSRF protection
-
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               if ($this->arg('save')) {
-                       $this->save_profile();
-               } else if ($this->arg('upload')) {
-                       $this->upload_avatar();
-               } else if ($this->arg('changepass')) {
-                       $this->change_password();
-               }
-
-       }
-
-       function show_settings_form() {
-
-               $user = common_current_user();
-               $profile = $user->getProfile();
-
-               common_element_start('form', array('method' => 'POST',
-                                                                                  'id' => 'profilesettings',
-                                                                                  'action' =>
-                                                                                  common_local_url('profilesettings')));
-               common_hidden('token', common_session_token());
-               
-               # too much common patterns here... abstractable?
-               
-               common_input('nickname', _('Nickname'),
-                                        ($this->arg('nickname')) ? $this->arg('nickname') : $profile->nickname,
-                                        _('1-64 lowercase letters or numbers, no punctuation or spaces'));
-               common_input('fullname', _('Full name'),
-                                        ($this->arg('fullname')) ? $this->arg('fullname') : $profile->fullname);
-               common_input('homepage', _('Homepage'),
-                                        ($this->arg('homepage')) ? $this->arg('homepage') : $profile->homepage,
-                                        _('URL of your homepage, blog, or profile on another site'));
-               common_textarea('bio', _('Bio'),
-                                               ($this->arg('bio')) ? $this->arg('bio') : $profile->bio,
-                                               _('Describe yourself and your interests in 140 chars'));
-               common_input('location', _('Location'),
-                                        ($this->arg('location')) ? $this->arg('location') : $profile->location,
-                                        _('Where you are, like "City, State (or Region), Country"'));
-               common_input('tags', _('Tags'),
-                                        ($this->arg('tags')) ? $this->arg('tags') : implode(' ', $user->getSelfTags()),
-                                        _('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated'));
-
-               $language = common_language();
-               common_dropdown('language', _('Language'), get_nice_language_list(), _('Preferred language'), TRUE, $language);
-               $timezone = common_timezone();
-               $timezones = array();
-               foreach(DateTimeZone::listIdentifiers() as $k => $v) {
-                       $timezones[$v] = $v;
-               }
-               common_dropdown('timezone', _('Timezone'), $timezones, _('What timezone are you normally in?'), TRUE, $timezone);
-
-               common_checkbox('autosubscribe', _('Automatically subscribe to whoever subscribes to me (best for non-humans)'),
-                                               ($this->arg('autosubscribe')) ? $this->boolean('autosubscribe') : $user->autosubscribe);
-
-               common_submit('save', _('Save'));
-
-               common_element_end('form');
-
-
-       }
-
-       function show_avatar_form() {
-
-               $user = common_current_user();
-               $profile = $user->getProfile();
-
-               if (!$profile) {
-                       common_log_db_error($user, 'SELECT', __FILE__);
-                       $this->server_error(_('User without matching profile'));
-                       return;
-               }
-               
-               $original = $profile->getOriginalAvatar();
-
-
-               common_element_start('form', array('enctype' => 'multipart/form-data',
-                                                                                  'method' => 'POST',
-                                                                                  'id' => 'avatar',
-                                                                                  'action' =>
-                                                                                  common_local_url('profilesettings')));
-               common_hidden('token', common_session_token());
-
-               if ($original) {
-                       common_element('img', array('src' => $original->url,
-                                                                               'class' => 'avatar original',
-                                                                               'width' => $original->width,
-                                                                               'height' => $original->height,
-                                                                               'alt' => $user->nickname));
-               }
-
-               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-
-               if ($avatar) {
-                       common_element('img', array('src' => $avatar->url,
-                                                                               'class' => 'avatar profile',
-                                                                               'width' => AVATAR_PROFILE_SIZE,
-                                                                               'height' => AVATAR_PROFILE_SIZE,
-                                                                               'alt' => $user->nickname));
-               }
-
-
-               common_element('input', array('name' => 'MAX_FILE_SIZE',
-                                                                         'type' => 'hidden',
-                                                                         'id' => 'MAX_FILE_SIZE',
-                                                                         'value' => MAX_AVATAR_SIZE));
-
-               common_element_start('p');
-
-
-               common_element('input', array('name' => 'avatarfile',
-                                                                         'type' => 'file',
-                                                                         'id' => 'avatarfile'));
-               common_element_end('p');
-
-               common_submit('upload', _('Upload'));
-               common_element_end('form');
-
-       }
-
-       function show_password_form() {
-
-               $user = common_current_user();
-               common_element_start('form', array('method' => 'POST',
-                                                                                  'id' => 'password',
-                                                                                  'action' =>
-                                                                                  common_local_url('profilesettings')));
-
-               common_hidden('token', common_session_token());
-
-               # Users who logged in with OpenID won't have a pwd
-               if ($user->password) {
-                       common_password('oldpassword', _('Old password'));
-               }
-               common_password('newpassword', _('New password'),
-                                               _('6 or more characters'));
-               common_password('confirm', _('Confirm'),
-                                               _('same as password above'));
-               common_submit('changepass', _('Change'));
-               common_element_end('form');
-       }
-
-       function save_profile() {
-               $nickname = $this->trimmed('nickname');
-               $fullname = $this->trimmed('fullname');
-               $homepage = $this->trimmed('homepage');
-               $bio = $this->trimmed('bio');
-               $location = $this->trimmed('location');
-               $autosubscribe = $this->boolean('autosubscribe');
-               $language = $this->trimmed('language');
-               $timezone = $this->trimmed('timezone');
-               $tagstring = $this->trimmed('tags');
-               
-               # Some validation
-
-               if (!Validate::string($nickname, array('min_length' => 1,
-                                                                                          'max_length' => 64,
-                                                                                          'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
-                       $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
-                       return;
-               } else if (!User::allowed_nickname($nickname)) {
-                       $this->show_form(_('Not a valid nickname.'));
-                       return;
-               } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
-                                  !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) {
-                       $this->show_form(_('Homepage is not a valid URL.'));
-                       return;
-               } else if (!is_null($fullname) && strlen($fullname) > 255) {
-                       $this->show_form(_('Full name is too long (max 255 chars).'));
-                       return;
-               } else if (!is_null($bio) && strlen($bio) > 140) {
-                       $this->show_form(_('Bio is too long (max 140 chars).'));
-                       return;
-               } else if (!is_null($location) && strlen($location) > 255) {
-                       $this->show_form(_('Location is too long (max 255 chars).'));
-                       return;
-               }  else if (is_null($timezone) || !in_array($timezone, DateTimeZone::listIdentifiers())) {
-                       $this->show_form(_('Timezone not selected.'));
-                       return;
-               } else if ($this->nickname_exists($nickname)) {
-                       $this->show_form(_('Nickname already in use. Try another one.'));
-                       return;
+    function get_instructions() {
+        return _('You can update your personal profile info here '.
+                  'so people know more about you.');
+    }
+
+    function show_form($msg=NULL, $success=false) {
+        $this->form_header(_('Profile settings'), $msg, $success);
+        $this->show_settings_form();
+        common_element('h2', NULL, _('Avatar'));
+        $this->show_avatar_form();
+        common_element('h2', NULL, _('Change password'));
+        $this->show_password_form();
+//        common_element('h2', NULL, _('Delete my account'));
+//        $this->show_delete_form();
+        common_show_footer();
+    }
+
+    function handle_post() {
+
+        # CSRF protection
+
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        if ($this->arg('save')) {
+            $this->save_profile();
+        } else if ($this->arg('upload')) {
+            $this->upload_avatar();
+        } else if ($this->arg('changepass')) {
+            $this->change_password();
+        }
+
+    }
+
+    function show_settings_form() {
+
+        $user = common_current_user();
+        $profile = $user->getProfile();
+
+        common_element_start('form', array('method' => 'POST',
+                                           'id' => 'profilesettings',
+                                           'action' =>
+                                           common_local_url('profilesettings')));
+        common_hidden('token', common_session_token());
+        
+        # too much common patterns here... abstractable?
+        
+        common_input('nickname', _('Nickname'),
+                     ($this->arg('nickname')) ? $this->arg('nickname') : $profile->nickname,
+                     _('1-64 lowercase letters or numbers, no punctuation or spaces'));
+        common_input('fullname', _('Full name'),
+                     ($this->arg('fullname')) ? $this->arg('fullname') : $profile->fullname);
+        common_input('homepage', _('Homepage'),
+                     ($this->arg('homepage')) ? $this->arg('homepage') : $profile->homepage,
+                     _('URL of your homepage, blog, or profile on another site'));
+        common_textarea('bio', _('Bio'),
+                        ($this->arg('bio')) ? $this->arg('bio') : $profile->bio,
+                        _('Describe yourself and your interests in 140 chars'));
+        common_input('location', _('Location'),
+                     ($this->arg('location')) ? $this->arg('location') : $profile->location,
+                     _('Where you are, like "City, State (or Region), Country"'));
+        common_input('tags', _('Tags'),
+                     ($this->arg('tags')) ? $this->arg('tags') : implode(' ', $user->getSelfTags()),
+                     _('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated'));
+
+        $language = common_language();
+        common_dropdown('language', _('Language'), get_nice_language_list(), _('Preferred language'), TRUE, $language);
+        $timezone = common_timezone();
+        $timezones = array();
+        foreach(DateTimeZone::listIdentifiers() as $k => $v) {
+            $timezones[$v] = $v;
+        }
+        common_dropdown('timezone', _('Timezone'), $timezones, _('What timezone are you normally in?'), TRUE, $timezone);
+
+        common_checkbox('autosubscribe', _('Automatically subscribe to whoever subscribes to me (best for non-humans)'),
+                        ($this->arg('autosubscribe')) ? $this->boolean('autosubscribe') : $user->autosubscribe);
+
+        common_submit('save', _('Save'));
+
+        common_element_end('form');
+
+
+    }
+
+    function show_avatar_form() {
+
+        $user = common_current_user();
+        $profile = $user->getProfile();
+
+        if (!$profile) {
+            common_log_db_error($user, 'SELECT', __FILE__);
+            $this->server_error(_('User without matching profile'));
+            return;
+        }
+        
+        $original = $profile->getOriginalAvatar();
+
+
+        common_element_start('form', array('enctype' => 'multipart/form-data',
+                                           'method' => 'POST',
+                                           'id' => 'avatar',
+                                           'action' =>
+                                           common_local_url('profilesettings')));
+        common_hidden('token', common_session_token());
+
+        if ($original) {
+            common_element('img', array('src' => $original->url,
+                                        'class' => 'avatar original',
+                                        'width' => $original->width,
+                                        'height' => $original->height,
+                                        'alt' => $user->nickname));
+        }
+
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+
+        if ($avatar) {
+            common_element('img', array('src' => $avatar->url,
+                                        'class' => 'avatar profile',
+                                        'width' => AVATAR_PROFILE_SIZE,
+                                        'height' => AVATAR_PROFILE_SIZE,
+                                        'alt' => $user->nickname));
+        }
+
+
+        common_element('input', array('name' => 'MAX_FILE_SIZE',
+                                      'type' => 'hidden',
+                                      'id' => 'MAX_FILE_SIZE',
+                                      'value' => MAX_AVATAR_SIZE));
+
+        common_element_start('p');
+
+
+        common_element('input', array('name' => 'avatarfile',
+                                      'type' => 'file',
+                                      'id' => 'avatarfile'));
+        common_element_end('p');
+
+        common_submit('upload', _('Upload'));
+        common_element_end('form');
+
+    }
+
+    function show_password_form() {
+
+        $user = common_current_user();
+        common_element_start('form', array('method' => 'POST',
+                                           'id' => 'password',
+                                           'action' =>
+                                           common_local_url('profilesettings')));
+
+        common_hidden('token', common_session_token());
+
+        # Users who logged in with OpenID won't have a pwd
+        if ($user->password) {
+            common_password('oldpassword', _('Old password'));
+        }
+        common_password('newpassword', _('New password'),
+                        _('6 or more characters'));
+        common_password('confirm', _('Confirm'),
+                        _('same as password above'));
+        common_submit('changepass', _('Change'));
+        common_element_end('form');
+    }
+
+    function save_profile() {
+        $nickname = $this->trimmed('nickname');
+        $fullname = $this->trimmed('fullname');
+        $homepage = $this->trimmed('homepage');
+        $bio = $this->trimmed('bio');
+        $location = $this->trimmed('location');
+        $autosubscribe = $this->boolean('autosubscribe');
+        $language = $this->trimmed('language');
+        $timezone = $this->trimmed('timezone');
+        $tagstring = $this->trimmed('tags');
+        
+        # Some validation
+
+        if (!Validate::string($nickname, array('min_length' => 1,
+                                               'max_length' => 64,
+                                               'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+            $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
+            return;
+        } else if (!User::allowed_nickname($nickname)) {
+            $this->show_form(_('Not a valid nickname.'));
+            return;
+        } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
+                   !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) {
+            $this->show_form(_('Homepage is not a valid URL.'));
+            return;
+        } else if (!is_null($fullname) && strlen($fullname) > 255) {
+            $this->show_form(_('Full name is too long (max 255 chars).'));
+            return;
+        } else if (!is_null($bio) && strlen($bio) > 140) {
+            $this->show_form(_('Bio is too long (max 140 chars).'));
+            return;
+        } else if (!is_null($location) && strlen($location) > 255) {
+            $this->show_form(_('Location is too long (max 255 chars).'));
+            return;
+        }  else if (is_null($timezone) || !in_array($timezone, DateTimeZone::listIdentifiers())) {
+            $this->show_form(_('Timezone not selected.'));
+            return;
+        } else if ($this->nickname_exists($nickname)) {
+            $this->show_form(_('Nickname already in use. Try another one.'));
+            return;
         } else if (!is_null($language) && strlen($language) > 50) {
-               $this->show_form(_('Language is too long (max 50 chars).'));
-                       return;
-               }
-
-               if ($tagstring) {
-                       $tags = array_map('common_canonical_tag', preg_split('/[\s,]+/', $tagstring));
-               } else {
-                       $tags = array();
-               }
-                       
-               foreach ($tags as $tag) {
-                       if (!common_valid_profile_tag($tag)) {
-                               $this->show_form(sprintf(_('Invalid tag: "%s"'), $tag));
-                               return;
-                       }
-               }
-               
-               $user = common_current_user();
-
-               $user->query('BEGIN');
-
-               if ($user->nickname != $nickname ||
-                       $user->language != $language ||
-                       $user->timezone != $timezone) {
-
-                       common_debug('Updating user nickname from ' . $user->nickname . ' to ' . $nickname,
-                                                __FILE__);
-                       common_debug('Updating user language from ' . $user->language . ' to ' . $language,
-                                                __FILE__);
-                       common_debug('Updating user timezone from ' . $user->timezone . ' to ' . $timezone,
-                                                __FILE__);
-
-                       $original = clone($user);
-
-                       $user->nickname = $nickname;
-                       $user->language = $language;
-                       $user->timezone = $timezone;
-
-                       $result = $user->updateKeys($original);
-
-                       if ($result === FALSE) {
-                               common_log_db_error($user, 'UPDATE', __FILE__);
-                               common_server_error(_('Couldn\'t update user.'));
-                               return;
-                       } else {
-                               # Re-initialize language environment if it changed
-                               common_init_language();
-                       }
-               }
-
-               # XXX: XOR
-
-               if ($user->autosubscribe ^ $autosubscribe) {
-
-                       $original = clone($user);
-
-                       $user->autosubscribe = $autosubscribe;
-
-                       $result = $user->update($original);
-
-                       if ($result === FALSE) {
-                               common_log_db_error($user, 'UPDATE', __FILE__);
-                               common_server_error(_('Couldn\'t update user for autosubscribe.'));
-                               return;
-                       }
-               }
-
-               $profile = $user->getProfile();
-
-               $orig_profile = clone($profile);
-
-               $profile->nickname = $user->nickname;
-               $profile->fullname = $fullname;
-               $profile->homepage = $homepage;
-               $profile->bio = $bio;
-               $profile->location = $location;
-               $profile->profileurl = common_profile_url($nickname);
-
-               common_debug('Old profile: ' . common_log_objstring($orig_profile), __FILE__);
-               common_debug('New profile: ' . common_log_objstring($profile), __FILE__);
-
-               $result = $profile->update($orig_profile);
-
-               if (!$result) {
-                       common_log_db_error($profile, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t save profile.'));
-                       return;
-               }
-
-               # Set the user tags
-               
-               $result = $user->setSelfTags($tags);
-
-               if (!$result) {
-                       common_server_error(_('Couldn\'t save tags.'));
-                       return;
-               }
-               
-               $user->query('COMMIT');
-
-               common_broadcast_profile($profile);
-
-               $this->show_form(_('Settings saved.'), TRUE);
-       }
-
-
-       function upload_avatar() {
-               switch ($_FILES['avatarfile']['error']) {
-                case UPLOAD_ERR_OK: # success, jump out
-                       break;
-                case UPLOAD_ERR_INI_SIZE:
-                case UPLOAD_ERR_FORM_SIZE:
-                       $this->show_form(_('That file is too big.'));
-                       return;
-                case UPLOAD_ERR_PARTIAL:
-                       @unlink($_FILES['avatarfile']['tmp_name']);
-                       $this->show_form(_('Partial upload.'));
-                       return;
-                default:
-                       $this->show_form(_('System error uploading file.'));
-                       return;
-               }
-
-               $info = @getimagesize($_FILES['avatarfile']['tmp_name']);
-
-               if (!$info) {
-                       @unlink($_FILES['avatarfile']['tmp_name']);
-                       $this->show_form(_('Not an image or corrupt file.'));
-                       return;
-               }
-
-               switch ($info[2]) {
-                case IMAGETYPE_GIF:
-                case IMAGETYPE_JPEG:
-                case IMAGETYPE_PNG:
-                       break;
-                default:
-                       $this->show_form(_('Unsupported image file format.'));
-                       return;
-               }
-
-               $user = common_current_user();
-               $profile = $user->getProfile();
-
-               if ($profile->setOriginal($_FILES['avatarfile']['tmp_name'])) {
-                       $this->show_form(_('Avatar updated.'), true);
-               } else {
-                       $this->show_form(_('Failed updating avatar.'));
-               }
-
-               @unlink($_FILES['avatarfile']['tmp_name']);
-       }
-
-       function nickname_exists($nickname) {
-               $user = common_current_user();
-               $other = User::staticGet('nickname', $nickname);
-               if (!$other) {
-                       return false;
-               } else {
-                       return $other->id != $user->id;
-               }
-       }
-
-       function change_password() {
-
-               $user = common_current_user();
-               assert(!is_null($user)); # should already be checked
-
-               # FIXME: scrub input
-
-               $newpassword = $this->arg('newpassword');
-               $confirm = $this->arg('confirm');
-               $token = $this->arg('token');
-
-               if (0 != strcmp($newpassword, $confirm)) {
-                       $this->show_form(_('Passwords don\'t match.'));
-                       return;
-               }
-
-               if ($user->password) {
-                       $oldpassword = $this->arg('oldpassword');
-
-                       if (!common_check_user($user->nickname, $oldpassword)) {
-                               $this->show_form(_('Incorrect old password'));
-                               return;
-                       }
-               }
-
-               $original = clone($user);
-
-               $user->password = common_munge_password($newpassword, $user->id);
-
-               $val = $user->validate();
-               if ($val !== TRUE) {
-                       $this->show_form(_('Error saving user; invalid.'));
-                       return;
-               }
-
-               if (!$user->update($original)) {
-                       common_server_error(_('Can\'t save new password.'));
-                       return;
-               }
-
-               $this->show_form(_('Password saved.'), true);
-       }
+            $this->show_form(_('Language is too long (max 50 chars).'));
+            return;
+        }
+
+        if ($tagstring) {
+            $tags = array_map('common_canonical_tag', preg_split('/[\s,]+/', $tagstring));
+        } else {
+            $tags = array();
+        }
+            
+        foreach ($tags as $tag) {
+            if (!common_valid_profile_tag($tag)) {
+                $this->show_form(sprintf(_('Invalid tag: "%s"'), $tag));
+                return;
+            }
+        }
+        
+        $user = common_current_user();
+
+        $user->query('BEGIN');
+
+        if ($user->nickname != $nickname ||
+            $user->language != $language ||
+            $user->timezone != $timezone) {
+
+            common_debug('Updating user nickname from ' . $user->nickname . ' to ' . $nickname,
+                         __FILE__);
+            common_debug('Updating user language from ' . $user->language . ' to ' . $language,
+                         __FILE__);
+            common_debug('Updating user timezone from ' . $user->timezone . ' to ' . $timezone,
+                         __FILE__);
+
+            $original = clone($user);
+
+            $user->nickname = $nickname;
+            $user->language = $language;
+            $user->timezone = $timezone;
+
+            $result = $user->updateKeys($original);
+
+            if ($result === FALSE) {
+                common_log_db_error($user, 'UPDATE', __FILE__);
+                common_server_error(_('Couldn\'t update user.'));
+                return;
+            } else {
+                # Re-initialize language environment if it changed
+                common_init_language();
+            }
+        }
+
+        # XXX: XOR
+
+        if ($user->autosubscribe ^ $autosubscribe) {
+
+            $original = clone($user);
+
+            $user->autosubscribe = $autosubscribe;
+
+            $result = $user->update($original);
+
+            if ($result === FALSE) {
+                common_log_db_error($user, 'UPDATE', __FILE__);
+                common_server_error(_('Couldn\'t update user for autosubscribe.'));
+                return;
+            }
+        }
+
+        $profile = $user->getProfile();
+
+        $orig_profile = clone($profile);
+
+        $profile->nickname = $user->nickname;
+        $profile->fullname = $fullname;
+        $profile->homepage = $homepage;
+        $profile->bio = $bio;
+        $profile->location = $location;
+        $profile->profileurl = common_profile_url($nickname);
+
+        common_debug('Old profile: ' . common_log_objstring($orig_profile), __FILE__);
+        common_debug('New profile: ' . common_log_objstring($profile), __FILE__);
+
+        $result = $profile->update($orig_profile);
+
+        if (!$result) {
+            common_log_db_error($profile, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t save profile.'));
+            return;
+        }
+
+        # Set the user tags
+        
+        $result = $user->setSelfTags($tags);
+
+        if (!$result) {
+            common_server_error(_('Couldn\'t save tags.'));
+            return;
+        }
+        
+        $user->query('COMMIT');
+
+        common_broadcast_profile($profile);
+
+        $this->show_form(_('Settings saved.'), TRUE);
+    }
+
+
+    function upload_avatar() {
+        switch ($_FILES['avatarfile']['error']) {
+         case UPLOAD_ERR_OK: # success, jump out
+            break;
+         case UPLOAD_ERR_INI_SIZE:
+         case UPLOAD_ERR_FORM_SIZE:
+            $this->show_form(_('That file is too big.'));
+            return;
+         case UPLOAD_ERR_PARTIAL:
+            @unlink($_FILES['avatarfile']['tmp_name']);
+            $this->show_form(_('Partial upload.'));
+            return;
+         default:
+            $this->show_form(_('System error uploading file.'));
+            return;
+        }
+
+        $info = @getimagesize($_FILES['avatarfile']['tmp_name']);
+
+        if (!$info) {
+            @unlink($_FILES['avatarfile']['tmp_name']);
+            $this->show_form(_('Not an image or corrupt file.'));
+            return;
+        }
+
+        switch ($info[2]) {
+         case IMAGETYPE_GIF:
+         case IMAGETYPE_JPEG:
+         case IMAGETYPE_PNG:
+            break;
+         default:
+            $this->show_form(_('Unsupported image file format.'));
+            return;
+        }
+
+        $user = common_current_user();
+        $profile = $user->getProfile();
+
+        if ($profile->setOriginal($_FILES['avatarfile']['tmp_name'])) {
+            $this->show_form(_('Avatar updated.'), true);
+        } else {
+            $this->show_form(_('Failed updating avatar.'));
+        }
+
+        @unlink($_FILES['avatarfile']['tmp_name']);
+    }
+
+    function nickname_exists($nickname) {
+        $user = common_current_user();
+        $other = User::staticGet('nickname', $nickname);
+        if (!$other) {
+            return false;
+        } else {
+            return $other->id != $user->id;
+        }
+    }
+
+    function change_password() {
+
+        $user = common_current_user();
+        assert(!is_null($user)); # should already be checked
+
+        # FIXME: scrub input
+
+        $newpassword = $this->arg('newpassword');
+        $confirm = $this->arg('confirm');
+        $token = $this->arg('token');
+
+        if (0 != strcmp($newpassword, $confirm)) {
+            $this->show_form(_('Passwords don\'t match.'));
+            return;
+        }
+
+        if ($user->password) {
+            $oldpassword = $this->arg('oldpassword');
+
+            if (!common_check_user($user->nickname, $oldpassword)) {
+                $this->show_form(_('Incorrect old password'));
+                return;
+            }
+        }
+
+        $original = clone($user);
+
+        $user->password = common_munge_password($newpassword, $user->id);
+
+        $val = $user->validate();
+        if ($val !== TRUE) {
+            $this->show_form(_('Error saving user; invalid.'));
+            return;
+        }
+
+        if (!$user->update($original)) {
+            common_server_error(_('Can\'t save new password.'));
+            return;
+        }
+
+        $this->show_form(_('Password saved.'), true);
+    }
 }
index 218f801945d6048a2fab29464ae3e641649971ea..422e4bc98c7fdc815bf80a279eefb48a4dcb63f9 100644 (file)
@@ -23,77 +23,77 @@ require_once(INSTALLDIR.'/lib/stream.php');
 
 class PublicAction extends StreamAction {
 
-       function handle($args) {
-               parent::handle($args);
-
-               $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
-
-               header('X-XRDS-Location: '. common_local_url('publicxrds'));
-
-               common_show_header(_('Public timeline'),
-                                                  array($this, 'show_header'), NULL,
-                                                  array($this, 'show_top'));
-
-               # XXX: Public sidebar here?
-
-               $this->show_notices($page);
-
-               common_show_footer();
-       }
-
-       function show_top() {
-               if (common_logged_in()) {
-                       common_notice_form('public');
-               } else {
-                       $instr = $this->get_instructions();
-                       $output = common_markup_to_html($instr);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-               }
-
-               $this->public_views_menu();
-
-               $this->show_feeds_list(array(0=>array('href'=>common_local_url('publicrss'),
-                                                                                         'type' => 'rss',
-                                                                                         'version' => 'RSS 1.0',
-                                                                                         'item' => 'publicrss'),
-                                                                        1=>array('href'=>common_local_url('publicatom'),
-                                                                                         'type' => 'atom',
-                                                                                         'version' => 'Atom 1.0',
-                                                                                         'item' => 'publicatom')));
-       }
-
-       function get_instructions() {
-               return _('This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
-                                'based on the Free Software [Laconica](http://laconi.ca/) tool. ' .
-                                '[Join now](%%action.register%%) to share notices about yourself with friends, family, and colleagues! ([Read more](%%doc.help%%))');
-       }
-
-       function show_header() {
-               common_element('link', array('rel' => 'alternate',
-                                                                        'href' => common_local_url('publicrss'),
-                                                                        'type' => 'application/rss+xml',
-                                                                        'title' => _('Public Stream Feed')));
-               # for client side of OpenID authentication
-               common_element('meta', array('http-equiv' => 'X-XRDS-Location',
-                                                                        'content' => common_local_url('publicxrds')));
-       }
-
-       function show_notices($page) {
-
-               $cnt = 0;
-               $notice = Notice::publicStream(($page-1)*NOTICES_PER_PAGE,
-                                                                          NOTICES_PER_PAGE + 1);
-
-               if (!$notice) {
+    function handle($args) {
+        parent::handle($args);
+
+        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+
+        header('X-XRDS-Location: '. common_local_url('publicxrds'));
+
+        common_show_header(_('Public timeline'),
+                           array($this, 'show_header'), NULL,
+                           array($this, 'show_top'));
+
+        # XXX: Public sidebar here?
+
+        $this->show_notices($page);
+
+        common_show_footer();
+    }
+
+    function show_top() {
+        if (common_logged_in()) {
+            common_notice_form('public');
+        } else {
+            $instr = $this->get_instructions();
+            $output = common_markup_to_html($instr);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('div');
+        }
+
+        $this->public_views_menu();
+
+        $this->show_feeds_list(array(0=>array('href'=>common_local_url('publicrss'),
+                                              'type' => 'rss',
+                                              'version' => 'RSS 1.0',
+                                              'item' => 'publicrss'),
+                                     1=>array('href'=>common_local_url('publicatom'),
+                                              'type' => 'atom',
+                                              'version' => 'Atom 1.0',
+                                              'item' => 'publicatom')));
+    }
+
+    function get_instructions() {
+        return _('This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
+                 'based on the Free Software [Laconica](http://laconi.ca/) tool. ' .
+                 '[Join now](%%action.register%%) to share notices about yourself with friends, family, and colleagues! ([Read more](%%doc.help%%))');
+    }
+
+    function show_header() {
+        common_element('link', array('rel' => 'alternate',
+                                     'href' => common_local_url('publicrss'),
+                                     'type' => 'application/rss+xml',
+                                     'title' => _('Public Stream Feed')));
+        # for client side of OpenID authentication
+        common_element('meta', array('http-equiv' => 'X-XRDS-Location',
+                                     'content' => common_local_url('publicxrds')));
+    }
+
+    function show_notices($page) {
+
+        $cnt = 0;
+        $notice = Notice::publicStream(($page-1)*NOTICES_PER_PAGE,
+                                       NOTICES_PER_PAGE + 1);
+
+        if (!$notice) {
             $this->server_error(_('Could not retrieve public stream.'));
             return;
-               }
+        }
 
         $cnt = $this->show_notice_list($notice);
 
-               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'public');
-       }
+        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'public');
+    }
 }
index 1ab6a8be06aa4214397ce5844a5d536e23fed535..fa86de1d96edaaa8167f59676effaf109bd63d1e 100644 (file)
@@ -25,33 +25,33 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class PublicrssAction extends Rss10Action {
 
-       function init() {
-               return true;
-       }
-
-       function get_notices($limit=0) {
-               
-               $notices = array();
-               
-               $notice = Notice::publicStream(0, ($limit == 0) ? 48 : $limit);
-               
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
-               
-               return $notices;
-       }
-
-       function get_channel() {
-               global $config;
-               $c = array('url' => common_local_url('publicrss'),
-                                  'title' => sprintf(_('%s Public Stream'), $config['site']['name']),
-                                  'link' => common_local_url('public'),
-                                  'description' => sprintf(_('All updates for %s'), $config['site']['name']));
-               return $c;
-       }
-
-       function get_image() {
-               return NULL;
-       }
+    function init() {
+        return true;
+    }
+
+    function get_notices($limit=0) {
+        
+        $notices = array();
+        
+        $notice = Notice::publicStream(0, ($limit == 0) ? 48 : $limit);
+        
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
+        
+        return $notices;
+    }
+
+    function get_channel() {
+        global $config;
+        $c = array('url' => common_local_url('publicrss'),
+                   'title' => sprintf(_('%s Public Stream'), $config['site']['name']),
+                   'link' => common_local_url('public'),
+                   'description' => sprintf(_('All updates for %s'), $config['site']['name']));
+        return $c;
+    }
+
+    function get_image() {
+        return NULL;
+    }
 }
\ No newline at end of file
index 951434c8783015f114079d75fd038cfd85e75522..ffd65c8c94f13228ce28d84dfe6b5d3a5028def7 100644 (file)
@@ -25,55 +25,55 @@ require_once(INSTALLDIR.'/lib/openid.php');
 
 class PublicxrdsAction extends Action {
 
-       function is_readonly() {
-               return true;
-       }
+    function is_readonly() {
+        return true;
+    }
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               header('Content-Type: application/xrds+xml');
+        header('Content-Type: application/xrds+xml');
 
-               common_start_xml();
-               common_element_start('XRDS', array('xmlns' => 'xri://$xrds'));
+        common_start_xml();
+        common_element_start('XRDS', array('xmlns' => 'xri://$xrds'));
 
-               common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
-                                                                                 'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
-                                                                                 'version' => '2.0'));
+        common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
+                                          'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
+                                          'version' => '2.0'));
 
-               common_element('Type', NULL, 'xri://$xrds*simple');
+        common_element('Type', NULL, 'xri://$xrds*simple');
 
-               foreach (array('finishopenidlogin', 'finishaddopenid', 'finishimmediate') as $finish) {
-                       $this->show_service(Auth_OpenID_RP_RETURN_TO_URL_TYPE,
-                                                               common_local_url($finish));
-               }
+        foreach (array('finishopenidlogin', 'finishaddopenid', 'finishimmediate') as $finish) {
+            $this->show_service(Auth_OpenID_RP_RETURN_TO_URL_TYPE,
+                                common_local_url($finish));
+        }
 
-               common_element_end('XRD');
+        common_element_end('XRD');
 
-               common_element_end('XRDS');
-               common_end_xml();
-       }
+        common_element_end('XRDS');
+        common_end_xml();
+    }
 
-       function show_service($type, $uri, $params=NULL, $sigs=NULL, $localId=NULL) {
-               common_element_start('Service');
-               if ($uri) {
-                       common_element('URI', NULL, $uri);
-               }
-               common_element('Type', NULL, $type);
-               if ($params) {
-                       foreach ($params as $param) {
-                               common_element('Type', NULL, $param);
-                       }
-               }
-               if ($sigs) {
-                       foreach ($sigs as $sig) {
-                               common_element('Type', NULL, $sig);
-                       }
-               }
-               if ($localId) {
-                       common_element('LocalID', NULL, $localId);
-               }
-               common_element_end('Service');
-       }
+    function show_service($type, $uri, $params=NULL, $sigs=NULL, $localId=NULL) {
+        common_element_start('Service');
+        if ($uri) {
+            common_element('URI', NULL, $uri);
+        }
+        common_element('Type', NULL, $type);
+        if ($params) {
+            foreach ($params as $param) {
+                common_element('Type', NULL, $param);
+            }
+        }
+        if ($sigs) {
+            foreach ($sigs as $sig) {
+                common_element('Type', NULL, $sig);
+            }
+        }
+        if ($localId) {
+            common_element('LocalID', NULL, $localId);
+        }
+        common_element_end('Service');
+    }
 }
\ No newline at end of file
index 38c42f41d1b056ac303f723dd324ce7391d3fd82..1263fee9b41a912036f0f5e742faa791cdb5c57c 100644 (file)
@@ -28,304 +28,304 @@ class RecoverpasswordAction extends Action {
     function handle($args) {
         parent::handle($args);
         if (common_logged_in()) {
-                       $this->client_error(_('You are already logged in!'));
+            $this->client_error(_('You are already logged in!'));
             return;
         } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-               if ($this->arg('recover')) {
-               $this->recover_password();
+            if ($this->arg('recover')) {
+                $this->recover_password();
             } else if ($this->arg('reset')) {
-               $this->reset_password();
-                       } else {
-                               $this->client_error(_('Unexpected form submission.'));
-                       }
-               } else {
-                       if ($this->trimmed('code')) {
-                       $this->check_code();
-               } else {
-                       $this->show_form();
-                       }
-               }
-       }
-
-       function check_code() {
-
-               $code = $this->trimmed('code');
-               $confirm = Confirm_address::staticGet('code', $code);
-
-               if (!$confirm) {
-                       $this->client_error(_('No such recovery code.'));
-                       return;
-               }
-               if ($confirm->address_type != 'recover') {
-                       $this->client_error(_('Not a recovery code.'));
-                       return;
-               }
-
-               $user = User::staticGet($confirm->user_id);
-
-               if (!$user) {
-                       $this->server_error(_('Recovery code for unknown user.'));
-                       return;
-               }
-
-               $touched = strtotime($confirm->modified);
-               $email = $confirm->address;
-
-               # Burn this code
-
-               $result = $confirm->delete();
-
-               if (!$result) {
-                       common_log_db_error($confirm, 'DELETE', __FILE__);
-                       common_server_error(_('Error with confirmation code.'));
-                       return;
-               }
-
-               # These should be reaped, but for now we just check mod time
-               # Note: it's still deleted; let's avoid a second attempt!
-
-               if ((time() - $touched) > MAX_RECOVERY_TIME) {
-                       common_log(LOG_WARNING, 
-                                          'Attempted redemption on recovery code ' .
-                                          'that is ' . $touched . ' seconds old. ');
-                       $this->client_error(_('This confirmation code is too old. ' .
-                                              'Please start again.'));
-                       return;
-               }
-
-               # If we used an outstanding confirmation to send the email,
-               # it's been confirmed at this point.
-
-               if (!$user->email) {
-                       $orig = clone($user);
-                       $user->email = $email;
-                       $result = $user->updateKeys($orig);
-                       if (!$result) {
-                               common_log_db_error($user, 'UPDATE', __FILE__);
-                               $this->server_error(_('Could not update user with confirmed email address.'));
-                               return;
-                       }
-               }
-
-               # Success!
-
-               $this->set_temp_user($user);
-               $this->show_password_form();
-       }
-
-       function set_temp_user(&$user) {
-               common_ensure_session();
-               $_SESSION['tempuser'] = $user->id;
-       }
-
-       function get_temp_user() {
-               common_ensure_session();
-               $user_id = $_SESSION['tempuser'];
-               if ($user_id) {
-                       $user = User::staticGet($user_id);
-               }
-               return $user;
-       }
-
-       function clear_temp_user() {
-               common_ensure_session();
-               unset($_SESSION['tempuser']);
-       }
-
-       function show_top($msg=NULL) {
-               if ($msg) {
+                $this->reset_password();
+            } else {
+                $this->client_error(_('Unexpected form submission.'));
+            }
+        } else {
+            if ($this->trimmed('code')) {
+                $this->check_code();
+            } else {
+                $this->show_form();
+            }
+        }
+    }
+
+    function check_code() {
+
+        $code = $this->trimmed('code');
+        $confirm = Confirm_address::staticGet('code', $code);
+
+        if (!$confirm) {
+            $this->client_error(_('No such recovery code.'));
+            return;
+        }
+        if ($confirm->address_type != 'recover') {
+            $this->client_error(_('Not a recovery code.'));
+            return;
+        }
+
+        $user = User::staticGet($confirm->user_id);
+
+        if (!$user) {
+            $this->server_error(_('Recovery code for unknown user.'));
+            return;
+        }
+
+        $touched = strtotime($confirm->modified);
+        $email = $confirm->address;
+
+        # Burn this code
+
+        $result = $confirm->delete();
+
+        if (!$result) {
+            common_log_db_error($confirm, 'DELETE', __FILE__);
+            common_server_error(_('Error with confirmation code.'));
+            return;
+        }
+
+        # These should be reaped, but for now we just check mod time
+        # Note: it's still deleted; let's avoid a second attempt!
+
+        if ((time() - $touched) > MAX_RECOVERY_TIME) {
+            common_log(LOG_WARNING, 
+                       'Attempted redemption on recovery code ' .
+                       'that is ' . $touched . ' seconds old. ');
+            $this->client_error(_('This confirmation code is too old. ' .
+                                   'Please start again.'));
+            return;
+        }
+
+        # If we used an outstanding confirmation to send the email,
+        # it's been confirmed at this point.
+
+        if (!$user->email) {
+            $orig = clone($user);
+            $user->email = $email;
+            $result = $user->updateKeys($orig);
+            if (!$result) {
+                common_log_db_error($user, 'UPDATE', __FILE__);
+                $this->server_error(_('Could not update user with confirmed email address.'));
+                return;
+            }
+        }
+
+        # Success!
+
+        $this->set_temp_user($user);
+        $this->show_password_form();
+    }
+
+    function set_temp_user(&$user) {
+        common_ensure_session();
+        $_SESSION['tempuser'] = $user->id;
+    }
+
+    function get_temp_user() {
+        common_ensure_session();
+        $user_id = $_SESSION['tempuser'];
+        if ($user_id) {
+            $user = User::staticGet($user_id);
+        }
+        return $user;
+    }
+
+    function clear_temp_user() {
+        common_ensure_session();
+        unset($_SESSION['tempuser']);
+    }
+
+    function show_top($msg=NULL) {
+        if ($msg) {
             common_element('div', 'error', $msg);
-               } else {
-                       common_element_start('div', 'instructions');
-                       common_element('p', NULL, 
-                                                  _('If you\'ve forgotten or lost your' .
-                                                     ' password, you can get a new one sent to' .
-                                                     ' the email address you have stored ' .
-                                                     ' in your account.'));
-                       common_element_end('div');
-               }
-       }
-
-       function show_password_top($msg=NULL) {
-               if ($msg) {
+        } else {
+            common_element_start('div', 'instructions');
+            common_element('p', NULL, 
+                           _('If you\'ve forgotten or lost your' .
+                              ' password, you can get a new one sent to' .
+                              ' the email address you have stored ' .
+                              ' in your account.'));
+            common_element_end('div');
+        }
+    }
+
+    function show_password_top($msg=NULL) {
+        if ($msg) {
             common_element('div', 'error', $msg);
-               } else {
-                       common_element('div', 'instructions',
-                                                  _('You\'ve been identified. Enter a ' .
-                                                     ' new password below. '));
-               }
-       }
-
-       function show_form($msg=NULL) {
-
-               common_show_header(_('Recover password'), NULL,
-               $msg, array($this, 'show_top'));
-
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'recoverpassword',
-                                                                                  'action' => common_local_url('recoverpassword')));
-               common_input('nicknameoremail', _('Nickname or email'),
-                                        $this->trimmed('nicknameoremail'),
-                            _('Your nickname on this server, ' .
-                               'or your registered email address.'));
-               common_submit('recover', _('Recover'));
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function show_password_form($msg=NULL) {
-
-               common_show_header(_('Reset password'), NULL,
-               $msg, array($this, 'show_password_top'));
-
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'recoverpassword',
-                                                                                  'action' => common_local_url('recoverpassword')));
-               common_hidden('token', common_session_token());
-               common_password('newpassword', _('New password'),
-                                               _('6 or more characters, and don\'t forget it!'));
-               common_password('confirm', _('Confirm'),
-                                               _('Same as password above'));
-               common_submit('reset', _('Reset'));
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function recover_password() {
-               $nore = $this->trimmed('nicknameoremail');
-               if (!$nore) {
-                       $this->show_form(_('Enter a nickname or email address.'));
-                       return;
-               }
-
-               $user = User::staticGet('email', common_canonical_email($nore));
-
-               if (!$user) {
-                       $user = User::staticGet('nickname', common_canonical_nickname($nore));
-               }
-
-               # See if it's an unconfirmed email address
-
-               if (!$user) {
-                       $confirm_email = Confirm_address::staticGet('address', common_canonical_email($nore));
-                       if ($confirm_email && $confirm_email->address_type == 'email') {
-                               $user = User::staticGet($confirm_email->user_id);
-                       }
-               }
-
-               if (!$user) {
-                       $this->show_form(_('No user with that email address or username.'));
-                       return;
-               }
-
-               # Try to get an unconfirmed email address if they used a user name
-
-               if (!$user->email && !$confirm_email) {
-                       $confirm_email = Confirm_address::staticGet('user_id', $user->id);
-                       if ($confirm_email && $confirm_email->address_type != 'email') {
-                               # Skip non-email confirmations
-                               $confirm_email = NULL;
-                       }
-               }
-
-               if (!$user->email && !$confirm_email) {
-                       $this->client_error(_('No registered email address for that user.'));
-                       return;
-               }
-
-               # Success! We have a valid user and a confirmed or unconfirmed email address
-
-               $confirm = new Confirm_address();
-               $confirm->code = common_confirmation_code(128);
-               $confirm->address_type = 'recover';
-               $confirm->user_id = $user->id;
-               $confirm->address = (isset($user->email)) ? $user->email : $confirm_email->address;
-
-               if (!$confirm->insert()) {
-                       common_log_db_error($confirm, 'INSERT', __FILE__);
-                       $this->server_error(_('Error saving address confirmation.'));
-                       return;
-               }
-
-               $body = "Hey, $user->nickname.";
-               $body .= "\n\n";
-               $body .= 'Someone just asked for a new password ' .
-                        'for this account on ' . common_config('site', 'name') . '.';
-               $body .= "\n\n";
-               $body .= 'If it was you, and you want to confirm, use the URL below:';
-               $body .= "\n\n";
-               $body .= "\t".common_local_url('recoverpassword',
-                                                                  array('code' => $confirm->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";
-
-               mail_to_user($user, _('Password recovery requested'), $body, $confirm->address);
-
-               common_show_header(_('Password recovery requested'));
-               common_element('p', NULL,
-                              _('Instructions for recovering your password ' .
-                                 'have been sent to the email address registered to your ' .
-                                 'account.'));
-               common_show_footer();
-       }
-
-       function reset_password() {
-
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               $user = $this->get_temp_user();
-
-               if (!$user) {
-                       $this->client_error(_('Unexpected password reset.'));
-                       return;
-               }
-
-               $newpassword = $this->trimmed('newpassword');
-               $confirm = $this->trimmed('confirm');
-
-               if (!$newpassword || strlen($newpassword) < 6) {
-                       $this->show_password_form(_('Password must be 6 chars or more.'));
-                       return;
-               }
-               if ($newpassword != $confirm) {
-                       $this->show_password_form(_('Password and confirmation do not match.'));
-                       return;
-               }
-
-               # OK, we're ready to go
-
-               $original = clone($user);
-
-               $user->password = common_munge_password($newpassword, $user->id);
-
-               if (!$user->update($original)) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Can\'t save new password.'));
-                       return;
-               }
-
-               $this->clear_temp_user();
-
-               if (!common_set_user($user->nickname)) {
-                       common_server_error(_('Error setting user.'));
-                       return;
-               }
-
-               common_real_login(true);
-
-               common_show_header(_('Password saved.'));
-               common_element('p', NULL, _('New password successfully saved. ' .
-                                            'You are now logged in.'));
-               common_show_footer();
-       }
+        } else {
+            common_element('div', 'instructions',
+                           _('You\'ve been identified. Enter a ' .
+                              ' new password below. '));
+        }
+    }
+
+    function show_form($msg=NULL) {
+
+        common_show_header(_('Recover password'), NULL,
+        $msg, array($this, 'show_top'));
+
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'recoverpassword',
+                                           'action' => common_local_url('recoverpassword')));
+        common_input('nicknameoremail', _('Nickname or email'),
+                     $this->trimmed('nicknameoremail'),
+                     _('Your nickname on this server, ' .
+                        'or your registered email address.'));
+        common_submit('recover', _('Recover'));
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function show_password_form($msg=NULL) {
+
+        common_show_header(_('Reset password'), NULL,
+        $msg, array($this, 'show_password_top'));
+
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'recoverpassword',
+                                           'action' => common_local_url('recoverpassword')));
+        common_hidden('token', common_session_token());
+        common_password('newpassword', _('New password'),
+                        _('6 or more characters, and don\'t forget it!'));
+        common_password('confirm', _('Confirm'),
+                        _('Same as password above'));
+        common_submit('reset', _('Reset'));
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function recover_password() {
+        $nore = $this->trimmed('nicknameoremail');
+        if (!$nore) {
+            $this->show_form(_('Enter a nickname or email address.'));
+            return;
+        }
+
+        $user = User::staticGet('email', common_canonical_email($nore));
+
+        if (!$user) {
+            $user = User::staticGet('nickname', common_canonical_nickname($nore));
+        }
+
+        # See if it's an unconfirmed email address
+
+        if (!$user) {
+            $confirm_email = Confirm_address::staticGet('address', common_canonical_email($nore));
+            if ($confirm_email && $confirm_email->address_type == 'email') {
+                $user = User::staticGet($confirm_email->user_id);
+            }
+        }
+
+        if (!$user) {
+            $this->show_form(_('No user with that email address or username.'));
+            return;
+        }
+
+        # Try to get an unconfirmed email address if they used a user name
+
+        if (!$user->email && !$confirm_email) {
+            $confirm_email = Confirm_address::staticGet('user_id', $user->id);
+            if ($confirm_email && $confirm_email->address_type != 'email') {
+                # Skip non-email confirmations
+                $confirm_email = NULL;
+            }
+        }
+
+        if (!$user->email && !$confirm_email) {
+            $this->client_error(_('No registered email address for that user.'));
+            return;
+        }
+
+        # Success! We have a valid user and a confirmed or unconfirmed email address
+
+        $confirm = new Confirm_address();
+        $confirm->code = common_confirmation_code(128);
+        $confirm->address_type = 'recover';
+        $confirm->user_id = $user->id;
+        $confirm->address = (isset($user->email)) ? $user->email : $confirm_email->address;
+
+        if (!$confirm->insert()) {
+            common_log_db_error($confirm, 'INSERT', __FILE__);
+            $this->server_error(_('Error saving address confirmation.'));
+            return;
+        }
+
+        $body = "Hey, $user->nickname.";
+        $body .= "\n\n";
+        $body .= 'Someone just asked for a new password ' .
+                 'for this account on ' . common_config('site', 'name') . '.';
+        $body .= "\n\n";
+        $body .= 'If it was you, and you want to confirm, use the URL below:';
+        $body .= "\n\n";
+        $body .= "\t".common_local_url('recoverpassword',
+                                   array('code' => $confirm->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";
+
+        mail_to_user($user, _('Password recovery requested'), $body, $confirm->address);
+
+        common_show_header(_('Password recovery requested'));
+        common_element('p', NULL,
+                       _('Instructions for recovering your password ' .
+                          'have been sent to the email address registered to your ' .
+                          'account.'));
+        common_show_footer();
+    }
+
+    function reset_password() {
+
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        $user = $this->get_temp_user();
+
+        if (!$user) {
+            $this->client_error(_('Unexpected password reset.'));
+            return;
+        }
+
+        $newpassword = $this->trimmed('newpassword');
+        $confirm = $this->trimmed('confirm');
+
+        if (!$newpassword || strlen($newpassword) < 6) {
+            $this->show_password_form(_('Password must be 6 chars or more.'));
+            return;
+        }
+        if ($newpassword != $confirm) {
+            $this->show_password_form(_('Password and confirmation do not match.'));
+            return;
+        }
+
+        # OK, we're ready to go
+
+        $original = clone($user);
+
+        $user->password = common_munge_password($newpassword, $user->id);
+
+        if (!$user->update($original)) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Can\'t save new password.'));
+            return;
+        }
+
+        $this->clear_temp_user();
+
+        if (!common_set_user($user->nickname)) {
+            common_server_error(_('Error setting user.'));
+            return;
+        }
+
+        common_real_login(true);
+
+        common_show_header(_('Password saved.'));
+        common_element('p', NULL, _('New password successfully saved. ' .
+                                     'You are now logged in.'));
+        common_show_footer();
+    }
 }
index a22ffca28e8b53b8cecba0419deb3f5722e20a77..011aa3f090c54d78f1d9f92c7d37174b68b25fbc 100644 (file)
@@ -21,242 +21,242 @@ if (!defined('LACONICA')) { exit(1); }
 
 class RegisterAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-
-               if (common_config('site', 'closed')) {
-                       common_user_error(_('Registration not allowed.'));
-               } else if (common_logged_in()) {
-                       common_user_error(_('Already logged in.'));
-               } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $this->try_register();
-               } else {
-                       $this->show_form();
-               }
-       }
-
-       function try_register() {
-
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               $nickname = $this->trimmed('nickname');
-               $email = $this->trimmed('email');
-               $fullname = $this->trimmed('fullname');
-               $homepage = $this->trimmed('homepage');
-               $bio = $this->trimmed('bio');
-               $location = $this->trimmed('location');
-
-               # We don't trim these... whitespace is OK in a password!
-
-               $password = $this->arg('password');
-               $confirm = $this->arg('confirm');
-
-               # invitation code, if any
-
-               $code = $this->trimmed('code');
-
-               if ($code) {
-                       $invite = Invitation::staticGet($code);
-               }
-
-               if (common_config('site', 'inviteonly') && !($code && $invite)) {
-                       $this->client_error(_('Sorry, only invited people can register.'));
-                       return;
-               }
-
-               # Input scrubbing
-
-               $nickname = common_canonical_nickname($nickname);
-               $email = common_canonical_email($email);
-
-               if (!$this->boolean('license')) {
-                       $this->show_form(_('You can\'t register if you don\'t agree to the license.'));
-               } else if ($email && !Validate::email($email, true)) {
-                       $this->show_form(_('Not a valid email address.'));
-               } else if (!Validate::string($nickname, array('min_length' => 1,
-                                                                                                         'max_length' => 64,
-                                                                                                         'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
-                       $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
-               } else if ($this->nickname_exists($nickname)) {
-                       $this->show_form(_('Nickname already in use. Try another one.'));
-               } else if (!User::allowed_nickname($nickname)) {
-                       $this->show_form(_('Not a valid nickname.'));
-               } else if ($this->email_exists($email)) {
-                       $this->show_form(_('Email address already exists.'));
-               } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
-                                  !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) {
-                       $this->show_form(_('Homepage is not a valid URL.'));
-                       return;
-               } else if (!is_null($fullname) && strlen($fullname) > 255) {
-                       $this->show_form(_('Full name is too long (max 255 chars).'));
-                       return;
-               } else if (!is_null($bio) && strlen($bio) > 140) {
-                       $this->show_form(_('Bio is too long (max 140 chars).'));
-                       return;
-               } else if (!is_null($location) && strlen($location) > 255) {
-                       $this->show_form(_('Location is too long (max 255 chars).'));
-                       return;
-               } else if (strlen($password) < 6) {
-                       $this->show_form(_('Password must be 6 or more characters.'));
-                       return;
-               } else if ($password != $confirm) {
-                       $this->show_form(_('Passwords don\'t match.'));
-               } else if ($user = User::register(array('nickname' => $nickname, 'password' => $password, 'email' => $email,
-                                                                                               'fullname' => $fullname, 'homepage' => $homepage, 'bio' => $bio,
-                                                                                               'location' => $location, 'code' => $code))) {
-                       if (!$user) {
-                               $this->show_form(_('Invalid username or password.'));
-                               return;
-                       }
-                       # success!
-                       if (!common_set_user($user)) {
-                               common_server_error(_('Error setting user.'));
-                               return;
-                       }
-                       # this is a real login
-                       common_real_login(true);
-                       if ($this->boolean('rememberme')) {
-                               common_debug('Adding rememberme cookie for ' . $nickname);
-                               common_rememberme($user);
-                       }
-                       # Re-init language env in case it changed (not yet, but soon)
-                       common_init_language();
-                       $this->show_success();
-               } else {
-                       $this->show_form(_('Invalid username or password.'));
-               }
-       }
-
-       # checks if *CANONICAL* nickname exists
-
-       function nickname_exists($nickname) {
-               $user = User::staticGet('nickname', $nickname);
-               return ($user !== false);
-       }
-
-       # checks if *CANONICAL* email exists
-
-       function email_exists($email) {
-               $email = common_canonical_email($email);
-               if (!$email || strlen($email) == 0) {
-                       return false;
-               }
-               $user = User::staticGet('email', $email);
-               return ($user !== false);
-       }
-
-       function show_top($error=NULL) {
-               if ($error) {
-                       common_element('p', 'error', $error);
-               } else {
-                       $instr = common_markup_to_html(_('With this form you can create a new account. ' .
-                                                                                        'You can then post notices and link up to friends and colleagues. '.
-                                                                                        '(Have an [OpenID](http://openid.net/)? ' .
-                                                                                        'Try our [OpenID registration](%%action.openidlogin%%)!)'));
-
-                       common_element_start('div', 'instructions');
-                       common_raw($instr);
-                       common_element_end('div');
-               }
-       }
-
-       function show_form($error=NULL) {
-               global $config;
-
-               $code = $this->trimmed('code');
-
-               if ($code) {
-                       $invite = Invitation::staticGet($code);
-               }
-
-               if (common_config('site', 'inviteonly') && !($code && $invite)) {
-                       $this->client_error(_('Sorry, only invited people can register.'));
-                       return;
-               }
-
-               common_show_header(_('Register'), NULL, $error, array($this, 'show_top'));
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'login',
-                                                                                  'action' => common_local_url('register')));
-
-               common_hidden('token', common_session_token());
-
-               if ($code) {
-                       common_hidden('code', $code);
-               }
-
-               common_input('nickname', _('Nickname'), $this->trimmed('nickname'),
-                                        _('1-64 lowercase letters or numbers, no punctuation or spaces. Required.'));
-               common_password('password', _('Password'),
-                                               _('6 or more characters. Required.'));
-               common_password('confirm', _('Confirm'),
-                                               _('Same as password above. Required.'));
-               if ($invite && $invite->address_type == 'email') {
-                       common_input('email', _('Email'), $invite->address,
-                                        _('Used only for updates, announcements, and password recovery'));
-               } else {
-                       common_input('email', _('Email'), $this->trimmed('email'),
-                                                _('Used only for updates, announcements, and password recovery'));
-               }
-               common_input('fullname', _('Full name'),
-                                        $this->trimmed('fullname'),
-                                         _('Longer name, preferably your "real" name'));
-               common_input('homepage', _('Homepage'),
-                                        $this->trimmed('homepage'),
-                                        _('URL of your homepage, blog, or profile on another site'));
-               common_textarea('bio', _('Bio'),
-                                               $this->trimmed('bio'),
-                                                _('Describe yourself and your interests in 140 chars'));
-               common_input('location', _('Location'),
-                                        $this->trimmed('location'),
-                                        _('Where you are, like "City, State (or Region), Country"'));
-               common_checkbox('rememberme', _('Remember me'),
-                                               $this->boolean('rememberme'),
-                               _('Automatically login in the future; not for shared computers!'));
-               common_element_start('p');
-               $attrs = array('type' => 'checkbox',
-                                          'id' => 'license',
-                                          'name' => 'license',
-                                          'value' => 'true');
-               if ($this->boolean('license')) {
-                       $attrs['checked'] = 'checked';
-               }
-               common_element('input', $attrs);
-           common_text(_('My text and files are available under '));
-               common_element('a', array('href' => $config['license']['url']),
-                                          $config['license']['title']);
-               common_text(_(' except this private data: password, email address, IM address, phone number.'));
-               common_element_end('p');
-               common_submit('submit', _('Register'));
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function show_success() {
-               $nickname = $this->arg('nickname');
-               common_show_header(_('Registration successful'));
-               common_element_start('div', 'success');
-               $instr = sprintf(_('Congratulations, %s! And welcome to %%%%site.name%%%%. From here, you may want to...'. "\n\n" .
-                                                  '* Go to [your profile](%s) and post your first message.' .  "\n" .
-                                                  '* Add a [Jabber/GTalk address](%%%%action.imsettings%%%%) so you can send notices through instant messages.' . "\n" .
-                                                  '* [Search for people](%%%%action.peoplesearch%%%%) that you may know or that share your interests. ' . "\n" .
-                                                  '* Update your [profile settings](%%%%action.profilesettings%%%%) to tell others more about you. ' . "\n" .
-                                                  '* Read over the [online docs](%%%%doc.help%%%%) for features you may have missed. ' . "\n\n" .
-                                                  'Thanks for signing up and we hope you enjoy using this service.'),
-                                                $nickname, common_local_url('showstream', array('nickname' => $nickname)));
-               common_raw(common_markup_to_html($instr));
-               $have_email = $this->trimmed('email');
-               if ($have_email) {
-                       $emailinstr = _('(You should receive a message by email momentarily, with ' .
-                                                       'instructions on how to confirm your email address.)');
-                       common_raw(common_markup_to_html($emailinstr));
-               }
-               common_element_end('div');
-               common_show_footer();
-       }
+    function handle($args) {
+        parent::handle($args);
+
+        if (common_config('site', 'closed')) {
+            common_user_error(_('Registration not allowed.'));
+        } else if (common_logged_in()) {
+            common_user_error(_('Already logged in.'));
+        } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->try_register();
+        } else {
+            $this->show_form();
+        }
+    }
+
+    function try_register() {
+
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        $nickname = $this->trimmed('nickname');
+        $email = $this->trimmed('email');
+        $fullname = $this->trimmed('fullname');
+        $homepage = $this->trimmed('homepage');
+        $bio = $this->trimmed('bio');
+        $location = $this->trimmed('location');
+
+        # We don't trim these... whitespace is OK in a password!
+
+        $password = $this->arg('password');
+        $confirm = $this->arg('confirm');
+
+        # invitation code, if any
+
+        $code = $this->trimmed('code');
+
+        if ($code) {
+            $invite = Invitation::staticGet($code);
+        }
+
+        if (common_config('site', 'inviteonly') && !($code && $invite)) {
+            $this->client_error(_('Sorry, only invited people can register.'));
+            return;
+        }
+
+        # Input scrubbing
+
+        $nickname = common_canonical_nickname($nickname);
+        $email = common_canonical_email($email);
+
+        if (!$this->boolean('license')) {
+            $this->show_form(_('You can\'t register if you don\'t agree to the license.'));
+        } else if ($email && !Validate::email($email, true)) {
+            $this->show_form(_('Not a valid email address.'));
+        } else if (!Validate::string($nickname, array('min_length' => 1,
+                                                      'max_length' => 64,
+                                                      'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+            $this->show_form(_('Nickname must have only lowercase letters and numbers and no spaces.'));
+        } else if ($this->nickname_exists($nickname)) {
+            $this->show_form(_('Nickname already in use. Try another one.'));
+        } else if (!User::allowed_nickname($nickname)) {
+            $this->show_form(_('Not a valid nickname.'));
+        } else if ($this->email_exists($email)) {
+            $this->show_form(_('Email address already exists.'));
+        } else if (!is_null($homepage) && (strlen($homepage) > 0) &&
+                   !Validate::uri($homepage, array('allowed_schemes' => array('http', 'https')))) {
+            $this->show_form(_('Homepage is not a valid URL.'));
+            return;
+        } else if (!is_null($fullname) && strlen($fullname) > 255) {
+            $this->show_form(_('Full name is too long (max 255 chars).'));
+            return;
+        } else if (!is_null($bio) && strlen($bio) > 140) {
+            $this->show_form(_('Bio is too long (max 140 chars).'));
+            return;
+        } else if (!is_null($location) && strlen($location) > 255) {
+            $this->show_form(_('Location is too long (max 255 chars).'));
+            return;
+        } else if (strlen($password) < 6) {
+            $this->show_form(_('Password must be 6 or more characters.'));
+            return;
+        } else if ($password != $confirm) {
+            $this->show_form(_('Passwords don\'t match.'));
+        } else if ($user = User::register(array('nickname' => $nickname, 'password' => $password, 'email' => $email,
+                                                'fullname' => $fullname, 'homepage' => $homepage, 'bio' => $bio,
+                                                'location' => $location, 'code' => $code))) {
+            if (!$user) {
+                $this->show_form(_('Invalid username or password.'));
+                return;
+            }
+            # success!
+            if (!common_set_user($user)) {
+                common_server_error(_('Error setting user.'));
+                return;
+            }
+            # this is a real login
+            common_real_login(true);
+            if ($this->boolean('rememberme')) {
+                common_debug('Adding rememberme cookie for ' . $nickname);
+                common_rememberme($user);
+            }
+            # Re-init language env in case it changed (not yet, but soon)
+            common_init_language();
+            $this->show_success();
+        } else {
+            $this->show_form(_('Invalid username or password.'));
+        }
+    }
+
+    # checks if *CANONICAL* nickname exists
+
+    function nickname_exists($nickname) {
+        $user = User::staticGet('nickname', $nickname);
+        return ($user !== false);
+    }
+
+    # checks if *CANONICAL* email exists
+
+    function email_exists($email) {
+        $email = common_canonical_email($email);
+        if (!$email || strlen($email) == 0) {
+            return false;
+        }
+        $user = User::staticGet('email', $email);
+        return ($user !== false);
+    }
+
+    function show_top($error=NULL) {
+        if ($error) {
+            common_element('p', 'error', $error);
+        } else {
+            $instr = common_markup_to_html(_('With this form you can create a new account. ' .
+                                             'You can then post notices and link up to friends and colleagues. '.
+                                             '(Have an [OpenID](http://openid.net/)? ' .
+                                             'Try our [OpenID registration](%%action.openidlogin%%)!)'));
+
+            common_element_start('div', 'instructions');
+            common_raw($instr);
+            common_element_end('div');
+        }
+    }
+
+    function show_form($error=NULL) {
+        global $config;
+
+        $code = $this->trimmed('code');
+
+        if ($code) {
+            $invite = Invitation::staticGet($code);
+        }
+
+        if (common_config('site', 'inviteonly') && !($code && $invite)) {
+            $this->client_error(_('Sorry, only invited people can register.'));
+            return;
+        }
+
+        common_show_header(_('Register'), NULL, $error, array($this, 'show_top'));
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'login',
+                                           'action' => common_local_url('register')));
+
+        common_hidden('token', common_session_token());
+
+        if ($code) {
+            common_hidden('code', $code);
+        }
+
+        common_input('nickname', _('Nickname'), $this->trimmed('nickname'),
+                     _('1-64 lowercase letters or numbers, no punctuation or spaces. Required.'));
+        common_password('password', _('Password'),
+                        _('6 or more characters. Required.'));
+        common_password('confirm', _('Confirm'),
+                        _('Same as password above. Required.'));
+        if ($invite && $invite->address_type == 'email') {
+            common_input('email', _('Email'), $invite->address,
+                     _('Used only for updates, announcements, and password recovery'));
+        } else {
+            common_input('email', _('Email'), $this->trimmed('email'),
+                         _('Used only for updates, announcements, and password recovery'));
+        }
+        common_input('fullname', _('Full name'),
+                     $this->trimmed('fullname'),
+                      _('Longer name, preferably your "real" name'));
+        common_input('homepage', _('Homepage'),
+                     $this->trimmed('homepage'),
+                     _('URL of your homepage, blog, or profile on another site'));
+        common_textarea('bio', _('Bio'),
+                        $this->trimmed('bio'),
+                         _('Describe yourself and your interests in 140 chars'));
+        common_input('location', _('Location'),
+                     $this->trimmed('location'),
+                     _('Where you are, like "City, State (or Region), Country"'));
+        common_checkbox('rememberme', _('Remember me'),
+                        $this->boolean('rememberme'),
+                        _('Automatically login in the future; not for shared computers!'));
+        common_element_start('p');
+        $attrs = array('type' => 'checkbox',
+                       'id' => 'license',
+                       'name' => 'license',
+                       'value' => 'true');
+        if ($this->boolean('license')) {
+            $attrs['checked'] = 'checked';
+        }
+        common_element('input', $attrs);
+        common_text(_('My text and files are available under '));
+        common_element('a', array('href' => $config['license']['url']),
+                       $config['license']['title']);
+        common_text(_(' except this private data: password, email address, IM address, phone number.'));
+        common_element_end('p');
+        common_submit('submit', _('Register'));
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function show_success() {
+        $nickname = $this->arg('nickname');
+        common_show_header(_('Registration successful'));
+        common_element_start('div', 'success');
+        $instr = sprintf(_('Congratulations, %s! And welcome to %%%%site.name%%%%. From here, you may want to...'. "\n\n" .
+                           '* Go to [your profile](%s) and post your first message.' .  "\n" .
+                           '* Add a [Jabber/GTalk address](%%%%action.imsettings%%%%) so you can send notices through instant messages.' . "\n" .
+                           '* [Search for people](%%%%action.peoplesearch%%%%) that you may know or that share your interests. ' . "\n" .
+                           '* Update your [profile settings](%%%%action.profilesettings%%%%) to tell others more about you. ' . "\n" .
+                           '* Read over the [online docs](%%%%doc.help%%%%) for features you may have missed. ' . "\n\n" .
+                           'Thanks for signing up and we hope you enjoy using this service.'),
+                         $nickname, common_local_url('showstream', array('nickname' => $nickname)));
+        common_raw(common_markup_to_html($instr));
+        $have_email = $this->trimmed('email');
+        if ($have_email) {
+            $emailinstr = _('(You should receive a message by email momentarily, with ' .
+                            'instructions on how to confirm your email address.)');
+            common_raw(common_markup_to_html($emailinstr));
+        }
+        common_element_end('div');
+        common_show_footer();
+    }
 
 }
index c3a09bcfc247272676f432dd36dcdc7f11f14c96..14e8cb0683f1bcc20fc2ad6e04fe1ecf35aa0352 100644 (file)
@@ -23,364 +23,364 @@ require_once(INSTALLDIR.'/lib/omb.php');
 
 class RemotesubscribeAction extends Action {
 
-       function handle($args) {
-
-               parent::handle($args);
-
-               if (common_logged_in()) {
-                       common_user_error(_('You can use the local subscription!'));
-                   return;
-               }
-
-               if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-
-                       # CSRF protection
-                       $token = $this->trimmed('token');
-                       if (!$token || $token != common_session_token()) {
-                               $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                               return;
-                       }
-
-                       $this->remote_subscription();
-               } else {
-                       $this->show_form();
-               }
-       }
-
-       function get_instructions() {
-               return _('To subscribe, you can [login](%%action.login%%),' .
-                         ' or [register](%%action.register%%) a new ' .
-                         ' account. If you already have an account ' .
-                         ' on a [compatible microblogging site](%%doc.openmublog%%), ' .
-                         ' enter your profile URL below.');
-       }
-
-       function show_top($err=NULL) {
-               if ($err) {
-                       common_element('div', 'error', $err);
-               } else {
-                       $instructions = $this->get_instructions();
-                       $output = common_markup_to_html($instructions);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('p');
-               }
-       }
-
-       function show_form($err=NULL) {
-               $nickname = $this->trimmed('nickname');
-               $profile = $this->trimmed('profile_url');
-               common_show_header(_('Remote subscribe'), NULL, $err,
-                                                  array($this, 'show_top'));
-               # id = remotesubscribe conflicts with the
-               # button on profile page
-               common_element_start('form', array('id' => 'remsub', 'method' => 'post',
-                                                                                  'action' => common_local_url('remotesubscribe')));
-               common_hidden('token', common_session_token());
-               common_input('nickname', _('User nickname'), $nickname,
-                                        _('Nickname of the user you want to follow'));
-               common_input('profile_url', _('Profile URL'), $profile,
-                                        _('URL of your profile on another compatible microblogging service'));
-               common_submit('submit', _('Subscribe'));
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function remote_subscription() {
-               $user = $this->get_user();
-
-               if (!$user) {
-                       $this->show_form(_('No such user.'));
-                       return;
-               }
-
-               $profile = $this->trimmed('profile_url');
-
-               if (!$profile) {
-                       $this->show_form(_('No such user.'));
-                       return;
-               }
-
-               if (!Validate::uri($profile, array('allowed_schemes' => array('http', 'https')))) {
-                       $this->show_form(_('Invalid profile URL (bad format)'));
-                       return;
-               }
-
-               $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
-               $yadis = Auth_Yadis_Yadis::discover($profile, $fetcher);
-
-               if (!$yadis || $yadis->failed) {
-                       $this->show_form(_('Not a valid profile URL (no YADIS document).'));
-                       return;
-               }
-
-               # XXX: a little liberal for sites that accidentally put whitespace before the xml declaration
+    function handle($args) {
+
+        parent::handle($args);
+
+        if (common_logged_in()) {
+            common_user_error(_('You can use the local subscription!'));
+            return;
+        }
+
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+
+            # CSRF protection
+            $token = $this->trimmed('token');
+            if (!$token || $token != common_session_token()) {
+                $this->show_form(_('There was a problem with your session token. Try again, please.'));
+                return;
+            }
+
+            $this->remote_subscription();
+        } else {
+            $this->show_form();
+        }
+    }
+
+    function get_instructions() {
+        return _('To subscribe, you can [login](%%action.login%%),' .
+                  ' or [register](%%action.register%%) a new ' .
+                  ' account. If you already have an account ' .
+                  ' on a [compatible microblogging site](%%doc.openmublog%%), ' .
+                  ' enter your profile URL below.');
+    }
+
+    function show_top($err=NULL) {
+        if ($err) {
+            common_element('div', 'error', $err);
+        } else {
+            $instructions = $this->get_instructions();
+            $output = common_markup_to_html($instructions);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('p');
+        }
+    }
+
+    function show_form($err=NULL) {
+        $nickname = $this->trimmed('nickname');
+        $profile = $this->trimmed('profile_url');
+        common_show_header(_('Remote subscribe'), NULL, $err,
+                           array($this, 'show_top'));
+        # id = remotesubscribe conflicts with the
+        # button on profile page
+        common_element_start('form', array('id' => 'remsub', 'method' => 'post',
+                                           'action' => common_local_url('remotesubscribe')));
+        common_hidden('token', common_session_token());
+        common_input('nickname', _('User nickname'), $nickname,
+                     _('Nickname of the user you want to follow'));
+        common_input('profile_url', _('Profile URL'), $profile,
+                     _('URL of your profile on another compatible microblogging service'));
+        common_submit('submit', _('Subscribe'));
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function remote_subscription() {
+        $user = $this->get_user();
+
+        if (!$user) {
+            $this->show_form(_('No such user.'));
+            return;
+        }
+
+        $profile = $this->trimmed('profile_url');
+
+        if (!$profile) {
+            $this->show_form(_('No such user.'));
+            return;
+        }
+
+        if (!Validate::uri($profile, array('allowed_schemes' => array('http', 'https')))) {
+            $this->show_form(_('Invalid profile URL (bad format)'));
+            return;
+        }
+
+        $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+        $yadis = Auth_Yadis_Yadis::discover($profile, $fetcher);
+
+        if (!$yadis || $yadis->failed) {
+            $this->show_form(_('Not a valid profile URL (no YADIS document).'));
+            return;
+        }
+
+        # XXX: a little liberal for sites that accidentally put whitespace before the xml declaration
 
         $xrds =& Auth_Yadis_XRDS::parseXRDS(trim($yadis->response_text));
 
-               if (!$xrds) {
-                       $this->show_form(_('Not a valid profile URL (no XRDS defined).'));
-                       return;
-               }
+        if (!$xrds) {
+            $this->show_form(_('Not a valid profile URL (no XRDS defined).'));
+            return;
+        }
 
-               $omb = $this->getOmb($xrds);
+        $omb = $this->getOmb($xrds);
 
-               if (!$omb) {
-                       $this->show_form(_('Not a valid profile URL (incorrect services).'));
-                       return;
-               }
+        if (!$omb) {
+            $this->show_form(_('Not a valid profile URL (incorrect services).'));
+            return;
+        }
 
-               if (omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]) ==
-                       common_local_url('requesttoken'))
-               {
-                       $this->show_form(_('That\'s a local profile! Login to subscribe.'));
-                       return;
-               }
-
-               if (User::staticGet('uri', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]))) {
-                       $this->show_form(_('That\'s a local profile! Login to subscribe.'));
-                       return;
-               }
-
-               list($token, $secret) = $this->request_token($omb);
-
-               if (!$token || !$secret) {
-                       $this->show_form(_('Couldn\'t get a request token.'));
-                       return;
-               }
-
-               $this->request_authorization($user, $omb, $token, $secret);
-       }
-
-       function get_user() {
-               $user = NULL;
-               $nickname = $this->trimmed('nickname');
-               if ($nickname) {
-                       $user = User::staticGet('nickname', $nickname);
-               }
-               return $user;
-       }
-
-       function getOmb($xrds) {
-
-           static $omb_endpoints = array(OMB_ENDPOINT_UPDATEPROFILE, OMB_ENDPOINT_POSTNOTICE);
-               static $oauth_endpoints = array(OAUTH_ENDPOINT_REQUEST, OAUTH_ENDPOINT_AUTHORIZE,
-                                                                               OAUTH_ENDPOINT_ACCESS);
-               $omb = array();
-
-               # XXX: the following code could probably be refactored to eliminate dupes
-
-               $oauth_services = omb_get_services($xrds, OAUTH_DISCOVERY);
-
-               if (!$oauth_services) {
-                       return NULL;
-               }
-
-               $oauth_service = $oauth_services[0];
-
-               $oauth_xrd = $this->getXRD($oauth_service, $xrds);
+        if (omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]) ==
+            common_local_url('requesttoken'))
+        {
+            $this->show_form(_('That\'s a local profile! Login to subscribe.'));
+            return;
+        }
+
+        if (User::staticGet('uri', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]))) {
+            $this->show_form(_('That\'s a local profile! Login to subscribe.'));
+            return;
+        }
+
+        list($token, $secret) = $this->request_token($omb);
+
+        if (!$token || !$secret) {
+            $this->show_form(_('Couldn\'t get a request token.'));
+            return;
+        }
+
+        $this->request_authorization($user, $omb, $token, $secret);
+    }
+
+    function get_user() {
+        $user = NULL;
+        $nickname = $this->trimmed('nickname');
+        if ($nickname) {
+            $user = User::staticGet('nickname', $nickname);
+        }
+        return $user;
+    }
+
+    function getOmb($xrds) {
+
+        static $omb_endpoints = array(OMB_ENDPOINT_UPDATEPROFILE, OMB_ENDPOINT_POSTNOTICE);
+        static $oauth_endpoints = array(OAUTH_ENDPOINT_REQUEST, OAUTH_ENDPOINT_AUTHORIZE,
+                                        OAUTH_ENDPOINT_ACCESS);
+        $omb = array();
+
+        # XXX: the following code could probably be refactored to eliminate dupes
+
+        $oauth_services = omb_get_services($xrds, OAUTH_DISCOVERY);
+
+        if (!$oauth_services) {
+            return NULL;
+        }
+
+        $oauth_service = $oauth_services[0];
+
+        $oauth_xrd = $this->getXRD($oauth_service, $xrds);
 
-               if (!$oauth_xrd) {
-                       return NULL;
-               }
+        if (!$oauth_xrd) {
+            return NULL;
+        }
 
-               if (!$this->addServices($oauth_xrd, $oauth_endpoints, $omb)) {
-                       return NULL;
-               }
+        if (!$this->addServices($oauth_xrd, $oauth_endpoints, $omb)) {
+            return NULL;
+        }
 
-               $omb_services = omb_get_services($xrds, OMB_NAMESPACE);
+        $omb_services = omb_get_services($xrds, OMB_NAMESPACE);
 
-               if (!$omb_services) {
-                       return NULL;
-               }
+        if (!$omb_services) {
+            return NULL;
+        }
 
-               $omb_service = $omb_services[0];
+        $omb_service = $omb_services[0];
 
-               $omb_xrd = $this->getXRD($omb_service, $xrds);
+        $omb_xrd = $this->getXRD($omb_service, $xrds);
 
-               if (!$omb_xrd) {
-                       return NULL;
-               }
+        if (!$omb_xrd) {
+            return NULL;
+        }
 
-               if (!$this->addServices($omb_xrd, $omb_endpoints, $omb)) {
-                       return NULL;
-               }
+        if (!$this->addServices($omb_xrd, $omb_endpoints, $omb)) {
+            return NULL;
+        }
 
-               # XXX: check that we got all the services we needed
+        # XXX: check that we got all the services we needed
 
-               foreach (array_merge($omb_endpoints, $oauth_endpoints) as $type) {
-                       if (!array_key_exists($type, $omb) || !$omb[$type]) {
-                               return NULL;
-                       }
-               }
+        foreach (array_merge($omb_endpoints, $oauth_endpoints) as $type) {
+            if (!array_key_exists($type, $omb) || !$omb[$type]) {
+                return NULL;
+            }
+        }
 
-               if (!omb_local_id($omb[OAUTH_ENDPOINT_REQUEST])) {
-                       return NULL;
-               }
+        if (!omb_local_id($omb[OAUTH_ENDPOINT_REQUEST])) {
+            return NULL;
+        }
 
-               return $omb;
-       }
+        return $omb;
+    }
 
-       function getXRD($main_service, $main_xrds) {
-               $uri = omb_service_uri($main_service);
-               if (strpos($uri, "#") !== 0) {
-                       # FIXME: more rigorous handling of external service definitions
-                       return NULL;
-               }
-               $id = substr($uri, 1);
-               $nodes = $main_xrds->allXrdNodes;
-               $parser = $main_xrds->parser;
-               foreach ($nodes as $node) {
-                       $attrs = $parser->attributes($node);
-                       if (array_key_exists('xml:id', $attrs) &&
-                               $attrs['xml:id'] == $id) {
-                               # XXX: trick the constructor into thinking this is the only node
-                               $bogus_nodes = array($node);
-                               return new Auth_Yadis_XRDS($parser, $bogus_nodes);
-                       }
-               }
-               return NULL;
-       }
+    function getXRD($main_service, $main_xrds) {
+        $uri = omb_service_uri($main_service);
+        if (strpos($uri, "#") !== 0) {
+            # FIXME: more rigorous handling of external service definitions
+            return NULL;
+        }
+        $id = substr($uri, 1);
+        $nodes = $main_xrds->allXrdNodes;
+        $parser = $main_xrds->parser;
+        foreach ($nodes as $node) {
+            $attrs = $parser->attributes($node);
+            if (array_key_exists('xml:id', $attrs) &&
+                $attrs['xml:id'] == $id) {
+                # XXX: trick the constructor into thinking this is the only node
+                $bogus_nodes = array($node);
+                return new Auth_Yadis_XRDS($parser, $bogus_nodes);
+            }
+        }
+        return NULL;
+    }
 
-       function addServices($xrd, $types, &$omb) {
-               foreach ($types as $type) {
-                       $matches = omb_get_services($xrd, $type);
-                       if ($matches) {
-                               $omb[$type] = $matches[0];
-                       } else {
-                               # no match for type
-                               return false;
-                       }
-               }
-               return true;
-       }
+    function addServices($xrd, $types, &$omb) {
+        foreach ($types as $type) {
+            $matches = omb_get_services($xrd, $type);
+            if ($matches) {
+                $omb[$type] = $matches[0];
+            } else {
+                # no match for type
+                return false;
+            }
+        }
+        return true;
+    }
 
-       function request_token($omb) {
-               $con = omb_oauth_consumer();
+    function request_token($omb) {
+        $con = omb_oauth_consumer();
 
-               $url = omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]);
+        $url = omb_service_uri($omb[OAUTH_ENDPOINT_REQUEST]);
 
-               # XXX: Is this the right thing to do? Strip off GET params and make them
-               # POST params? Seems wrong to me.
+        # XXX: Is this the right thing to do? Strip off GET params and make them
+        # POST params? Seems wrong to me.
 
-               $parsed = parse_url($url);
-               $params = array();
-               parse_str($parsed['query'], $params);
+        $parsed = parse_url($url);
+        $params = array();
+        parse_str($parsed['query'], $params);
 
-               $req = OAuthRequest::from_consumer_and_token($con, NULL, "POST", $url, $params);
+        $req = OAuthRequest::from_consumer_and_token($con, NULL, "POST", $url, $params);
 
-               $listener = omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]);
+        $listener = omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]);
 
-               if (!$listener) {
-                       return NULL;
-               }
+        if (!$listener) {
+            return NULL;
+        }
 
-               $req->set_parameter('omb_listener', $listener);
-               $req->set_parameter('omb_version', OMB_VERSION_01);
+        $req->set_parameter('omb_listener', $listener);
+        $req->set_parameter('omb_version', OMB_VERSION_01);
 
-               # XXX: test to see if endpoint accepts this signature method
+        # XXX: test to see if endpoint accepts this signature method
 
-               $req->sign_request(omb_hmac_sha1(), $con, NULL);
+        $req->sign_request(omb_hmac_sha1(), $con, NULL);
 
-               # We re-use this tool's fetcher, since it's pretty good
+        # We re-use this tool's fetcher, since it's pretty good
 
-               $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+        $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
 
-               $result = $fetcher->post($req->get_normalized_http_url(),
-                                                                $req->to_postdata(),
+        $result = $fetcher->post($req->get_normalized_http_url(),
+                                 $req->to_postdata(),
                                  array('User-Agent' => 'Laconica/' . LACONICA_VERSION));
 
-               if ($result->status != 200) {
-                       return NULL;
-               }
+        if ($result->status != 200) {
+            return NULL;
+        }
 
-               parse_str($result->body, $return);
+        parse_str($result->body, $return);
 
-               return array($return['oauth_token'], $return['oauth_token_secret']);
-       }
+        return array($return['oauth_token'], $return['oauth_token_secret']);
+    }
 
-       function request_authorization($user, $omb, $token, $secret) {
-               global $config; # for license URL
+    function request_authorization($user, $omb, $token, $secret) {
+        global $config; # for license URL
 
-               $con = omb_oauth_consumer();
-               $tok = new OAuthToken($token, $secret);
+        $con = omb_oauth_consumer();
+        $tok = new OAuthToken($token, $secret);
 
-               $url = omb_service_uri($omb[OAUTH_ENDPOINT_AUTHORIZE]);
+        $url = omb_service_uri($omb[OAUTH_ENDPOINT_AUTHORIZE]);
 
-               # XXX: Is this the right thing to do? Strip off GET params and make them
-               # POST params? Seems wrong to me.
+        # XXX: Is this the right thing to do? Strip off GET params and make them
+        # POST params? Seems wrong to me.
 
-               $parsed = parse_url($url);
-               $params = array();
-               parse_str($parsed['query'], $params);
+        $parsed = parse_url($url);
+        $params = array();
+        parse_str($parsed['query'], $params);
 
-               $req = OAuthRequest::from_consumer_and_token($con, $tok, 'GET', $url, $params);
+        $req = OAuthRequest::from_consumer_and_token($con, $tok, 'GET', $url, $params);
 
-               # We send over a ton of information. This lets the other
-               # server store info about our user, and it lets the current
-               # user decide if they really want to authorize the subscription.
+        # We send over a ton of information. This lets the other
+        # server store info about our user, and it lets the current
+        # user decide if they really want to authorize the subscription.
 
-               $req->set_parameter('omb_version', OMB_VERSION_01);
-               $req->set_parameter('omb_listener', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]));
-               $req->set_parameter('omb_listenee', $user->uri);
-               $req->set_parameter('omb_listenee_profile', common_profile_url($user->nickname));
-               $req->set_parameter('omb_listenee_nickname', $user->nickname);
-               $req->set_parameter('omb_listenee_license', $config['license']['url']);
+        $req->set_parameter('omb_version', OMB_VERSION_01);
+        $req->set_parameter('omb_listener', omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]));
+        $req->set_parameter('omb_listenee', $user->uri);
+        $req->set_parameter('omb_listenee_profile', common_profile_url($user->nickname));
+        $req->set_parameter('omb_listenee_nickname', $user->nickname);
+        $req->set_parameter('omb_listenee_license', $config['license']['url']);
 
-               $profile = $user->getProfile();
-               if (!$profile) {
-                       common_log_db_error($user, 'SELECT', __FILE__);
-                       $this->server_error(_('User without matching profile'));
-                       return;
-               }
+        $profile = $user->getProfile();
+        if (!$profile) {
+            common_log_db_error($user, 'SELECT', __FILE__);
+            $this->server_error(_('User without matching profile'));
+            return;
+        }
 
-               if ($profile->fullname) {
-                       $req->set_parameter('omb_listenee_fullname', $profile->fullname);
-               }
-               if ($profile->homepage) {
-                       $req->set_parameter('omb_listenee_homepage', $profile->homepage);
-               }
-               if ($profile->bio) {
-                       $req->set_parameter('omb_listenee_bio', $profile->bio);
-               }
-               if ($profile->location) {
-                       $req->set_parameter('omb_listenee_location', $profile->location);
-               }
-               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-               if ($avatar) {
-                       $req->set_parameter('omb_listenee_avatar', $avatar->url);
-               }
+        if ($profile->fullname) {
+            $req->set_parameter('omb_listenee_fullname', $profile->fullname);
+        }
+        if ($profile->homepage) {
+            $req->set_parameter('omb_listenee_homepage', $profile->homepage);
+        }
+        if ($profile->bio) {
+            $req->set_parameter('omb_listenee_bio', $profile->bio);
+        }
+        if ($profile->location) {
+            $req->set_parameter('omb_listenee_location', $profile->location);
+        }
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+        if ($avatar) {
+            $req->set_parameter('omb_listenee_avatar', $avatar->url);
+        }
 
-               # XXX: add a nonce to prevent replay attacks
+        # XXX: add a nonce to prevent replay attacks
 
-               $req->set_parameter('oauth_callback', common_local_url('finishremotesubscribe'));
+        $req->set_parameter('oauth_callback', common_local_url('finishremotesubscribe'));
 
-               # XXX: test to see if endpoint accepts this signature method
+        # XXX: test to see if endpoint accepts this signature method
 
-               $req->sign_request(omb_hmac_sha1(), $con, $tok);
+        $req->sign_request(omb_hmac_sha1(), $con, $tok);
 
-               # store all our info here
+        # store all our info here
 
-               $omb['listenee'] = $user->nickname;
-               $omb['listener'] = omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]);
-               $omb['token'] = $token;
-               $omb['secret'] = $secret;
-               # call doesn't work after bounce back so we cache; maybe serialization issue...?
-               $omb['access_token_url'] = omb_service_uri($omb[OAUTH_ENDPOINT_ACCESS]);
-               $omb['post_notice_url'] = omb_service_uri($omb[OMB_ENDPOINT_POSTNOTICE]);
-               $omb['update_profile_url'] = omb_service_uri($omb[OMB_ENDPOINT_UPDATEPROFILE]);
+        $omb['listenee'] = $user->nickname;
+        $omb['listener'] = omb_local_id($omb[OAUTH_ENDPOINT_REQUEST]);
+        $omb['token'] = $token;
+        $omb['secret'] = $secret;
+        # call doesn't work after bounce back so we cache; maybe serialization issue...?
+        $omb['access_token_url'] = omb_service_uri($omb[OAUTH_ENDPOINT_ACCESS]);
+        $omb['post_notice_url'] = omb_service_uri($omb[OMB_ENDPOINT_POSTNOTICE]);
+        $omb['update_profile_url'] = omb_service_uri($omb[OMB_ENDPOINT_UPDATEPROFILE]);
 
-               common_ensure_session();
+        common_ensure_session();
 
-               $_SESSION['oauth_authorization_request'] = $omb;
+        $_SESSION['oauth_authorization_request'] = $omb;
 
-               # Redirect to authorization service
+        # Redirect to authorization service
 
-               common_redirect($req->to_url());
-               return;
-       }
+        common_redirect($req->to_url());
+        return;
+    }
 
-       function make_nonce() {
-               return common_good_rand(16);
-       }
+    function make_nonce() {
+        return common_good_rand(16);
+    }
 }
index 835871ffc17b704485390539e88b99571be53d62..be80fae79eb2decdd4ef971d94205044243c2eab 100644 (file)
@@ -23,72 +23,72 @@ require_once(INSTALLDIR.'/actions/showstream.php');
 
 class RepliesAction extends StreamAction {
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               $nickname = common_canonical_nickname($this->arg('nickname'));
-               $user = User::staticGet('nickname', $nickname);
+        $nickname = common_canonical_nickname($this->arg('nickname'));
+        $user = User::staticGet('nickname', $nickname);
 
-               if (!$user) {
-                       $this->no_such_user();
-                       return;
-               }
+        if (!$user) {
+            $this->no_such_user();
+            return;
+        }
 
-               $profile = $user->getProfile();
+        $profile = $user->getProfile();
 
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
 
-               # Looks like we're good; show the header
+        # Looks like we're good; show the header
 
-               common_show_header(sprintf(_("Replies to %s"), $profile->nickname),
-                                                  array($this, 'show_header'), $user,
-                                                  array($this, 'show_top'));
+        common_show_header(sprintf(_("Replies to %s"), $profile->nickname),
+                           array($this, 'show_header'), $user,
+                           array($this, 'show_top'));
 
-               $this->show_replies($user);
+        $this->show_replies($user);
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function no_such_user() {
-               common_user_error(_('No such user.'));
-       }
+    function no_such_user() {
+        common_user_error(_('No such user.'));
+    }
 
-       function show_header($user) {
-               common_element('link', array('rel' => 'alternate',
-                                                                        'href' => common_local_url('repliesrss', array('nickname' =>
-                                                                                                                                                                       $user->nickname)),
-                                                                        'type' => 'application/rss+xml',
-                                                                        'title' => sprintf(_('Feed for replies to %s'), $user->nickname)));
-       }
+    function show_header($user) {
+        common_element('link', array('rel' => 'alternate',
+                                     'href' => common_local_url('repliesrss', array('nickname' =>
+                                                                                    $user->nickname)),
+                                     'type' => 'application/rss+xml',
+                                     'title' => sprintf(_('Feed for replies to %s'), $user->nickname)));
+    }
 
-       function show_top($user) {
-               $cur = common_current_user();
+    function show_top($user) {
+        $cur = common_current_user();
 
-               if ($cur && $cur->id == $user->id) {
-                       common_notice_form('replies');
-               }
+        if ($cur && $cur->id == $user->id) {
+            common_notice_form('replies');
+        }
 
-               $this->views_menu();
+        $this->views_menu();
 
-               $this->show_feeds_list(array(0=>array('href'=>common_local_url('repliesrss', array('nickname' => $user->nickname)),
-                                                                                         'type' => 'rss',
-                                                                                         'version' => 'RSS 1.0',
-                                                                                         'item' => 'repliesrss')));
-       }
+        $this->show_feeds_list(array(0=>array('href'=>common_local_url('repliesrss', array('nickname' => $user->nickname)),
+                                              'type' => 'rss',
+                                              'version' => 'RSS 1.0',
+                                              'item' => 'repliesrss')));
+    }
 
-       function show_replies($user) {
+    function show_replies($user) {
 
-               $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
 
-               $notice = $user->getReplies(($page-1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+        $notice = $user->getReplies(($page-1) * NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
 
-               $cnt = $this->show_notice_list($notice);
+        $cnt = $this->show_notice_list($notice);
 
-               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'replies', array('nickname' => $user->nickname));
-       }
+        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'replies', array('nickname' => $user->nickname));
+    }
 }
index 7369db5e047ae6f16d8ddbf17f53f512512d0a86..3689ea1f8ffd95cc19d4c7f61f8804dbe9283ca1 100644 (file)
@@ -25,55 +25,55 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class RepliesrssAction extends Rss10Action {
 
-       var $user = NULL;
+    var $user = NULL;
 
-       function init() {
-               $nickname = $this->trimmed('nickname');
-               $this->user = User::staticGet('nickname', $nickname);
+    function init() {
+        $nickname = $this->trimmed('nickname');
+        $this->user = User::staticGet('nickname', $nickname);
 
-               if (!$this->user) {
-                       common_user_error(_('No such user.'));
-                       return false;
-               } else {
-                       return true;
-               }
-       }
+        if (!$this->user) {
+            common_user_error(_('No such user.'));
+            return false;
+        } else {
+            return true;
+        }
+    }
 
-       function get_notices($limit=0) {
+    function get_notices($limit=0) {
 
-               $user = $this->user;
+        $user = $this->user;
 
-               $notice = $user->getReplies(0, ($limit == 0) ? 48 : $limit);
+        $notice = $user->getReplies(0, ($limit == 0) ? 48 : $limit);
 
-               $notices = array();
-               
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
+        $notices = array();
+        
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
 
-               return $notices;
-       }
+        return $notices;
+    }
 
-       function get_channel() {
-               $user = $this->user;
-               $c = array('url' => common_local_url('repliesrss',
-                                                                                        array('nickname' =>
-                                                                                                  $user->nickname)),
-                                  'title' => sprintf(_("Replies to %s"), $user->nickname),
-                                  'link' => common_local_url('replies',
-                                                                                         array('nickname' =>
-                                                                                                       $user->nickname)),
-                                  'description' => sprintf(_('Feed for replies to %s'), $user->nickname));
-               return $c;
-       }
+    function get_channel() {
+        $user = $this->user;
+        $c = array('url' => common_local_url('repliesrss',
+                                             array('nickname' =>
+                                                   $user->nickname)),
+                   'title' => sprintf(_("Replies to %s"), $user->nickname),
+                   'link' => common_local_url('replies',
+                                              array('nickname' =>
+                                                    $user->nickname)),
+                   'description' => sprintf(_('Feed for replies to %s'), $user->nickname));
+        return $c;
+    }
 
-       function get_image() {
-               $user = $this->user;
-               $profile = $user->getProfile();
-               if (!$profile) {
-                       return NULL;
-               }
-               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-               return ($avatar) ? $avatar->url : NULL;
-       }
+    function get_image() {
+        $user = $this->user;
+        $profile = $user->getProfile();
+        if (!$profile) {
+            return NULL;
+        }
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+        return ($avatar) ? $avatar->url : NULL;
+    }
 }
\ No newline at end of file
index 76019a92995126db827b7394ed55bf3588235166..4950d93c06addede2a77b54e636d45fa33a133a1 100644 (file)
@@ -22,21 +22,21 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/lib/omb.php');
 
 class RequesttokenAction extends Action {
-       
-       function is_readonly() {
-               return false;
-       }
-       
-       function handle($args) {
-               parent::handle($args);
-               try {
-                       common_remove_magic_from_request();
-                       $req = OAuthRequest::from_request();
-                       $server = omb_oauth_server();
-                       $token = $server->fetch_request_token($req);
-                       print $token;
-               } catch (OAuthException $e) {
-                       common_server_error($e->getMessage());
-               }
-       }
+    
+    function is_readonly() {
+        return false;
+    }
+    
+    function handle($args) {
+        parent::handle($args);
+        try {
+            common_remove_magic_from_request();
+            $req = OAuthRequest::from_request();
+            $server = omb_oauth_server();
+            $token = $server->fetch_request_token($req);
+            print $token;
+        } catch (OAuthException $e) {
+            common_server_error($e->getMessage());
+        }
+    }
 }
index 4de4b12716be71327727deeefa893b49853af4de..2fd1e586d4d074ebcd2f2bfa655bc1c4d3b274e7 100644 (file)
@@ -23,75 +23,75 @@ require_once(INSTALLDIR.'/actions/showstream.php');
 
 class ShowfavoritesAction extends StreamAction {
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               $nickname = common_canonical_nickname($this->arg('nickname'));
-               $user = User::staticGet('nickname', $nickname);
+        $nickname = common_canonical_nickname($this->arg('nickname'));
+        $user = User::staticGet('nickname', $nickname);
 
-               if (!$user) {
-                       $this->client_error(_('No such user.'));
-                       return;
-               }
+        if (!$user) {
+            $this->client_error(_('No such user.'));
+            return;
+        }
 
-               $profile = $user->getProfile();
+        $profile = $user->getProfile();
 
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
 
-               # Looks like we're good; show the header
+        # Looks like we're good; show the header
 
-               common_show_header(sprintf(_("%s favorite notices"), $profile->nickname),
-                                                  array($this, 'show_header'), $user,
-                                                  array($this, 'show_top'));
+        common_show_header(sprintf(_("%s favorite notices"), $profile->nickname),
+                           array($this, 'show_header'), $user,
+                           array($this, 'show_top'));
 
-               $this->show_notices($user);
+        $this->show_notices($user);
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function show_header($user) {
-               common_element('link', array('rel' => 'alternate',
-                                                                        'href' => common_local_url('favoritesrss', array('nickname' =>
-                                                                                                                                                                         $user->nickname)),
-                                                                        'type' => 'application/rss+xml',
-                                                                        'title' => sprintf(_('Feed for favorites of %s'), $user->nickname)));
-       }
+    function show_header($user) {
+        common_element('link', array('rel' => 'alternate',
+                                     'href' => common_local_url('favoritesrss', array('nickname' =>
+                                                                                      $user->nickname)),
+                                     'type' => 'application/rss+xml',
+                                     'title' => sprintf(_('Feed for favorites of %s'), $user->nickname)));
+    }
 
-       function show_top($user) {
-               $cur = common_current_user();
+    function show_top($user) {
+        $cur = common_current_user();
 
-               if ($cur && $cur->id == $user->id) {
-                       common_notice_form('all');
-               }
+        if ($cur && $cur->id == $user->id) {
+            common_notice_form('all');
+        }
 
-               $this->show_feeds_list(array(0=>array('href'=>common_local_url('favoritesrss', array('nickname' => $user->nickname)),
-                                                                                         'type' => 'rss',
-                                                                                         'version' => 'RSS 1.0',
-                                                                                         'item' => 'Favorites')));
-               $this->views_menu();
-       }
+        $this->show_feeds_list(array(0=>array('href'=>common_local_url('favoritesrss', array('nickname' => $user->nickname)),
+                                              'type' => 'rss',
+                                              'version' => 'RSS 1.0',
+                                              'item' => 'Favorites')));
+        $this->views_menu();
+    }
 
-       function show_notices($user) {
+    function show_notices($user) {
 
-               $page = $this->trimmed('page');
-               if (!$page) {
-                       $page = 1;
-               }
+        $page = $this->trimmed('page');
+        if (!$page) {
+            $page = 1;
+        }
 
-               $notice = $user->favoriteNotices(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+        $notice = $user->favoriteNotices(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
 
-               if (!$notice) {
-                       $this->server_error(_('Could not retrieve favorite notices.'));
-                       return;
-               }
+        if (!$notice) {
+            $this->server_error(_('Could not retrieve favorite notices.'));
+            return;
+        }
 
         $cnt = $this->show_notice_list($notice);
 
-               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'showfavorites', array('nickname' => $user->nickname));
-       }
+        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'showfavorites', array('nickname' => $user->nickname));
+    }
 }
index c171ffe0b596b790bd5b458dbcae1a0393ed9026..f35f3eedeab424d2ce4393a110b3d20456980f3d 100644 (file)
@@ -23,78 +23,78 @@ require_once(INSTALLDIR.'/lib/mailbox.php');
 
 class ShowmessageAction extends MailboxAction {
 
-       function handle($args) {
+    function handle($args) {
 
-               Action::handle($args);
+        Action::handle($args);
 
-               $message = $this->get_message();
+        $message = $this->get_message();
 
-               if (!$message) {
-                       $this->client_error(_('No such message.'), 404);
-                       return;
-               }
-               
-               $cur = common_current_user();
-               
-               if ($cur && ($cur->id == $message->from_profile || $cur->id == $message->to_profile)) {
-                       $this->show_page($cur, 1);
-               } else {
-                       $this->client_error(_('Only the sender and recipient may read this message.'), 403);
-                       return;
-               }
-       }
-       
-       function get_message() {
-               $id = $this->trimmed('message');
-               $message = Message::staticGet('id', $id);
-               return $message;
-       }
-       
-       function get_title($user, $page) {
-               $message = $this->get_message();
-               if (!$message) {
-                       return NULL;
-               }
-               
-               if ($user->id == $message->from_profile) {
-                       $to = $message->getTo();
-                       $title = sprintf(_("Message to %1\$s on %2\$s"),
-                                                        $to->nickname,
-                                                        common_exact_date($message->created));
-               } else if ($user->id == $message->to_profile) {
-                       $from = $message->getFrom();
-                       $title = sprintf(_("Message from %1\$s on %2\$s"),
-                                                        $from->nickname,
-                                                        common_exact_date($message->created));
-               }
-               return $title;
-       }
+        if (!$message) {
+            $this->client_error(_('No such message.'), 404);
+            return;
+        }
+        
+        $cur = common_current_user();
+        
+        if ($cur && ($cur->id == $message->from_profile || $cur->id == $message->to_profile)) {
+            $this->show_page($cur, 1);
+        } else {
+            $this->client_error(_('Only the sender and recipient may read this message.'), 403);
+            return;
+        }
+    }
+    
+    function get_message() {
+        $id = $this->trimmed('message');
+        $message = Message::staticGet('id', $id);
+        return $message;
+    }
+    
+    function get_title($user, $page) {
+        $message = $this->get_message();
+        if (!$message) {
+            return NULL;
+        }
+        
+        if ($user->id == $message->from_profile) {
+            $to = $message->getTo();
+            $title = sprintf(_("Message to %1\$s on %2\$s"),
+                             $to->nickname,
+                             common_exact_date($message->created));
+        } else if ($user->id == $message->to_profile) {
+            $from = $message->getFrom();
+            $title = sprintf(_("Message from %1\$s on %2\$s"),
+                             $from->nickname,
+                             common_exact_date($message->created));
+        }
+        return $title;
+    }
 
-       function get_messages($user, $page) {
-               $message = new Message();
-               $message->id = $this->trimmed('message');
-               $message->find();
-               return $message;
-       }
-       
-       function get_message_profile($message) {
-               $user = common_current_user();
-               if ($user->id == $message->from_profile) {
-                       return $message->getTo();
-               } else if ($user->id == $message->to_profile) {
-                       return $message->getFrom();
-               } else {
-                       # This shouldn't happen
-                       return NULL;
-               }
-       }
-       
-       function get_instructions() {
-               return '';
-       }
-       
-       function views_menu() {
-               return;
-       }
+    function get_messages($user, $page) {
+        $message = new Message();
+        $message->id = $this->trimmed('message');
+        $message->find();
+        return $message;
+    }
+    
+    function get_message_profile($message) {
+        $user = common_current_user();
+        if ($user->id == $message->from_profile) {
+            return $message->getTo();
+        } else if ($user->id == $message->to_profile) {
+            return $message->getFrom();
+        } else {
+            # This shouldn't happen
+            return NULL;
+        }
+    }
+    
+    function get_instructions() {
+        return '';
+    }
+    
+    function views_menu() {
+        return;
+    }
 }
-       
\ No newline at end of file
+    
\ No newline at end of file
index 6dea6d7bba69fbe9405c92c6f4744d7ee86a11b3..74d197ed1f3b7ac69bec0918408ef6ea8f0b4058 100644 (file)
@@ -23,94 +23,94 @@ require_once(INSTALLDIR.'/lib/stream.php');
 
 class ShownoticeAction extends StreamAction {
 
-       var $notice = NULL;
-       var $profile = NULL;
-       var $avatar = NULL;
+    var $notice = NULL;
+    var $profile = NULL;
+    var $avatar = NULL;
 
-       function prepare($args) {
+    function prepare($args) {
 
-               parent::prepare($args);
+        parent::prepare($args);
 
-               $id = $this->arg('notice');
-               $this->notice = Notice::staticGet($id);
+        $id = $this->arg('notice');
+        $this->notice = Notice::staticGet($id);
 
-               if (!$this->notice) {
-                       $this->client_error(_('No such notice.'), 404);
-                       return false;
-               }
+        if (!$this->notice) {
+            $this->client_error(_('No such notice.'), 404);
+            return false;
+        }
 
-               $this->profile = $this->notice->getProfile();
+        $this->profile = $this->notice->getProfile();
 
-               if (!$this->profile) {
-                       $this->server_error(_('Notice has no profile'), 500);
-                       return false;
-               }
+        if (!$this->profile) {
+            $this->server_error(_('Notice has no profile'), 500);
+            return false;
+        }
 
-               $this->avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
+        $this->avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
 
-               return true;
-       }
+        return true;
+    }
 
-       function last_modified() {
-               return max(strtotime($this->notice->created),
-                                  strtotime($this->profile->modified),
-                                  ($this->avatar) ? strtotime($this->avatar->modified) : 0);
-       }
+    function last_modified() {
+        return max(strtotime($this->notice->created),
+                   strtotime($this->profile->modified),
+                   ($this->avatar) ? strtotime($this->avatar->modified) : 0);
+    }
 
-       function etag() {
-               return 'W/"' . implode(':', array($this->arg('action'),
-                                                                                 common_language(),
-                                                                                 $this->notice->id,
-                                                                                 strtotime($this->notice->created),
-                                                                                 strtotime($this->profile->modified),
-                                                                                 ($this->avatar) ? strtotime($this->avatar->modified) : 0)) . '"';
-       }
+    function etag() {
+        return 'W/"' . implode(':', array($this->arg('action'),
+                                          common_language(),
+                                          $this->notice->id,
+                                          strtotime($this->notice->created),
+                                          strtotime($this->profile->modified),
+                                          ($this->avatar) ? strtotime($this->avatar->modified) : 0)) . '"';
+    }
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               common_show_header(sprintf(_('%1$s\'s status on %2$s'),
-                                                                  $this->profile->nickname,
-                                                                  common_exact_date($this->notice->created)),
-                                                  array($this, 'show_header'), NULL,
-                                                  array($this, 'show_top'));
+        common_show_header(sprintf(_('%1$s\'s status on %2$s'),
+                                   $this->profile->nickname,
+                                   common_exact_date($this->notice->created)),
+                           array($this, 'show_header'), NULL,
+                           array($this, 'show_top'));
 
-               common_element_start('ul', array('id' => 'notices'));
+        common_element_start('ul', array('id' => 'notices'));
         $nli = new NoticeListItem($this->notice);
         $nli->show();
-               common_element_end('ul');
+        common_element_end('ul');
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function show_header() {
+    function show_header() {
 
-               $user = User::staticGet($this->profile->id);
+        $user = User::staticGet($this->profile->id);
 
-               if (!$user) {
-                       return;
-               }
+        if (!$user) {
+            return;
+        }
 
-               if ($user->emailmicroid && $user->email && $this->notice->uri) {
-                       common_element('meta', array('name' => 'microid',
-                                                                                'content' => "mailto+http:sha1:" . sha1(sha1('mailto:' . $user->email) . sha1($this->notice->uri))));
-               }
+        if ($user->emailmicroid && $user->email && $this->notice->uri) {
+            common_element('meta', array('name' => 'microid',
+                                         'content' => "mailto+http:sha1:" . sha1(sha1('mailto:' . $user->email) . sha1($this->notice->uri))));
+        }
 
-               if ($user->jabbermicroid && $user->jabber && $this->notice->uri) {
-                       common_element('meta', array('name' => 'microid',
-                                                                                'content' => "xmpp+http:sha1:" . sha1(sha1('xmpp:' . $user->jabber) . sha1($this->notice->uri))));
-               }
-       }
+        if ($user->jabbermicroid && $user->jabber && $this->notice->uri) {
+            common_element('meta', array('name' => 'microid',
+                                         'content' => "xmpp+http:sha1:" . sha1(sha1('xmpp:' . $user->jabber) . sha1($this->notice->uri))));
+        }
+    }
 
-       function show_top() {
-               $cur = common_current_user();
-               if ($cur && $cur->id == $this->profile->id) {
-                       common_notice_form();
-               }
-       }
+    function show_top() {
+        $cur = common_current_user();
+        if ($cur && $cur->id == $this->profile->id) {
+            common_notice_form();
+        }
+    }
 
-       function no_such_notice() {
-               common_user_error(_('No such notice.'));
-       }
+    function no_such_notice() {
+        common_user_error(_('No such notice.'));
+    }
 }
index 61fdec3fedcb3182eeb19b5114cbee4e6b1b124b..f8525348d3383ad98ee0c5e6f4feeb55feffc396 100644 (file)
@@ -26,12 +26,12 @@ define('SUBSCRIPTIONS', 80);
 
 class ShowstreamAction extends StreamAction {
 
-       function handle($args) {
+    function handle($args) {
 
-               parent::handle($args);
+        parent::handle($args);
 
         $nickname_arg = $this->arg('nickname');
-               $nickname = common_canonical_nickname($nickname_arg);
+        $nickname = common_canonical_nickname($nickname_arg);
 
         # Permanent redirect on non-canonical nickname
 
@@ -44,163 +44,163 @@ class ShowstreamAction extends StreamAction {
             return;
         }
 
-               $user = User::staticGet('nickname', $nickname);
-
-               if (!$user) {
-                       $this->no_such_user();
-                       return;
-               }
-
-               $profile = $user->getProfile();
-
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
-
-               # Looks like we're good; start output
-
-               # For YADIS discovery, we also have a <meta> tag
-
-               header('X-XRDS-Location: '. common_local_url('xrds', array('nickname' =>
-                                                                                                                                  $user->nickname)));
-
-               common_show_header($profile->nickname,
-                                                  array($this, 'show_header'), $user,
-                                                  array($this, 'show_top'));
-
-               $this->show_profile($profile);
-
-               $this->show_notices($user);
-
-               common_show_footer();
-       }
-
-       function show_top($user) {
-               $cur = common_current_user();
-
-               if ($cur && $cur->id == $user->id) {
-                       common_notice_form('showstream');
-               }
-
-               $this->views_menu();
-
-               $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('nickname' => $user->nickname)),
-                                                                                         'type' => 'rss',
-                                                                                         'version' => 'RSS 1.0',
-                                                                                         'item' => 'notices'),
-                                                                        1=>array('href'=>common_local_url('usertimeline', array('nickname' => $user->nickname)),
-                                                                                         'type' => 'atom',
-                                                                                         'version' => 'Atom 1.0',
-                                                                                         'item' => 'usertimeline'),
-
-                                                                        2=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
-                                                                                         'type' => 'rdf',
-                                                                                         'version' => 'FOAF',
-                                                                                         'item' => 'foaf')));
-       }
-
-       function show_header($user) {
-               # Feeds
-               common_element('link', array('rel' => 'alternate',
-                                                                        'href' => common_local_url('api',
-                                                                                                                               array('apiaction' => 'statuses',
-                                                                                                                                         'method' => 'user_timeline.rss',
-                                                                                                                                         'argument' => $user->nickname)),
-                                                                        'type' => 'application/rss+xml',
-                                                                        'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
-               common_element('link', array('rel' => 'alternate feed',
-                                                                        'href' => common_local_url('api',
-                                                                                                                               array('apiaction' => 'statuses',
-                                                                                                                                         'method' => 'user_timeline.atom',
-                                                                                                                                         'argument' => $user->nickname)),
-                                                                        'type' => 'application/atom+xml',
-                                                                        'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
-               common_element('link', array('rel' => 'alternate',
-                                                                        'href' => common_local_url('userrss', array('nickname' =>
-                                                                                                                                                          $user->nickname)),
-                                                                        'type' => 'application/rdf+xml',
-                                                                        'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
-               # FOAF
-               common_element('link', array('rel' => 'meta',
-                                                                        'href' => common_local_url('foaf', array('nickname' =>
-                                                                                                                                                         $user->nickname)),
-                                                                        'type' => 'application/rdf+xml',
-                                                                        'title' => 'FOAF'));
-               # for remote subscriptions etc.
-               common_element('meta', array('http-equiv' => 'X-XRDS-Location',
-                                                                        'content' => common_local_url('xrds', array('nickname' =>
-                                                                                                                                                          $user->nickname))));
-               $profile = $user->getProfile();
-               if ($profile->bio) {
-                       common_element('meta', array('name' => 'description',
-                                                                                'content' => $profile->bio));
-               }
-
-               if ($user->emailmicroid && $user->email && $profile->profileurl) {
-                       common_element('meta', array('name' => 'microid',
-                                                                                'content' => "mailto+http:sha1:" . sha1(sha1('mailto:' . $user->email) . sha1($profile->profileurl))));
-               }
-               if ($user->jabbermicroid && $user->jabber && $profile->profileurl) {
-                       common_element('meta', array('name' => 'microid',
-                                                                                'content' => "xmpp+http:sha1:" . sha1(sha1('xmpp:' . $user->jabber) . sha1($profile->profileurl))));
-               }
-
-               # See https://wiki.mozilla.org/Microsummaries
-
-               common_element('link', array('rel' => 'microsummary',
-                                                                        'href' => common_local_url('microsummary',
-                                                                                                                               array('nickname' => $profile->nickname))));
-       }
-
-       function no_such_user() {
-               $this->client_error(_('No such user.'), 404);
-       }
-
-       function show_profile($profile) {
-
-               common_element_start('div', array('id' => 'profile', 'class' => 'vcard'));
-
-               $this->show_personal($profile);
-
-               $this->show_last_notice($profile);
-
-               $cur = common_current_user();
-
-               $this->show_subscriptions($profile);
-
-               common_element_end('div');
-       }
-
-       function show_personal($profile) {
-
-               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-               common_element_start('div', array('id' => 'profile_avatar'));
-               common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
-                                                                       'class' => 'avatar profile photo',
-                                                                       'width' => AVATAR_PROFILE_SIZE,
-                                                                       'height' => AVATAR_PROFILE_SIZE,
-                                                                       'alt' => $profile->nickname));
+        $user = User::staticGet('nickname', $nickname);
+
+        if (!$user) {
+            $this->no_such_user();
+            return;
+        }
+
+        $profile = $user->getProfile();
+
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
+
+        # Looks like we're good; start output
+
+        # For YADIS discovery, we also have a <meta> tag
+
+        header('X-XRDS-Location: '. common_local_url('xrds', array('nickname' =>
+                                                                   $user->nickname)));
+
+        common_show_header($profile->nickname,
+                           array($this, 'show_header'), $user,
+                           array($this, 'show_top'));
+
+        $this->show_profile($profile);
+
+        $this->show_notices($user);
+
+        common_show_footer();
+    }
+
+    function show_top($user) {
+        $cur = common_current_user();
+
+        if ($cur && $cur->id == $user->id) {
+            common_notice_form('showstream');
+        }
+
+        $this->views_menu();
+
+        $this->show_feeds_list(array(0=>array('href'=>common_local_url('userrss', array('nickname' => $user->nickname)),
+                                              'type' => 'rss',
+                                              'version' => 'RSS 1.0',
+                                              'item' => 'notices'),
+                                     1=>array('href'=>common_local_url('usertimeline', array('nickname' => $user->nickname)),
+                                              'type' => 'atom',
+                                              'version' => 'Atom 1.0',
+                                              'item' => 'usertimeline'),
+
+                                     2=>array('href'=>common_local_url('foaf',array('nickname' => $user->nickname)),
+                                              'type' => 'rdf',
+                                              'version' => 'FOAF',
+                                              'item' => 'foaf')));
+    }
+
+    function show_header($user) {
+        # Feeds
+        common_element('link', array('rel' => 'alternate',
+                                     'href' => common_local_url('api',
+                                                                array('apiaction' => 'statuses',
+                                                                      'method' => 'user_timeline.rss',
+                                                                      'argument' => $user->nickname)),
+                                     'type' => 'application/rss+xml',
+                                     'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
+        common_element('link', array('rel' => 'alternate feed',
+                                     'href' => common_local_url('api',
+                                                                array('apiaction' => 'statuses',
+                                                                      'method' => 'user_timeline.atom',
+                                                                      'argument' => $user->nickname)),
+                                     'type' => 'application/atom+xml',
+                                     'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
+        common_element('link', array('rel' => 'alternate',
+                                     'href' => common_local_url('userrss', array('nickname' =>
+                                                                               $user->nickname)),
+                                     'type' => 'application/rdf+xml',
+                                     'title' => sprintf(_('Notice feed for %s'), $user->nickname)));
+        # FOAF
+        common_element('link', array('rel' => 'meta',
+                                     'href' => common_local_url('foaf', array('nickname' =>
+                                                                              $user->nickname)),
+                                     'type' => 'application/rdf+xml',
+                                     'title' => 'FOAF'));
+        # for remote subscriptions etc.
+        common_element('meta', array('http-equiv' => 'X-XRDS-Location',
+                                     'content' => common_local_url('xrds', array('nickname' =>
+                                                                               $user->nickname))));
+        $profile = $user->getProfile();
+        if ($profile->bio) {
+            common_element('meta', array('name' => 'description',
+                                         'content' => $profile->bio));
+        }
+
+        if ($user->emailmicroid && $user->email && $profile->profileurl) {
+            common_element('meta', array('name' => 'microid',
+                                         'content' => "mailto+http:sha1:" . sha1(sha1('mailto:' . $user->email) . sha1($profile->profileurl))));
+        }
+        if ($user->jabbermicroid && $user->jabber && $profile->profileurl) {
+            common_element('meta', array('name' => 'microid',
+                                         'content' => "xmpp+http:sha1:" . sha1(sha1('xmpp:' . $user->jabber) . sha1($profile->profileurl))));
+        }
+
+        # See https://wiki.mozilla.org/Microsummaries
+
+        common_element('link', array('rel' => 'microsummary',
+                                     'href' => common_local_url('microsummary',
+                                                                array('nickname' => $profile->nickname))));
+    }
+
+    function no_such_user() {
+        $this->client_error(_('No such user.'), 404);
+    }
+
+    function show_profile($profile) {
+
+        common_element_start('div', array('id' => 'profile', 'class' => 'vcard'));
+
+        $this->show_personal($profile);
+
+        $this->show_last_notice($profile);
+
+        $cur = common_current_user();
+
+        $this->show_subscriptions($profile);
+
+        common_element_end('div');
+    }
+
+    function show_personal($profile) {
+
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+        common_element_start('div', array('id' => 'profile_avatar'));
+        common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
+                                    'class' => 'avatar profile photo',
+                                    'width' => AVATAR_PROFILE_SIZE,
+                                    'height' => AVATAR_PROFILE_SIZE,
+                                    'alt' => $profile->nickname));
 
         common_element_start('ul', array('id' => 'profile_actions'));
 
         common_element_start('li', array('id' => 'profile_subscribe'));
-               $cur = common_current_user();
-               if ($cur) {
-                       if ($cur->id != $profile->id) {
-                               if ($cur->isSubscribed($profile)) {
-                                       common_unsubscribe_form($profile);
-                               } else {
-                                       common_subscribe_form($profile);
-                               }
-                       }
-               } else {
-                       $this->show_remote_subscribe_link($profile);
-               }
+        $cur = common_current_user();
+        if ($cur) {
+            if ($cur->id != $profile->id) {
+                if ($cur->isSubscribed($profile)) {
+                    common_unsubscribe_form($profile);
+                } else {
+                    common_subscribe_form($profile);
+                }
+            }
+        } else {
+            $this->show_remote_subscribe_link($profile);
+        }
         common_element_end('li');
 
-               $user = User::staticGet('id', $profile->id);
-               common_profile_new_message_nudge($cur, $user, $profile);
+        $user = User::staticGet('id', $profile->id);
+        common_profile_new_message_nudge($cur, $user, $profile);
 
         if ($cur && $cur->id != $profile->id) {
             $blocked = $cur->hasBlocked($profile);
@@ -215,224 +215,224 @@ class ShowstreamAction extends StreamAction {
             common_element_end('li');
         }
 
-               common_element_end('ul');
-
-               common_element_end('div');
-
-               common_element_start('div', array('id' => 'profile_information'));
-
-               if ($profile->fullname) {
-                       common_element('h1', array('class' => 'fn'), $profile->fullname . ' (' . $profile->nickname . ')');
-               } else {
-                       common_element('h1', array('class' => 'fn nickname'), $profile->nickname);
-               }
-
-               if ($profile->location) {
-                       common_element('p', 'location', $profile->location);
-               }
-               if ($profile->bio) {
-                       common_element('p', 'description note', $profile->bio);
-               }
-               if ($profile->homepage) {
-                       common_element_start('p', 'website');
-                       common_element('a', array('href' => $profile->homepage,
-                                                                         'rel' => 'me', 'class' => 'url'),
-                                                  $profile->homepage);
-                       common_element_end('p');
-               }
-
-               $this->show_statistics($profile);
-
-               common_element_end('div');
-       }
-
-       function show_remote_subscribe_link($profile) {
-               $url = common_local_url('remotesubscribe',
-                                       array('nickname' => $profile->nickname));
-               common_element('a', array('href' => $url,
-                                                                 'id' => 'remotesubscribe'),
-                                          _('Subscribe'));
-       }
-
-       function show_unsubscribe_form($profile) {
-               common_element_start('form', array('id' => 'unsubscribe', 'method' => 'post',
-                                                                                  'action' => common_local_url('unsubscribe')));
-               common_hidden('token', common_session_token());
-               common_element('input', array('id' => 'unsubscribeto',
-                                                                         'name' => 'unsubscribeto',
-                                                                         'type' => 'hidden',
-                                                                         'value' => $profile->nickname));
-               common_element('input', array('type' => 'submit',
-                                                                         'class' => 'submit',
-                                                                         'value' => _('Unsubscribe')));
-               common_element_end('form');
-       }
-
-       function show_subscriptions($profile) {
-               global $config;
-
-               $subs = DB_DataObject::factory('subscription');
-               $subs->subscriber = $profile->id;
-               $subs->whereAdd('subscribed != ' . $profile->id);
-
-               $subs->orderBy('created DESC');
-
-               # We ask for an extra one to know if we need to do another page
-
-               $subs->limit(0, SUBSCRIPTIONS + 1);
-
-               $subs_count = $subs->find();
-
-               common_element_start('div', array('id' => 'subscriptions'));
-
-               common_element('h2', NULL, _('Subscriptions'));
-
-               if ($subs_count > 0) {
-
-                       common_element_start('ul', array('id' => 'subscriptions_avatars'));
-
-                       for ($i = 0; $i < min($subs_count, SUBSCRIPTIONS); $i++) {
-
-                               if (!$subs->fetch()) {
-                                       common_debug('Weirdly, broke out of subscriptions loop early', __FILE__);
-                                       break;
-                               }
-
-                               $other = Profile::staticGet($subs->subscribed);
-
-                               if (!$other) {
-                                       common_log_db_error($subs, 'SELECT', __FILE__);
-                                       continue;
-                               }
-
-                               common_element_start('li', 'vcard');
-                               common_element_start('a', array('title' => ($other->fullname) ?
-                                                                                               $other->fullname :
-                                                                                               $other->nickname,
-                                                                                               'href' => $other->profileurl,
-                                                                                               'rel' => 'contact',
-                                                                                               'class' => 'subscription fn url'));
-                               $avatar = $other->getAvatar(AVATAR_MINI_SIZE);
-                               common_element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
-                                                                                       'width' => AVATAR_MINI_SIZE,
-                                                                                       'height' => AVATAR_MINI_SIZE,
-                                                                                       'class' => 'avatar mini photo',
-                                                                                       'alt' =>  ($other->fullname) ?
-                                                                                       $other->fullname :
-                                                                                       $other->nickname));
-                               common_element_end('a');
-                               common_element_end('li');
-                       }
-
-                       common_element_end('ul');
-               }
-
-               if ($subs_count > SUBSCRIPTIONS) {
-                       common_element_start('p', array('id' => 'subscriptions_viewall'));
-
-                       common_element('a', array('href' => common_local_url('subscriptions',
-                                                                                                                                array('nickname' => $profile->nickname)),
-                                                                         'class' => 'moresubscriptions'),
-                                                  _('All subscriptions'));
-                       common_element_end('p');
-               }
-
-               common_element_end('div');
-       }
-
-       function show_statistics($profile) {
-
-               // XXX: WORM cache this
-               $subs = DB_DataObject::factory('subscription');
-               $subs->subscriber = $profile->id;
-               $subs_count = (int) $subs->count() - 1;
-
-               $subbed = DB_DataObject::factory('subscription');
-               $subbed->subscribed = $profile->id;
-               $subbed_count = (int) $subbed->count() - 1;
-
-               $notices = DB_DataObject::factory('notice');
-               $notices->profile_id = $profile->id;
-               $notice_count = (int) $notices->count();
-
-               common_element_start('div', 'statistics');
-               common_element('h2', 'statistics', _('Statistics'));
-
-               # Other stats...?
-               common_element_start('dl', 'statistics');
-               common_element('dt', 'membersince', _('Member since'));
-               common_element('dd', 'membersince', date('j M Y',
-                                                                                                strtotime($profile->created)));
-
-               common_element_start('dt', 'subscriptions');
-               common_element('a', array('href' => common_local_url('subscriptions',
-                                                                                                                        array('nickname' => $profile->nickname))),
-                                          _('Subscriptions'));
-               common_element_end('dt');
-               common_element('dd', 'subscriptions', (is_int($subs_count)) ? $subs_count : '0');
-               common_element_start('dt', 'subscribers');
-               common_element('a', array('href' => common_local_url('subscribers',
-                                                                                                                        array('nickname' => $profile->nickname))),
-                                          _('Subscribers'));
-               common_element_end('dt');
-               common_element('dd', 'subscribers', (is_int($subbed_count)) ? $subbed_count : '0');
-               common_element('dt', 'notices', _('Notices'));
-               common_element('dd', 'notices', (is_int($notice_count)) ? $notice_count : '0');
-               # XXX: link these to something
-               common_element('dt', 'tags', _('Tags'));
-               common_element_start('dd', 'tags');
-               $tags = Profile_tag::getTags($profile->id, $profile->id);
-
-               common_element_start('ul', 'tags xoxo');
-               foreach ($tags as $tag) {
-                       common_element_start('li');
-                       common_element('a', array('rel' => 'bookmark tag',
-                                                                         'href' => common_local_url('peopletag',
-                                                                                                                                array('tag' => $tag))),
-                                                  $tag);
-                       common_element_end('li');
-               }
-               common_element_end('ul');
-           common_element_end('dd');
-
-               common_element_end('dl');
-
-               common_element_end('div');
-       }
-
-       function show_notices($user) {
-
-               $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
-
-               $notice = $user->getNotices(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
+        common_element_end('ul');
+
+        common_element_end('div');
+
+        common_element_start('div', array('id' => 'profile_information'));
+
+        if ($profile->fullname) {
+            common_element('h1', array('class' => 'fn'), $profile->fullname . ' (' . $profile->nickname . ')');
+        } else {
+            common_element('h1', array('class' => 'fn nickname'), $profile->nickname);
+        }
+
+        if ($profile->location) {
+            common_element('p', 'location', $profile->location);
+        }
+        if ($profile->bio) {
+            common_element('p', 'description note', $profile->bio);
+        }
+        if ($profile->homepage) {
+            common_element_start('p', 'website');
+            common_element('a', array('href' => $profile->homepage,
+                                      'rel' => 'me', 'class' => 'url'),
+                           $profile->homepage);
+            common_element_end('p');
+        }
+
+        $this->show_statistics($profile);
+
+        common_element_end('div');
+    }
+
+    function show_remote_subscribe_link($profile) {
+        $url = common_local_url('remotesubscribe',
+                                array('nickname' => $profile->nickname));
+        common_element('a', array('href' => $url,
+                                  'id' => 'remotesubscribe'),
+                       _('Subscribe'));
+    }
+
+    function show_unsubscribe_form($profile) {
+        common_element_start('form', array('id' => 'unsubscribe', 'method' => 'post',
+                                           'action' => common_local_url('unsubscribe')));
+        common_hidden('token', common_session_token());
+        common_element('input', array('id' => 'unsubscribeto',
+                                      'name' => 'unsubscribeto',
+                                      'type' => 'hidden',
+                                      'value' => $profile->nickname));
+        common_element('input', array('type' => 'submit',
+                                      'class' => 'submit',
+                                      'value' => _('Unsubscribe')));
+        common_element_end('form');
+    }
+
+    function show_subscriptions($profile) {
+        global $config;
+
+        $subs = DB_DataObject::factory('subscription');
+        $subs->subscriber = $profile->id;
+        $subs->whereAdd('subscribed != ' . $profile->id);
+
+        $subs->orderBy('created DESC');
+
+        # We ask for an extra one to know if we need to do another page
+
+        $subs->limit(0, SUBSCRIPTIONS + 1);
+
+        $subs_count = $subs->find();
+
+        common_element_start('div', array('id' => 'subscriptions'));
+
+        common_element('h2', NULL, _('Subscriptions'));
+
+        if ($subs_count > 0) {
+
+            common_element_start('ul', array('id' => 'subscriptions_avatars'));
+
+            for ($i = 0; $i < min($subs_count, SUBSCRIPTIONS); $i++) {
+
+                if (!$subs->fetch()) {
+                    common_debug('Weirdly, broke out of subscriptions loop early', __FILE__);
+                    break;
+                }
+
+                $other = Profile::staticGet($subs->subscribed);
+
+                if (!$other) {
+                    common_log_db_error($subs, 'SELECT', __FILE__);
+                    continue;
+                }
+
+                common_element_start('li', 'vcard');
+                common_element_start('a', array('title' => ($other->fullname) ?
+                                                $other->fullname :
+                                                $other->nickname,
+                                                'href' => $other->profileurl,
+                                                'rel' => 'contact',
+                                                 'class' => 'subscription fn url'));
+                $avatar = $other->getAvatar(AVATAR_MINI_SIZE);
+                common_element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
+                                            'width' => AVATAR_MINI_SIZE,
+                                            'height' => AVATAR_MINI_SIZE,
+                                            'class' => 'avatar mini photo',
+                                            'alt' =>  ($other->fullname) ?
+                                            $other->fullname :
+                                            $other->nickname));
+                common_element_end('a');
+                common_element_end('li');
+            }
+
+            common_element_end('ul');
+        }
+
+        if ($subs_count > SUBSCRIPTIONS) {
+            common_element_start('p', array('id' => 'subscriptions_viewall'));
+
+            common_element('a', array('href' => common_local_url('subscriptions',
+                                                                 array('nickname' => $profile->nickname)),
+                                      'class' => 'moresubscriptions'),
+                           _('All subscriptions'));
+            common_element_end('p');
+        }
+
+        common_element_end('div');
+    }
+
+    function show_statistics($profile) {
+
+        // XXX: WORM cache this
+        $subs = DB_DataObject::factory('subscription');
+        $subs->subscriber = $profile->id;
+        $subs_count = (int) $subs->count() - 1;
+
+        $subbed = DB_DataObject::factory('subscription');
+        $subbed->subscribed = $profile->id;
+        $subbed_count = (int) $subbed->count() - 1;
+
+        $notices = DB_DataObject::factory('notice');
+        $notices->profile_id = $profile->id;
+        $notice_count = (int) $notices->count();
+
+        common_element_start('div', 'statistics');
+        common_element('h2', 'statistics', _('Statistics'));
+
+        # Other stats...?
+        common_element_start('dl', 'statistics');
+        common_element('dt', 'membersince', _('Member since'));
+        common_element('dd', 'membersince', date('j M Y',
+                                                 strtotime($profile->created)));
+
+        common_element_start('dt', 'subscriptions');
+        common_element('a', array('href' => common_local_url('subscriptions',
+                                                             array('nickname' => $profile->nickname))),
+                       _('Subscriptions'));
+        common_element_end('dt');
+        common_element('dd', 'subscriptions', (is_int($subs_count)) ? $subs_count : '0');
+        common_element_start('dt', 'subscribers');
+        common_element('a', array('href' => common_local_url('subscribers',
+                                                             array('nickname' => $profile->nickname))),
+                       _('Subscribers'));
+        common_element_end('dt');
+        common_element('dd', 'subscribers', (is_int($subbed_count)) ? $subbed_count : '0');
+        common_element('dt', 'notices', _('Notices'));
+        common_element('dd', 'notices', (is_int($notice_count)) ? $notice_count : '0');
+        # XXX: link these to something
+        common_element('dt', 'tags', _('Tags'));
+        common_element_start('dd', 'tags');
+        $tags = Profile_tag::getTags($profile->id, $profile->id);
+
+        common_element_start('ul', 'tags xoxo');
+        foreach ($tags as $tag) {
+            common_element_start('li');
+            common_element('a', array('rel' => 'bookmark tag',
+                                      'href' => common_local_url('peopletag',
+                                                                 array('tag' => $tag))),
+                           $tag);
+            common_element_end('li');
+        }
+        common_element_end('ul');
+        common_element_end('dd');
+
+        common_element_end('dl');
+
+        common_element_end('div');
+    }
+
+    function show_notices($user) {
+
+        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+
+        $notice = $user->getNotices(($page-1)*NOTICES_PER_PAGE, NOTICES_PER_PAGE + 1);
 
         $pnl = new ProfileNoticeList($notice);
         $cnt = $pnl->show();
 
-               common_pagination($page>1, $cnt>NOTICES_PER_PAGE, $page,
-                                                 'showstream', array('nickname' => $user->nickname));
-       }
-
-       function show_last_notice($profile) {
-
-               common_element('h2', NULL, _('Currently'));
-
-               $notice = $profile->getCurrentNotice();
-
-               if ($notice) {
-                       # FIXME: URL, image, video, audio
-                       common_element_start('p', array('class' => 'notice_current'));
-                       if ($notice->rendered) {
-                               common_raw($notice->rendered);
-                       } else {
-                               # XXX: may be some uncooked notices in the DB,
-                               # we cook them right now. This can probably disappear in future
-                               # versions (>> 0.4.x)
-                               common_raw(common_render_content($notice->content, $notice));
-                       }
-                       common_element_end('p');
-               }
-       }
+        common_pagination($page>1, $cnt>NOTICES_PER_PAGE, $page,
+                          'showstream', array('nickname' => $user->nickname));
+    }
+
+    function show_last_notice($profile) {
+
+        common_element('h2', NULL, _('Currently'));
+
+        $notice = $profile->getCurrentNotice();
+
+        if ($notice) {
+            # FIXME: URL, image, video, audio
+            common_element_start('p', array('class' => 'notice_current'));
+            if ($notice->rendered) {
+                common_raw($notice->rendered);
+            } else {
+                # XXX: may be some uncooked notices in the DB,
+                # we cook them right now. This can probably disappear in future
+                # versions (>> 0.4.x)
+                common_raw(common_render_content($notice->content, $notice));
+            }
+            common_element_end('p');
+        }
+    }
 }
 
 # We don't show the author for a profile, since we already know who it is!
index 5db26730a50b1c5f05ccb314dc4dab33c3adba7b..506801e9759b701883794a13e30f33a8b8811ce2 100644 (file)
@@ -24,308 +24,308 @@ require_once(INSTALLDIR.'/actions/emailsettings.php');
 
 class SmssettingsAction extends EmailsettingsAction {
 
-       function get_instructions() {
-               return _('You can receive SMS messages through email from %%site.name%%.');
-       }
-
-       function show_form($msg=NULL, $success=false) {
-               $user = common_current_user();
-               $this->form_header(_('SMS Settings'), $msg, $success);
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'smssettings',
-                                                                                  'action' =>
-                                                                                  common_local_url('smssettings')));
-               common_hidden('token', common_session_token());
-               common_element('h2', NULL, _('Address'));
-
-               if ($user->sms) {
-                       common_element_start('p');
-                       $carrier = $user->getCarrier();
-                       common_element('span', 'address confirmed', $user->sms . ' (' . $carrier->name . ')');
-                       common_element('span', 'input_instructions',
-                                      _('Current confirmed SMS-enabled phone number.'));
-                       common_hidden('sms', $user->sms);
-                       common_hidden('carrier', $user->carrier);
-                       common_element_end('p');
-                       common_submit('remove', _('Remove'));
-               } else {
-                       $confirm = $this->get_confirmation();
-                       if ($confirm) {
-                               $carrier = Sms_carrier::staticGet($confirm->address_extra);
-                               common_element_start('p');
-                               common_element('span', 'address unconfirmed', $confirm->address . ' (' . $carrier->name . ')');
-                               common_element('span', 'input_instructions',
-                                                          _('Awaiting confirmation on this phone number.'));
-                               common_hidden('sms', $confirm->address);
-                               common_hidden('carrier', $confirm->address_extra);
-                               common_element_end('p');
-                               common_submit('cancel', _('Cancel'));
-                               common_input('code', _('Confirmation code'), NULL,
-                                                        _('Enter the code you received on your phone.'));
-                               common_submit('confirm', _('Confirm'));
-                       } else {
-                               common_input('sms', _('SMS Phone number'),
-                                                        ($this->arg('sms')) ? $this->arg('sms') : NULL,
-                                                        _('Phone number, no punctuation or spaces, with area code'));
-                               $this->carrier_select();
-                               common_submit('add', _('Add'));
-                       }
-               }
-
-               if ($user->sms) {
-                       common_element('h2', NULL, _('Incoming email'));
-                       
-                       if ($user->incomingemail) {
-                               common_element_start('p');
-                               common_element('span', 'address', $user->incomingemail);
-                               common_element('span', 'input_instructions',
-                                                          _('Send email to this address to post new notices.'));
-                               common_element_end('p');
-                               common_submit('removeincoming', _('Remove'));
-                       }
-                       
-                       common_element_start('p');
-                       common_element('span', 'input_instructions',
-                                                  _('Make a new email address for posting to; cancels the old one.'));
-                       common_element_end('p');
-                       common_submit('newincoming', _('New'));
-               }
-               
-               common_element('h2', NULL, _('Preferences'));
-               
-               common_checkbox('smsnotify',
-                                               _('Send me notices through SMS; I understand I may incur exorbitant charges from my carrier.'),
-                                               $user->smsnotify);
-                       
-               common_submit('save', _('Save'));
-               
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function get_confirmation() {
-               $user = common_current_user();
-               $confirm = new Confirm_address();
-               $confirm->user_id = $user->id;
-               $confirm->address_type = 'sms';
-               if ($confirm->find(TRUE)) {
-                       return $confirm;
-               } else {
-                       return NULL;
-               }
-       }
-
-       function handle_post() {
-
-               # CSRF protection
-
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               if ($this->arg('save')) {
-                       $this->save_preferences();
-               } else if ($this->arg('add')) {
-                       $this->add_address();
-               } else if ($this->arg('cancel')) {
-                       $this->cancel_confirmation();
-               } else if ($this->arg('remove')) {
-                       $this->remove_address();
-               } else if ($this->arg('removeincoming')) {
-                       $this->remove_incoming();
-               } else if ($this->arg('newincoming')) {
-                       $this->new_incoming();
-               } else if ($this->arg('confirm')) {
-                       $this->confirm_code();
-               } else {
-                       $this->show_form(_('Unexpected form submission.'));
-               }
-       }
-
-       function save_preferences() {
-
-               $smsnotify = $this->boolean('smsnotify');
-               
-               $user = common_current_user();
-
-               assert(!is_null($user)); # should already be checked
-
-               $user->query('BEGIN');
-
-               $original = clone($user);
-
-               $user->smsnotify = $smsnotify;
-
-               $result = $user->update($original);
-
-               if ($result === FALSE) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t update user.'));
-                       return;
-               }
-
-               $user->query('COMMIT');
-
-               $this->show_form(_('Preferences saved.'), true);
-       }
-
-       function add_address() {
-
-               $user = common_current_user();
-
-               $sms = $this->trimmed('sms');
-               $carrier_id = $this->trimmed('carrier');
-               
-               # Some validation
-
-               if (!$sms) {
-                       $this->show_form(_('No phone number.'));
-                       return;
-               }
-
-               if (!$carrier_id) {
-                       $this->show_form(_('No carrier selected.'));
-                       return;
-               }
-               
-               $sms = common_canonical_sms($sms);
-               
-               if ($user->sms == $sms) {
-                   $this->show_form(_('That is already your phone number.'));
-                   return;
-               } else if ($this->sms_exists($sms)) {
-                   $this->show_form(_('That phone number already belongs to another user.'));
-                   return;
-               }
-
-               $confirm = new Confirm_address();
-               $confirm->address = $sms;
-               $confirm->address_extra = $carrier_id;
-               $confirm->address_type = 'sms';
-               $confirm->user_id = $user->id;
-               $confirm->code = common_confirmation_code(40);
-
-               $result = $confirm->insert();
-
-               if ($result === FALSE) {
-                       common_log_db_error($confirm, 'INSERT', __FILE__);
-                       common_server_error(_('Couldn\'t insert confirmation code.'));
-                       return;
-               }
-
-               $carrier = Sms_carrier::staticGet($carrier_id);
-               
-               mail_confirm_sms($confirm->code,
-                                                $user->nickname,
-                                                $carrier->toEmailAddress($sms));
-
-               $msg = _('A confirmation code was sent to the phone number you added. Check your inbox (and spam box!) for the code and instructions on how to use it.');
-
-               $this->show_form($msg, TRUE);
-       }
-
-       function cancel_confirmation() {
-               
-               $sms = $this->trimmed('sms');
-               $carrier = $this->trimmed('carrier');
-               
-               $confirm = $this->get_confirmation();
-               
-               if (!$confirm) {
-                       $this->show_form(_('No pending confirmation to cancel.'));
-                       return;
-               }
-               if ($confirm->address != $sms) {
-                       $this->show_form(_('That is the wrong confirmation number.'));
-                       return;
-               }
+    function get_instructions() {
+        return _('You can receive SMS messages through email from %%site.name%%.');
+    }
+
+    function show_form($msg=NULL, $success=false) {
+        $user = common_current_user();
+        $this->form_header(_('SMS Settings'), $msg, $success);
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'smssettings',
+                                           'action' =>
+                                           common_local_url('smssettings')));
+        common_hidden('token', common_session_token());
+        common_element('h2', NULL, _('Address'));
+
+        if ($user->sms) {
+            common_element_start('p');
+            $carrier = $user->getCarrier();
+            common_element('span', 'address confirmed', $user->sms . ' (' . $carrier->name . ')');
+            common_element('span', 'input_instructions',
+                           _('Current confirmed SMS-enabled phone number.'));
+            common_hidden('sms', $user->sms);
+            common_hidden('carrier', $user->carrier);
+            common_element_end('p');
+            common_submit('remove', _('Remove'));
+        } else {
+            $confirm = $this->get_confirmation();
+            if ($confirm) {
+                $carrier = Sms_carrier::staticGet($confirm->address_extra);
+                common_element_start('p');
+                common_element('span', 'address unconfirmed', $confirm->address . ' (' . $carrier->name . ')');
+                common_element('span', 'input_instructions',
+                               _('Awaiting confirmation on this phone number.'));
+                common_hidden('sms', $confirm->address);
+                common_hidden('carrier', $confirm->address_extra);
+                common_element_end('p');
+                common_submit('cancel', _('Cancel'));
+                common_input('code', _('Confirmation code'), NULL,
+                             _('Enter the code you received on your phone.'));
+                common_submit('confirm', _('Confirm'));
+            } else {
+                common_input('sms', _('SMS Phone number'),
+                             ($this->arg('sms')) ? $this->arg('sms') : NULL,
+                             _('Phone number, no punctuation or spaces, with area code'));
+                $this->carrier_select();
+                common_submit('add', _('Add'));
+            }
+        }
+
+        if ($user->sms) {
+            common_element('h2', NULL, _('Incoming email'));
+            
+            if ($user->incomingemail) {
+                common_element_start('p');
+                common_element('span', 'address', $user->incomingemail);
+                common_element('span', 'input_instructions',
+                               _('Send email to this address to post new notices.'));
+                common_element_end('p');
+                common_submit('removeincoming', _('Remove'));
+            }
+            
+            common_element_start('p');
+            common_element('span', 'input_instructions',
+                           _('Make a new email address for posting to; cancels the old one.'));
+            common_element_end('p');
+            common_submit('newincoming', _('New'));
+        }
+        
+        common_element('h2', NULL, _('Preferences'));
+        
+        common_checkbox('smsnotify',
+                        _('Send me notices through SMS; I understand I may incur exorbitant charges from my carrier.'),
+                        $user->smsnotify);
+            
+        common_submit('save', _('Save'));
+        
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function get_confirmation() {
+        $user = common_current_user();
+        $confirm = new Confirm_address();
+        $confirm->user_id = $user->id;
+        $confirm->address_type = 'sms';
+        if ($confirm->find(TRUE)) {
+            return $confirm;
+        } else {
+            return NULL;
+        }
+    }
+
+    function handle_post() {
+
+        # CSRF protection
+
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        if ($this->arg('save')) {
+            $this->save_preferences();
+        } else if ($this->arg('add')) {
+            $this->add_address();
+        } else if ($this->arg('cancel')) {
+            $this->cancel_confirmation();
+        } else if ($this->arg('remove')) {
+            $this->remove_address();
+        } else if ($this->arg('removeincoming')) {
+            $this->remove_incoming();
+        } else if ($this->arg('newincoming')) {
+            $this->new_incoming();
+        } else if ($this->arg('confirm')) {
+            $this->confirm_code();
+        } else {
+            $this->show_form(_('Unexpected form submission.'));
+        }
+    }
+
+    function save_preferences() {
+
+        $smsnotify = $this->boolean('smsnotify');
+        
+        $user = common_current_user();
+
+        assert(!is_null($user)); # should already be checked
+
+        $user->query('BEGIN');
+
+        $original = clone($user);
+
+        $user->smsnotify = $smsnotify;
+
+        $result = $user->update($original);
+
+        if ($result === FALSE) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t update user.'));
+            return;
+        }
+
+        $user->query('COMMIT');
+
+        $this->show_form(_('Preferences saved.'), true);
+    }
+
+    function add_address() {
+
+        $user = common_current_user();
+
+        $sms = $this->trimmed('sms');
+        $carrier_id = $this->trimmed('carrier');
+        
+        # Some validation
+
+        if (!$sms) {
+            $this->show_form(_('No phone number.'));
+            return;
+        }
+
+        if (!$carrier_id) {
+            $this->show_form(_('No carrier selected.'));
+            return;
+        }
+        
+        $sms = common_canonical_sms($sms);
+        
+        if ($user->sms == $sms) {
+            $this->show_form(_('That is already your phone number.'));
+            return;
+        } else if ($this->sms_exists($sms)) {
+            $this->show_form(_('That phone number already belongs to another user.'));
+            return;
+        }
+
+          $confirm = new Confirm_address();
+           $confirm->address = $sms;
+           $confirm->address_extra = $carrier_id;
+           $confirm->address_type = 'sms';
+           $confirm->user_id = $user->id;
+           $confirm->code = common_confirmation_code(40);
+
+        $result = $confirm->insert();
+
+        if ($result === FALSE) {
+            common_log_db_error($confirm, 'INSERT', __FILE__);
+            common_server_error(_('Couldn\'t insert confirmation code.'));
+            return;
+        }
+
+        $carrier = Sms_carrier::staticGet($carrier_id);
+        
+        mail_confirm_sms($confirm->code,
+                         $user->nickname,
+                         $carrier->toEmailAddress($sms));
+
+        $msg = _('A confirmation code was sent to the phone number you added. Check your inbox (and spam box!) for the code and instructions on how to use it.');
+
+        $this->show_form($msg, TRUE);
+    }
+
+    function cancel_confirmation() {
+        
+        $sms = $this->trimmed('sms');
+        $carrier = $this->trimmed('carrier');
+        
+        $confirm = $this->get_confirmation();
+        
+        if (!$confirm) {
+            $this->show_form(_('No pending confirmation to cancel.'));
+            return;
+        }
+        if ($confirm->address != $sms) {
+            $this->show_form(_('That is the wrong confirmation number.'));
+            return;
+        }
 
         $result = $confirm->delete();
 
         if (!$result) {
-                       common_log_db_error($confirm, 'DELETE', __FILE__);
+            common_log_db_error($confirm, 'DELETE', __FILE__);
             $this->server_error(_('Couldn\'t delete email confirmation.'));
             return;
         }
 
         $this->show_form(_('Confirmation cancelled.'), TRUE);
-       }
-
-       function remove_address() {
-
-               $user = common_current_user();
-               $sms = $this->arg('sms');
-               $carrier = $this->arg('carrier');
-               
-               # Maybe an old tab open...?
-
-               if ($user->sms != $sms) {
-                   $this->show_form(_('That is not your phone number.'));
-                   return;
-               }
-
-               $user->query('BEGIN');
-               $original = clone($user);
-               $user->sms = NULL;
-               $user->carrier = NULL;          
-               $user->smsemail = NULL;         
-               $result = $user->updateKeys($original);
-               if (!$result) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t update user.'));
-                       return;
-               }
-               $user->query('COMMIT');
-
-               $this->show_form(_('The address was removed.'), TRUE);
-       }
-       
-       function sms_exists($sms) {
-               $user = common_current_user();
-               $other = User::staticGet('sms', $sms);
-               if (!$other) {
-                       return false;
-               } else {
-                       return $other->id != $user->id;
-               }
-       }
-
-       function carrier_select() {
-               $carrier = new Sms_carrier();
-               $cnt = $carrier->find();
-
-               common_element_start('p');
-               common_element('label', array('for' => 'carrier'));
-               common_element_start('select', array('name' => 'carrier',
-                                                                                        'id' => 'carrier'));
-               common_element('option', array('value' => 0),
-                                          _('Select a carrier'));
-               while ($carrier->fetch()) {
-                       common_element('option', array('value' => $carrier->id),
-                                                  $carrier->name);
-               }
-               common_element_end('select');
-               common_element_end('p');
-               common_element('span', 'input_instructions',
-                                          sprintf(_('Mobile carrier for your phone. '.
-                                                                'If you know a carrier that accepts ' . 
-                                                                'SMS over email but isn\'t listed here, ' .
-                                                                'send email to let us know at %s.'),
-                                                          common_config('site', 'email')));
-       }
-
-       function confirm_code() {
-               
-               $code = $this->trimmed('code');
-               
-               if (!$code) {
-                       $this->show_form(_('No code entered'));
-                       return;
-               }
-               
-               common_redirect(common_local_url('confirmaddress', 
-                                                                                array('code' => $code)));
-       }
+    }
+
+    function remove_address() {
+
+        $user = common_current_user();
+        $sms = $this->arg('sms');
+        $carrier = $this->arg('carrier');
+        
+        # Maybe an old tab open...?
+
+        if ($user->sms != $sms) {
+            $this->show_form(_('That is not your phone number.'));
+            return;
+        }
+
+        $user->query('BEGIN');
+        $original = clone($user);
+        $user->sms = NULL;
+        $user->carrier = NULL;        
+        $user->smsemail = NULL;        
+        $result = $user->updateKeys($original);
+        if (!$result) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t update user.'));
+            return;
+        }
+        $user->query('COMMIT');
+
+        $this->show_form(_('The address was removed.'), TRUE);
+    }
+    
+    function sms_exists($sms) {
+        $user = common_current_user();
+        $other = User::staticGet('sms', $sms);
+        if (!$other) {
+            return false;
+        } else {
+            return $other->id != $user->id;
+        }
+    }
+
+    function carrier_select() {
+        $carrier = new Sms_carrier();
+        $cnt = $carrier->find();
+
+        common_element_start('p');
+        common_element('label', array('for' => 'carrier'));
+        common_element_start('select', array('name' => 'carrier',
+                                             'id' => 'carrier'));
+        common_element('option', array('value' => 0),
+                       _('Select a carrier'));
+        while ($carrier->fetch()) {
+            common_element('option', array('value' => $carrier->id),
+                           $carrier->name);
+        }
+        common_element_end('select');
+        common_element_end('p');
+        common_element('span', 'input_instructions',
+                       sprintf(_('Mobile carrier for your phone. '.
+                                 'If you know a carrier that accepts ' . 
+                                 'SMS over email but isn\'t listed here, ' .
+                                 'send email to let us know at %s.'),
+                               common_config('site', 'email')));
+    }
+
+    function confirm_code() {
+        
+        $code = $this->trimmed('code');
+        
+        if (!$code) {
+            $this->show_form(_('No code entered'));
+            return;
+        }
+        
+        common_redirect(common_local_url('confirmaddress', 
+                                         array('code' => $code)));
+    }
 }
index e7505e3fef44f1c137878c8efa82e6a132720138..1d095ab9a50b9b5dd050b2b0052d9c6fc730d345 100644 (file)
@@ -32,12 +32,12 @@ class SubeditAction extends Action {
             return false;
         }
 
-               $token = $this->trimmed('token');
+        $token = $this->trimmed('token');
 
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
         $id = $this->trimmed('profile');
 
index 64abda00431c0d9fbcf3a060f17510ade1a44849..c94c4d7eb755ed9e9aaccd9651aa6b1af852c038 100644 (file)
@@ -21,58 +21,58 @@ if (!defined('LACONICA')) { exit(1); }
 
 class SubscribeAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
+    function handle($args) {
+        parent::handle($args);
 
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-                       return;
-               }
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+            return;
+        }
 
-               $user = common_current_user();
+        $user = common_current_user();
 
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname)));
-                       return;
-               }
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname)));
+            return;
+        }
 
-               # CSRF protection
+        # CSRF protection
 
-               $token = $this->trimmed('token');
+        $token = $this->trimmed('token');
 
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
-               $other_id = $this->arg('subscribeto');
+        $other_id = $this->arg('subscribeto');
 
         $other = User::staticGet('id', $other_id);
 
         if (!$other) {
-                       $this->client_error(_('Not a local user.'));
-                       return;
+            $this->client_error(_('Not a local user.'));
+            return;
         }
 
-               $result = subs_subscribe_to($user, $other);
+        $result = subs_subscribe_to($user, $other);
 
-               if($result != true) {
-                       common_user_error($result);
-                       return;
-               }
+        if($result != true) {
+            common_user_error($result);
+            return;
+        }
 
-               if ($this->boolean('ajax')) {
-                       common_start_html('text/xml;charset=utf-8', true);
-                       common_element_start('head');
-                       common_element('title', null, _('Subscribed'));
-                       common_element_end('head');
-                       common_element_start('body');
-                       common_unsubscribe_form($other->getProfile());
-                       common_element_end('body');
-                       common_element_end('html');
-               } else {
-                   common_redirect(common_local_url('subscriptions', array('nickname' =>
-                                                                                                                               $user->nickname)));
+        if ($this->boolean('ajax')) {
+            common_start_html('text/xml;charset=utf-8', true);
+            common_element_start('head');
+            common_element('title', null, _('Subscribed'));
+            common_element_end('head');
+            common_element_start('body');
+            common_unsubscribe_form($other->getProfile());
+            common_element_end('body');
+            common_element_end('html');
+        } else {
+            common_redirect(common_local_url('subscriptions', array('nickname' =>
+                                                                $user->nickname)));
         }
-       }
+    }
 }
index ae52526e199115ac2d5aae511fe459fdc302be80..b9ca92af39915001bb792aaa4514d5fd90d31be7 100644 (file)
@@ -23,30 +23,30 @@ require_once(INSTALLDIR.'/lib/gallery.php');
 
 class SubscribersAction extends GalleryAction {
 
-       function gallery_type() {
-               return _('Subscribers');
-       }
-
-       function get_instructions(&$profile) {
-               $user =& common_current_user();
-               if ($user && ($user->id == $profile->id)) {
-                       return _('These are the people who listen to your notices.');
-               } else {
-                       return sprintf(_('These are the people who listen to %s\'s notices.'), $profile->nickname);
-               }
-       }
-
-       function fields() {
-               return array('subscriber', 'subscribed');
-       }
-
-       function div_class() {
-               return 'subscribers';
-       }
-
-       function get_other(&$subs) {
-               return $subs->subscriber;
-       }
+    function gallery_type() {
+        return _('Subscribers');
+    }
+
+    function get_instructions(&$profile) {
+        $user =& common_current_user();
+        if ($user && ($user->id == $profile->id)) {
+            return _('These are the people who listen to your notices.');
+        } else {
+            return sprintf(_('These are the people who listen to %s\'s notices.'), $profile->nickname);
+        }
+    }
+
+    function fields() {
+        return array('subscriber', 'subscribed');
+    }
+
+    function div_class() {
+        return 'subscribers';
+    }
+
+    function get_other(&$subs) {
+        return $subs->subscriber;
+    }
 
     function profile_list_class() {
         return 'SubscribersList';
index f518a1f92deac061e950a6b4730c11356067bc3f..c24f23a0781af44706ebd6ff6f3fc6aec5fc6e93 100644 (file)
@@ -23,30 +23,30 @@ require_once(INSTALLDIR.'/lib/gallery.php');
 
 class SubscriptionsAction extends GalleryAction {
 
-       function gallery_type() {
-               return _('Subscriptions');
-       }
+    function gallery_type() {
+        return _('Subscriptions');
+    }
 
-       function get_instructions(&$profile) {
-               $user =& common_current_user();
-               if ($user && ($user->id == $profile->id)) {
-                       return _('These are the people whose notices you listen to.');
-               } else {
-                       return sprintf(_('These are the people whose notices %s listens to.'), $profile->nickname);
-               }
-       }
+    function get_instructions(&$profile) {
+        $user =& common_current_user();
+        if ($user && ($user->id == $profile->id)) {
+            return _('These are the people whose notices you listen to.');
+        } else {
+            return sprintf(_('These are the people whose notices %s listens to.'), $profile->nickname);
+        }
+    }
 
-       function fields() {
-               return array('subscribed', 'subscriber');
-       }
+    function fields() {
+        return array('subscribed', 'subscriber');
+    }
 
-       function div_class() {
-               return 'subscriptions';
-       }
+    function div_class() {
+        return 'subscriptions';
+    }
 
-       function get_other(&$subs) {
-               return $subs->subscribed;
-       }
+    function get_other(&$subs) {
+        return $subs->subscribed;
+    }
 
     function profile_list_class() {
         return 'SubscriptionsList';
@@ -57,8 +57,8 @@ class SubscriptionsList extends ProfileList {
 
     function show_owner_controls($profile) {
 
-               $sub = Subscription::pkeyGet(array('subscriber' => $this->owner->id,
-                                                                                  'subscribed' => $profile->id));
+        $sub = Subscription::pkeyGet(array('subscriber' => $this->owner->id,
+                                           'subscribed' => $profile->id));
         if (!$sub) {
             return;
         }
index 887017b2a44b222ad6ac47f78a79d761027f87ec..3c9cbea2cb6cc73a500112b986f2811c941829c2 100644 (file)
 if (!defined('LACONICA')) { exit(1); }
 
 class SupAction extends Action {
-       
-       function handle($args) {
-               
-               parent::handle($args);
-               
-               $seconds = $this->trimmed('seconds');
-               
-               if (!$seconds) {
-                       $seconds = 15;
-               }
+    
+    function handle($args) {
+        
+        parent::handle($args);
+        
+        $seconds = $this->trimmed('seconds');
+        
+        if (!$seconds) {
+            $seconds = 15;
+        }
 
-               $updates = $this->get_updates($seconds);
-               
-               header('Content-Type: application/json; charset=utf-8');
-               
-               print json_encode(array('updated_time' => date('c'),
-                                                               'since_time' => date('c', time() - $seconds),
-                                                               'available_periods' => $this->available_periods(),
-                                                               'period' => $seconds,
-                                                               'updates' => $updates));
-       }
-       
-       function available_periods() {
-               static $periods = array(86400, 43200, 21600, 7200,
-                                                               3600, 1800,     600, 300, 120,
-                                                               60, 30, 15); 
-               $available = array();
-               foreach ($periods as $period) {
-                       $available[$period] = common_local_url('sup',
-                                                                                                  array('seconds' => $period));
-               }
-               
-               return $available;
-       }
-       
-       function get_updates($seconds) {
-               $notice = new Notice();
+        $updates = $this->get_updates($seconds);
+        
+        header('Content-Type: application/json; charset=utf-8');
+        
+        print json_encode(array('updated_time' => date('c'),
+                                'since_time' => date('c', time() - $seconds),
+                                'available_periods' => $this->available_periods(),
+                                'period' => $seconds,
+                                'updates' => $updates));
+    }
+    
+    function available_periods() {
+        static $periods = array(86400, 43200, 21600, 7200,
+                                3600, 1800,    600, 300, 120,
+                                60, 30, 15); 
+        $available = array();
+        foreach ($periods as $period) {
+            $available[$period] = common_local_url('sup',
+                                                   array('seconds' => $period));
+        }
+        
+        return $available;
+    }
+    
+    function get_updates($seconds) {
+        $notice = new Notice();
 
-               # XXX: cache this. Depends on how big this protocol becomes;
-               # Re-doing this query every 15 seconds isn't the end of the world.
+        # XXX: cache this. Depends on how big this protocol becomes;
+        # Re-doing this query every 15 seconds isn't the end of the world.
 
-               $notice->query('SELECT profile_id, max(id) AS max_id ' .
-                                          'FROM notice ' .
-                                          'WHERE created > (now() - ' . $seconds . ') ' .
-                                          'GROUP BY profile_id');
-               
-               $updates = array();
-               
-               while ($notice->fetch()) {
-                       $updates[] = array($notice->profile_id, $notice->max_id);
-               }
-               
-               return $updates;
-       }
-       
-       function is_readonly() {
-               return true;
-       }
+        $notice->query('SELECT profile_id, max(id) AS max_id ' .
+                       'FROM notice ' .
+                       'WHERE created > (now() - ' . $seconds . ') ' .
+                       'GROUP BY profile_id');
+        
+        $updates = array();
+        
+        while ($notice->fetch()) {
+            $updates[] = array($notice->profile_id, $notice->max_id);
+        }
+        
+        return $updates;
+    }
+    
+    function is_readonly() {
+        return true;
+    }
 }
index 25cc853c458c099b40fc5c6e29b279a8fbe3cb18..1325b85a58995c2f96b718f55bff4984cadb56e3 100644 (file)
@@ -24,142 +24,142 @@ define('TAGS_PER_PAGE', 100);
 
 class TagAction extends StreamAction {
 
-       function handle($args) {
-
-               parent::handle($args);
-
-               # Looks like we're good; show the header
-
-               if (isset($args['tag']) && $args['tag']) {
-                       $tag = $args['tag'];
-                       common_show_header(sprintf(_("Notices tagged with %s"), $tag),
-                                                          array($this, 'show_header'), $tag,
-                                                          array($this, 'show_top'));
-                       $this->show_notices($tag);
-               } else {
-                       common_show_header(_("Tags"),
-                                                          array($this, 'show_header'), '',
-                                                          array($this, 'show_top'));
-                       $this->show_tags();
-               }
-
-               common_show_footer();
-       }
-
-       function show_header($tag = false) {
-               if ($tag) {
-                       common_element('link', array('rel' => 'alternate',
-                                                                                'href' => common_local_url('tagrss', array('tag' => $tag)),
-                                                                                'type' => 'application/rss+xml',
-                                                                                'title' => sprintf(_('Feed for tag %s'), $tag)));
-               }
-       }
-
-       function get_instructions() {
-               return _('Showing most popular tags from the last week');
-       }
-
-       function show_top($tag = false) {
-               if (!$tag) {
-                       $instr = $this->get_instructions();
-                       $output = common_markup_to_html($instr);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-                       $this->public_views_menu();
-               }
-               else {
-                       $this->show_feeds_list(array(0=>array('href'=>common_local_url('tagrss'),
-                                                                                                 'type' => 'rss',
-                                                                                                 'version' => 'RSS 1.0',
-                                                                                                 'item' => 'tagrss')));
-               }
-       }
-
-       function show_tags()
-       {
-               # This should probably be cached rather than recalculated
-               $tags = DB_DataObject::factory('Notice_tag');
-
-               #Need to clear the selection and then only re-add the field
-               #we are grouping by, otherwise it's not a valid 'group by'
-               #even though MySQL seems to let it slide...
-               $tags->selectAdd();
-               $tags->selectAdd('tag');
-
-               #Add the aggregated columns...
-               $tags->selectAdd('max(notice_id) as last_notice_id');
-               if(common_config('db','type')=='pgsql') {
-                       $calc='sum(exp(-extract(epoch from (now()-created))/%s)) as weight';
-               } else {
-                       $calc='sum(exp(-(now() - created)/%s)) as weight';
-               }
-               $tags->selectAdd(sprintf($calc, common_config('tag', 'dropoff')));
-               $tags->groupBy('tag');
-               $tags->orderBy('weight DESC');
-
-               # $tags->whereAdd('created > "' . strftime('%Y-%m-%d %H:%M:%S', strtotime('-1 MONTH')) . '"');
-
-               $tags->limit(TAGS_PER_PAGE);
-
-               $cnt = $tags->find();
-
-               if ($cnt > 0) {
-                       common_element_start('p', 'tagcloud');
-
-                       $tw = array();
-                       $sum = 0;
-                       while ($tags->fetch()) {
-                               $tw[$tags->tag] = $tags->weight;
-                               $sum += $tags->weight;
-                       }
-
-                       ksort($tw);
-
-                       foreach ($tw as $tag => $weight) {
-                               $this->show_tag($tag, $weight, $weight/$sum);
-                       }
-
-                       common_element_end('p');
-               }
-       }
-
-       function show_tag($tag, $weight, $relative) {
-
-               # XXX: these should probably tune to the size of the site
-               if ($relative > 0.1) {
-                       $cls =  'largest';
-               } else if ($relative > 0.05) {
-                       $cls = 'verylarge';
-               } else if ($relative > 0.02) {
-                       $cls = 'large';
-               } else if ($relative > 0.01) {
-                       $cls = 'medium';
-               } else if ($relative > 0.005) {
-                       $cls = 'small';
-               } else if ($relative > 0.002) {
-                       $cls = 'verysmall';
-               } else {
-                       $cls = 'smallest';
-               }
-
-               common_element('a', array('class' => "$cls weight-$weight relative-$relative",
-                                                                 'href' => common_local_url('tag', array('tag' => $tag))),
-                                          $tag);
-               common_text(' ');
-       }
-
-       function show_notices($tag) {
-
-               $cnt = 0;
-
-               $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
-
-               $notice = Notice_tag::getStream($tag, (($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
+    function handle($args) {
+
+        parent::handle($args);
+
+        # Looks like we're good; show the header
+
+        if (isset($args['tag']) && $args['tag']) {
+            $tag = $args['tag'];
+            common_show_header(sprintf(_("Notices tagged with %s"), $tag),
+                               array($this, 'show_header'), $tag,
+                               array($this, 'show_top'));
+            $this->show_notices($tag);
+        } else {
+            common_show_header(_("Tags"),
+                               array($this, 'show_header'), '',
+                               array($this, 'show_top'));
+            $this->show_tags();
+        }
+
+        common_show_footer();
+    }
+
+    function show_header($tag = false) {
+        if ($tag) {
+            common_element('link', array('rel' => 'alternate',
+                                         'href' => common_local_url('tagrss', array('tag' => $tag)),
+                                         'type' => 'application/rss+xml',
+                                         'title' => sprintf(_('Feed for tag %s'), $tag)));
+        }
+    }
+
+    function get_instructions() {
+        return _('Showing most popular tags from the last week');
+    }
+
+    function show_top($tag = false) {
+        if (!$tag) {
+            $instr = $this->get_instructions();
+            $output = common_markup_to_html($instr);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('div');
+            $this->public_views_menu();
+        }
+        else {
+            $this->show_feeds_list(array(0=>array('href'=>common_local_url('tagrss'),
+                                                  'type' => 'rss',
+                                                  'version' => 'RSS 1.0',
+                                                  'item' => 'tagrss')));
+        }
+    }
+
+    function show_tags()
+    {
+        # This should probably be cached rather than recalculated
+        $tags = DB_DataObject::factory('Notice_tag');
+
+        #Need to clear the selection and then only re-add the field
+        #we are grouping by, otherwise it's not a valid 'group by'
+        #even though MySQL seems to let it slide...
+        $tags->selectAdd();
+        $tags->selectAdd('tag');
+
+        #Add the aggregated columns...
+        $tags->selectAdd('max(notice_id) as last_notice_id');
+        if(common_config('db','type')=='pgsql') {
+            $calc='sum(exp(-extract(epoch from (now()-created))/%s)) as weight';
+        } else {
+            $calc='sum(exp(-(now() - created)/%s)) as weight';
+        }
+        $tags->selectAdd(sprintf($calc, common_config('tag', 'dropoff')));
+        $tags->groupBy('tag');
+        $tags->orderBy('weight DESC');
+
+        # $tags->whereAdd('created > "' . strftime('%Y-%m-%d %H:%M:%S', strtotime('-1 MONTH')) . '"');
+
+        $tags->limit(TAGS_PER_PAGE);
+
+        $cnt = $tags->find();
+
+        if ($cnt > 0) {
+            common_element_start('p', 'tagcloud');
+
+            $tw = array();
+            $sum = 0;
+            while ($tags->fetch()) {
+                $tw[$tags->tag] = $tags->weight;
+                $sum += $tags->weight;
+            }
+
+            ksort($tw);
+
+            foreach ($tw as $tag => $weight) {
+                $this->show_tag($tag, $weight, $weight/$sum);
+            }
+
+            common_element_end('p');
+        }
+    }
+
+    function show_tag($tag, $weight, $relative) {
+
+        # XXX: these should probably tune to the size of the site
+        if ($relative > 0.1) {
+            $cls =  'largest';
+        } else if ($relative > 0.05) {
+            $cls = 'verylarge';
+        } else if ($relative > 0.02) {
+            $cls = 'large';
+        } else if ($relative > 0.01) {
+            $cls = 'medium';
+        } else if ($relative > 0.005) {
+            $cls = 'small';
+        } else if ($relative > 0.002) {
+            $cls = 'verysmall';
+        } else {
+            $cls = 'smallest';
+        }
+
+        common_element('a', array('class' => "$cls weight-$weight relative-$relative",
+                                  'href' => common_local_url('tag', array('tag' => $tag))),
+                       $tag);
+        common_text(' ');
+    }
+
+    function show_notices($tag) {
+
+        $cnt = 0;
+
+        $page = ($this->arg('page')) ? ($this->arg('page')+0) : 1;
+
+        $notice = Notice_tag::getStream($tag, (($page-1)*NOTICES_PER_PAGE), NOTICES_PER_PAGE + 1);
 
         $cnt = $this->show_notice_list($notice);
 
-               common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
-                                                 $page, 'tag', array('tag' => $tag));
-       }
+        common_pagination($page > 1, $cnt > NOTICES_PER_PAGE,
+                          $page, 'tag', array('tag' => $tag));
+    }
 }
index a4449dd690aa9ecfde08a1ef196156bc420c2b22..832671ae75bf11c512ffbf49f7b5454d0becfa1d 100644 (file)
@@ -23,171 +23,171 @@ require_once(INSTALLDIR.'/lib/settingsaction.php');
 
 class TagotherAction extends Action {
 
-       function handle($args) {
-
-               parent::handle($args);
-
-               if (!common_logged_in()) {
-                       $this->client_error(_('Not logged in'), 403);
-                       return;
-               }
-
-               if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       $this->save_tags();
-               } else {
-                       $id = $this->trimmed('id');
-                       if (!$id) {
-                               $this->client_error(_('No id argument.'));
-                               return;
-                       }
-                       $profile = Profile::staticGet('id', $id);
-                       if (!$profile) {
-                               $this->client_error(_('No profile with that ID.'));
-                               return;
-                       }
-                       $this->show_form($profile);
-               }
-       }
-
-       function show_form($profile, $error=NULL) {
-
-               $user = common_current_user();
-
-               common_show_header(_('Tag a person'),
-                                                  NULL, array($profile, $error), array($this, 'show_top'));
-
-               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-
-               common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
-                                                                       'class' => 'avatar stream',
-                                                                       'width' => AVATAR_PROFILE_SIZE,
-                                                                       'height' => AVATAR_PROFILE_SIZE,
-                                                                       'alt' =>
-                                                                       ($profile->fullname) ? $profile->fullname :
-                                                                       $profile->nickname));
-
-               common_element('a', array('href' => $profile->profileurl,
-                                                                 'class' => 'external profile nickname'),
-                                          $profile->nickname);
-
-               if ($profile->fullname) {
-                       common_element_start('div', 'fullname');
-                       if ($profile->homepage) {
-                               common_element('a', array('href' => $profile->homepage),
-                                                          $profile->fullname);
-                       } else {
-                               common_text($profile->fullname);
-                       }
-                       common_element_end('div');
-               }
-               if ($profile->location) {
-                       common_element('div', 'location', $profile->location);
-               }
-               if ($profile->bio) {
-                       common_element('div', 'bio', $profile->bio);
-               }
-
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'tag_user',
-                                                                                  'name' => 'tagother',
-                                                                                  'action' => $this->self_url()));
-               common_hidden('token', common_session_token());
-               common_hidden('id', $profile->id);
-               common_input('tags', _('Tags'),
-                                        ($this->arg('tags')) ? $this->arg('tags') : implode(' ', Profile_tag::getTags($user->id, $profile->id)),
-                                        _('Tags for this user (letters, numbers, -, ., and _), comma- or space- separated'));
-
-               common_submit('save', _('Save'));
-               common_element_end('form');
-               common_show_footer();
-
-       }
-
-       function save_tags() {
-
-               $id = $this->trimmed('id');
-               $tagstring = $this->trimmed('tags');
-               $token = $this->trimmed('token');
-
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               $profile = Profile::staticGet('id', $id);
-
-               if (!$profile) {
-                       $this->client_error(_('No such profile.'));
-                       return;
-               }
-
-               if (is_string($tagstring) && strlen($tagstring) > 0) {
-
-                       $tags = array_map('common_canonical_tag',
-                                                         preg_split('/[\s,]+/', $tagstring));
-
-                       foreach ($tags as $tag) {
-                               if (!common_valid_profile_tag($tag)) {
-                                       $this->show_form($profile, sprintf(_('Invalid tag: "%s"'), $tag));
-                                       return;
-                               }
-                       }
-               } else {
-                       $tags = array();
-               }
-
-               $user = common_current_user();
-
-               if (!Subscription::pkeyGet(array('subscriber' => $user->id,
-                                                                                'subscribed' => $profile->id)) &&
-                       !Subscription::pkeyGet(array('subscriber' => $profile->id,
-                                                                                'subscribed' => $user->id)))
-               {
-                       $this->client_error(_('You can only tag people you are subscribed to or who are subscribed to you.'));
-                       return;
-               }
-
-               $result = Profile_tag::setTags($user->id, $profile->id, $tags);
-
-               if (!$result) {
-                       $this->client_error(_('Could not save tags.'));
-                       return;
-               }
-
-               $action = $user->isSubscribed($profile) ? 'subscriptions' : 'subscribers';
-
-               if ($this->boolean('ajax')) {
-                       common_start_html('text/xml');
-                       common_element_start('head');
-                       common_element('title', null, _('Tags'));
-                       common_element_end('head');
-                       common_element_start('body');
-                       common_element_start('p', 'subtags');
-                       foreach ($tags as $tag) {
-                               common_element('a', array('href' => common_local_url($action,
-                                                                                                                                        array('nickname' => $user->nickname,
-                                                                                                                                                  'tag' => $tag))),
-                                                          $tag);
-                       }
-                       common_element_end('p');
-                       common_element_end('body');
-                       common_element_end('html');
-               } else {
-                       common_redirect(common_local_url($action, array('nickname' =>
-                                                                                                                       $user->nickname)));
+    function handle($args) {
+
+        parent::handle($args);
+
+        if (!common_logged_in()) {
+            $this->client_error(_('Not logged in'), 403);
+            return;
+        }
+
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            $this->save_tags();
+        } else {
+            $id = $this->trimmed('id');
+            if (!$id) {
+                $this->client_error(_('No id argument.'));
+                return;
+            }
+            $profile = Profile::staticGet('id', $id);
+            if (!$profile) {
+                $this->client_error(_('No profile with that ID.'));
+                return;
+            }
+            $this->show_form($profile);
+        }
+    }
+
+    function show_form($profile, $error=NULL) {
+
+        $user = common_current_user();
+
+        common_show_header(_('Tag a person'),
+                           NULL, array($profile, $error), array($this, 'show_top'));
+
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+
+        common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_PROFILE_SIZE),
+                                    'class' => 'avatar stream',
+                                    'width' => AVATAR_PROFILE_SIZE,
+                                    'height' => AVATAR_PROFILE_SIZE,
+                                    'alt' =>
+                                    ($profile->fullname) ? $profile->fullname :
+                                    $profile->nickname));
+
+        common_element('a', array('href' => $profile->profileurl,
+                                  'class' => 'external profile nickname'),
+                       $profile->nickname);
+
+        if ($profile->fullname) {
+            common_element_start('div', 'fullname');
+            if ($profile->homepage) {
+                common_element('a', array('href' => $profile->homepage),
+                               $profile->fullname);
+            } else {
+                common_text($profile->fullname);
+            }
+            common_element_end('div');
+        }
+        if ($profile->location) {
+            common_element('div', 'location', $profile->location);
+        }
+        if ($profile->bio) {
+            common_element('div', 'bio', $profile->bio);
+        }
+
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'tag_user',
+                                           'name' => 'tagother',
+                                           'action' => $this->self_url()));
+        common_hidden('token', common_session_token());
+        common_hidden('id', $profile->id);
+        common_input('tags', _('Tags'),
+                     ($this->arg('tags')) ? $this->arg('tags') : implode(' ', Profile_tag::getTags($user->id, $profile->id)),
+                     _('Tags for this user (letters, numbers, -, ., and _), comma- or space- separated'));
+
+        common_submit('save', _('Save'));
+        common_element_end('form');
+        common_show_footer();
+
+    }
+
+    function save_tags() {
+
+        $id = $this->trimmed('id');
+        $tagstring = $this->trimmed('tags');
+        $token = $this->trimmed('token');
+
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        $profile = Profile::staticGet('id', $id);
+
+        if (!$profile) {
+            $this->client_error(_('No such profile.'));
+            return;
+        }
+
+        if (is_string($tagstring) && strlen($tagstring) > 0) {
+
+            $tags = array_map('common_canonical_tag',
+                              preg_split('/[\s,]+/', $tagstring));
+
+            foreach ($tags as $tag) {
+                if (!common_valid_profile_tag($tag)) {
+                    $this->show_form($profile, sprintf(_('Invalid tag: "%s"'), $tag));
+                    return;
+                }
+            }
+        } else {
+            $tags = array();
+        }
+
+        $user = common_current_user();
+
+        if (!Subscription::pkeyGet(array('subscriber' => $user->id,
+                                         'subscribed' => $profile->id)) &&
+            !Subscription::pkeyGet(array('subscriber' => $profile->id,
+                                         'subscribed' => $user->id)))
+        {
+            $this->client_error(_('You can only tag people you are subscribed to or who are subscribed to you.'));
+            return;
+        }
+
+        $result = Profile_tag::setTags($user->id, $profile->id, $tags);
+
+        if (!$result) {
+            $this->client_error(_('Could not save tags.'));
+            return;
+        }
+
+        $action = $user->isSubscribed($profile) ? 'subscriptions' : 'subscribers';
+
+        if ($this->boolean('ajax')) {
+            common_start_html('text/xml');
+            common_element_start('head');
+            common_element('title', null, _('Tags'));
+            common_element_end('head');
+            common_element_start('body');
+            common_element_start('p', 'subtags');
+            foreach ($tags as $tag) {
+                common_element('a', array('href' => common_local_url($action,
+                                                                     array('nickname' => $user->nickname,
+                                                                           'tag' => $tag))),
+                               $tag);
+            }
+            common_element_end('p');
+            common_element_end('body');
+            common_element_end('html');
+        } else {
+            common_redirect(common_local_url($action, array('nickname' =>
+                                                            $user->nickname)));
+        }
+    }
+
+    function show_top($arr = NULL) {
+        list($profile, $error) = $arr;
+        if ($error) {
+            common_element('p', 'error', $error);
+        } else {
+            common_element_start('div', 'instructions');
+            common_element('p', NULL,
+                           _('Use this form to add tags to your subscribers or subscriptions.'));
+            common_element_end('div');
         }
-       }
-
-       function show_top($arr = NULL) {
-               list($profile, $error) = $arr;
-               if ($error) {
-                       common_element('p', 'error', $error);
-               } else {
-                       common_element_start('div', 'instructions');
-                       common_element('p', NULL,
-                                                  _('Use this form to add tags to your subscribers or subscriptions.'));
-                       common_element_end('div');
-               }
-       }
+    }
 }
 
index 9187bdc873e1f53a21e111192839c3de6d7aee43..45639fec4826a47d745703d544483a2ad29ce91a 100644 (file)
@@ -25,41 +25,41 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class TagrssAction extends Rss10Action {
 
-       function init() {
-               $tag = $this->trimmed('tag');
-               $this->tag = Notice_tag::staticGet('tag', $tag);
+    function init() {
+        $tag = $this->trimmed('tag');
+        $this->tag = Notice_tag::staticGet('tag', $tag);
 
-               if (!$this->tag) {
-                       common_user_error(_('No such tag.'));
-                       return false;
-               } else {
-                       return true;
-               }
-       }
+        if (!$this->tag) {
+            common_user_error(_('No such tag.'));
+            return false;
+        } else {
+            return true;
+        }
+    }
 
-       function get_notices($limit=0) {
-               $tag = $this->tag;
+    function get_notices($limit=0) {
+        $tag = $this->tag;
 
-               if (is_null($tag)) {
-                       return NULL;
-               }
+        if (is_null($tag)) {
+            return NULL;
+        }
 
-               $notice = Notice_tag::getStream($tag->tag, 0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
+        $notice = Notice_tag::getStream($tag->tag, 0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
 
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
 
-               return $notices;
-       }
+        return $notices;
+    }
 
-       function get_channel() {
-               $tag = $this->tag->tag;
+    function get_channel() {
+        $tag = $this->tag->tag;
 
-               $c = array('url' => common_local_url('tagrss', array('tag' => $tagname)),
-                          'title' => $tagname,
-                          'link' => common_local_url('tagrss', array('tag' => $tagname)),
-                          'description' => sprintf(_('Microblog tagged with %s'), $tagname));
-               return $c;
-       }
+        $c = array('url' => common_local_url('tagrss', array('tag' => $tagname)),
+               'title' => $tagname,
+               'link' => common_local_url('tagrss', array('tag' => $tagname)),
+               'description' => sprintf(_('Microblog tagged with %s'), $tagname));
+        return $c;
+    }
 }
index f6e955828e306b60425d44c9b5fa6867fb98d949..b1caa34814d81ba5f03f2699c9b364fb7e410554 100644 (file)
@@ -23,74 +23,74 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class TwitapiaccountAction extends TwitterapiAction {
 
-       function verify_credentials($args, $apidata) {
-               parent::handle($args);
+    function verify_credentials($args, $apidata) {
+        parent::handle($args);
 
-               if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-                       common_user_error(_('API method not found!'), $code = 404);
-                       return;
-               }
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            common_user_error(_('API method not found!'), $code = 404);
+            return;
+        }
 
-               $this->show_extended_profile($apidata['user'], $apidata);
-       }
+        $this->show_extended_profile($apidata['user'], $apidata);
+    }
 
-       function end_session($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
+    function end_session($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
 
-       function update_location($args, $apidata) {
-               parent::handle($args);
+    function update_location($args, $apidata) {
+        parent::handle($args);
 
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
-                       return;
-               }
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
+            return;
+        }
 
-               $location = trim($this->arg('location'));
+        $location = trim($this->arg('location'));
 
-               if (!is_null($location) && strlen($location) > 255) {
+        if (!is_null($location) && strlen($location) > 255) {
 
-                       // XXX: But Twitter just truncates and runs with it. -- Zach
-                       $this->client_error(_('That\'s too long. Max notice size is 255 chars.'), 406, $apidate['content-type']);
-                       return;
-               }
+            // XXX: But Twitter just truncates and runs with it. -- Zach
+            $this->client_error(_('That\'s too long. Max notice size is 255 chars.'), 406, $apidate['content-type']);
+            return;
+        }
 
-               $user = $apidata['user'];
-               $profile = $user->getProfile();
+        $user = $apidata['user'];
+        $profile = $user->getProfile();
 
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
 
-               $orig_profile = clone($profile);
-               $profile->location = $location;
+        $orig_profile = clone($profile);
+        $profile->location = $location;
 
-               $result = $profile->update($orig_profile);
+        $result = $profile->update($orig_profile);
 
-               if (!$result) {
-                       common_log_db_error($profile, 'UPDATE', __FILE__);
-                       common_server_error(_('Couldn\'t save profile.'));
-                       return;
-               }
+        if (!$result) {
+            common_log_db_error($profile, 'UPDATE', __FILE__);
+            common_server_error(_('Couldn\'t save profile.'));
+            return;
+        }
 
-               common_broadcast_profile($profile);
-               $type = $apidata['content-type'];
+        common_broadcast_profile($profile);
+        $type = $apidata['content-type'];
 
-               $this->init_document($type);
-               $this->show_profile($profile, $type);
-               $this->end_document($type);
-       }
+        $this->init_document($type);
+        $this->show_profile($profile, $type);
+        $this->end_document($type);
+    }
 
 
-       function update_delivery_device($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
+    function update_delivery_device($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
 
-       function rate_limit_status($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
+    function rate_limit_status($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
 }
\ No newline at end of file
index 4852ff9388c90f3bfb399cf7a5709e4a48b3f6d1..16b2e76bc26759e52cb4dd5937b3c11781840d1a 100644 (file)
@@ -23,15 +23,15 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class TwitapiblocksAction extends TwitterapiAction {
 
-       function create($args, $apidata) {
+    function create($args, $apidata) {
 
-               parent::handle($args);
+        parent::handle($args);
 
-               $blockee = $this->get_user($apidata['api_arg'], $apidata);
+        $blockee = $this->get_user($apidata['api_arg'], $apidata);
 
         if (!$blockee) {
-                       $this->client_error('Not Found', 404, $apidata['content-type']);
-                       return;
+            $this->client_error('Not Found', 404, $apidata['content-type']);
+            return;
         }
 
         $user = $apidata['user'];
@@ -42,17 +42,17 @@ class TwitapiblocksAction extends TwitterapiAction {
             $this->show_profile($blockee, $type);
             $this->end_document($type);
         } else {
-                       common_server_error(_('Block user failed.'));
+            common_server_error(_('Block user failed.'));
         }
-       }
+    }
 
-       function destroy($args, $apidata) {
-               parent::handle($args);
-               $blockee = $this->get_user($apidata['api_arg'], $apidata);
+    function destroy($args, $apidata) {
+        parent::handle($args);
+        $blockee = $this->get_user($apidata['api_arg'], $apidata);
 
         if (!$blockee) {
-                       $this->client_error('Not Found', 404, $apidata['content-type']);
-                       return;
+            $this->client_error('Not Found', 404, $apidata['content-type']);
+            return;
         }
 
         $user = $apidata['user'];
@@ -63,7 +63,7 @@ class TwitapiblocksAction extends TwitterapiAction {
             $this->show_profile($blockee, $type);
             $this->end_document($type);
         } else {
-                       common_server_error(_('Unblock user failed.'));
+            common_server_error(_('Unblock user failed.'));
         }
-       }
+    }
 }
\ No newline at end of file
index 535795ca4321d6351edca4dbe6d2d2e3ced8ef2b..2e3b50173575a30bf9955fc9f61a6a5aaa2be343 100644 (file)
@@ -23,265 +23,265 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class Twitapidirect_messagesAction extends TwitterapiAction {
 
-       function direct_messages($args, $apidata) {
-               parent::handle($args);
-               return $this->show_messages($args, $apidata, 'received');
-       }
-
-       function sent($args, $apidata) {
-               parent::handle($args);
-               return $this->show_messages($args, $apidata, 'sent');
-       }
-
-       function show_messages($args, $apidata, $type) {
-
-               $user = $apidata['user'];
-
-               $count = $this->arg('count');
-               $since = $this->arg('since');
-               $since_id = $this->arg('since_id');
-               $before_id = $this->arg('before_id');
-
-               $page = $this->arg('page');
-
-               if (!$page) {
-                       $page = 1;
-               }
-
-               if (!$count) {
-                       $count = 20;
-               }
-
-               $message = new Message();
-
-               $title = null;
-               $subtitle = null;
-               $link = null;
-               $server = common_root_url();
-
-               if ($type == 'received') {
-                       $message->to_profile = $user->id;
-                       $title = sprintf(_("Direct messages to %s"), $user->nickname);
-                       $subtitle = sprintf(_("All the direct messages sent to %s"), $user->nickname);
-                       $link = $server . $user->nickname . '/inbox';
-               } else {
-                       $message->from_profile = $user->id;
-                       $title = _('Direct Messages You\'ve Sent');
-                       $subtitle = sprintf(_("All the direct messages sent from %s"), $user->nickname);
-                       $link = $server . $user->nickname . '/outbox';
-               }
-
-               if ($before_id) {
-                       $message->whereAdd("id < $before_id");
-               }
-
-               if ($since_id) {
-                       $message->whereAdd("id > $since_id");
-               }
-
-               $since = strtotime($this->arg('since'));
-
-               if ($since) {
-                       $d = date('Y-m-d H:i:s', $since);
-                       $message->whereAdd("created > '$d'");
-               }
-
-               $message->orderBy('created DESC, id DESC');
-               $message->limit((($page-1)*20), $count);
-               $message->find();
-
-               switch($apidata['content-type']) {
-                case 'xml':
-                       $this->show_xml_dmsgs($message);
-                       break;
-                case 'rss':
-                       $this->show_rss_dmsgs($message, $title, $link, $subtitle);
-                       break;
-                case 'atom':
-                       $this->show_atom_dmsgs($message, $title, $link, $subtitle);
-                       break;
-                case 'json':
-                       $this->show_json_dmsgs($message);
-                       break;
-                default:
-                       common_user_error(_('API method not found!'), $code = 404);
-               }
-
-       }
-
-       // had to change this from "new" to "create" to avoid PHP reserved word
-       function create($args, $apidata) {
-               parent::handle($args);
-
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
-                       return;
-               }
-
-               $user = $apidata['user'];
-               $source = $this->trimmed('source');      // Not supported by Twitter.
+    function direct_messages($args, $apidata) {
+        parent::handle($args);
+        return $this->show_messages($args, $apidata, 'received');
+    }
+
+    function sent($args, $apidata) {
+        parent::handle($args);
+        return $this->show_messages($args, $apidata, 'sent');
+    }
+
+    function show_messages($args, $apidata, $type) {
+
+        $user = $apidata['user'];
+
+        $count = $this->arg('count');
+        $since = $this->arg('since');
+        $since_id = $this->arg('since_id');
+        $before_id = $this->arg('before_id');
+
+        $page = $this->arg('page');
+
+        if (!$page) {
+            $page = 1;
+        }
+
+        if (!$count) {
+            $count = 20;
+        }
+
+        $message = new Message();
+
+        $title = null;
+        $subtitle = null;
+        $link = null;
+        $server = common_root_url();
+
+        if ($type == 'received') {
+            $message->to_profile = $user->id;
+            $title = sprintf(_("Direct messages to %s"), $user->nickname);
+            $subtitle = sprintf(_("All the direct messages sent to %s"), $user->nickname);
+            $link = $server . $user->nickname . '/inbox';
+        } else {
+            $message->from_profile = $user->id;
+            $title = _('Direct Messages You\'ve Sent');
+            $subtitle = sprintf(_("All the direct messages sent from %s"), $user->nickname);
+            $link = $server . $user->nickname . '/outbox';
+        }
+
+        if ($before_id) {
+            $message->whereAdd("id < $before_id");
+        }
+
+        if ($since_id) {
+            $message->whereAdd("id > $since_id");
+        }
+
+        $since = strtotime($this->arg('since'));
+
+        if ($since) {
+            $d = date('Y-m-d H:i:s', $since);
+            $message->whereAdd("created > '$d'");
+        }
+
+        $message->orderBy('created DESC, id DESC');
+        $message->limit((($page-1)*20), $count);
+        $message->find();
+
+        switch($apidata['content-type']) {
+         case 'xml':
+            $this->show_xml_dmsgs($message);
+            break;
+         case 'rss':
+            $this->show_rss_dmsgs($message, $title, $link, $subtitle);
+            break;
+         case 'atom':
+            $this->show_atom_dmsgs($message, $title, $link, $subtitle);
+            break;
+         case 'json':
+            $this->show_json_dmsgs($message);
+            break;
+         default:
+            common_user_error(_('API method not found!'), $code = 404);
+        }
+
+    }
+
+    // had to change this from "new" to "create" to avoid PHP reserved word
+    function create($args, $apidata) {
+        parent::handle($args);
+
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
+            return;
+        }
+
+        $user = $apidata['user'];
+        $source = $this->trimmed('source');     // Not supported by Twitter.
 
         $reserved_sources = array('web', 'omb', 'mail', 'xmpp', 'api');
-               if (!$source || in_array($source, $reserved_sources)) {
-                       $source = 'api';
-               }
-
-               $content = $this->trimmed('text');
-
-               if (!$content) {
-                       $this->client_error(_('No message text!'), $code = 406, $apidata['content-type']);
-               } else {
-                       $content_shortened = common_shorten_links($content);
-                       if (mb_strlen($content_shortened) > 140) {
-                               $this->client_error(_('That\'s too long. Max message size is 140 chars.'),
-                                       $code = 406, $apidata['content-type']);
-                               return;
-                       }
-               }
-
-               $other = $this->get_user($this->trimmed('user'));
-
-               if (!$other) {
-                       $this->client_error(_('Recipient user not found.'), $code = 403, $apidata['content-type']);
-                       return;
-               } else if (!$user->mutuallySubscribed($other)) {
-                       $this->client_error(_('Can\'t send direct messages to users who aren\'t your friend.'),
-                               $code = 403, $apidata['content-type']);
-                       return;
-               } else if ($user->id == $other->id) {
-                       // Sending msgs to yourself is allowed by Twitter
-                       $this->client_error(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'),
-                               $code = 403, $apidata['content-type']);
-                       return;
-               }
-
-               $message = Message::saveNew($user->id, $other->id,
-                       html_entity_decode($content, ENT_NOQUOTES, 'UTF-8'), $source);
-
-               if (is_string($message)) {
-                       $this->server_error($message);
-                       return;
-               }
-
-               $this->notify($user, $other, $message);
-
-               if ($apidata['content-type'] == 'xml') {
-                       $this->show_single_xml_dmsg($message);
-               } elseif ($apidata['content-type'] == 'json') {
-                       $this->show_single_json_dmsg($message);
-               }
-
-       }
-
-       function destroy($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
-
-       function show_xml_dmsgs($message) {
-
-               $this->init_document('xml');
-               common_element_start('direct-messages', array('type' => 'array'));
-
-               if (is_array($messages)) {
-                       foreach ($message as $m) {
-                               $twitter_dm = $this->twitter_dmsg_array($m);
-                               $this->show_twitter_xml_dmsg($twitter_dm);
-                       }
-               } else {
-                       while ($message->fetch()) {
-                               $twitter_dm = $this->twitter_dmsg_array($message);
-                               $this->show_twitter_xml_dmsg($twitter_dm);
-                       }
-               }
-
-               common_element_end('direct-messages');
-               $this->end_document('xml');
-
-       }
-
-       function show_json_dmsgs($message) {
-
-               $this->init_document('json');
-
-               $dmsgs = array();
-
-               if (is_array($message)) {
-                       foreach ($message as $m) {
-                               $twitter_dm = $this->twitter_dmsg_array($m);
-                               array_push($dmsgs, $twitter_dm);
-                       }
-               } else {
-                       while ($message->fetch()) {
-                               $twitter_dm = $this->twitter_dmsg_array($message);
-                               array_push($dmsgs, $twitter_dm);
-                       }
-               }
-
-               $this->show_json_objects($dmsgs);
-               $this->end_document('json');
-
-       }
-
-       function show_rss_dmsgs($message, $title, $link, $subtitle) {
-
-               $this->init_document('rss');
-
-               common_element_start('channel');
-               common_element('title', NULL, $title);
-
-               common_element('link', NULL, $link);
-               common_element('description', NULL, $subtitle);
-               common_element('language', NULL, 'en-us');
-               common_element('ttl', NULL, '40');
-
-               if (is_array($message)) {
-                       foreach ($message as $m) {
-                               $entry = $this->twitter_rss_dmsg_array($m);
-                               $this->show_twitter_rss_item($entry);
-                       }
-               } else {
-                       while ($message->fetch()) {
-                               $entry = $this->twitter_rss_dmsg_array($message);
-                               $this->show_twitter_rss_item($entry);
-                       }
-               }
-
-               common_element_end('channel');
-               $this->end_twitter_rss();
-
-       }
-
-       function show_atom_dmsgs($message, $title, $link, $subtitle) {
-
-               $this->init_document('atom');
-
-               common_element('title', NULL, $title);
-               $siteserver = common_config('site', 'server');
-               common_element('id', NULL, "tag:$siteserver,2008:DirectMessage");
-               common_element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), NULL);
-               common_element('updated', NULL, common_date_iso8601(strftime('%c')));
-               common_element('subtitle', NULL, $subtitle);
-
-               if (is_array($message)) {
-                       foreach ($message as $m) {
-                               $entry = $this->twitter_rss_dmsg_array($m);
-                               $this->show_twitter_atom_entry($entry);
-                       }
-               } else {
-                       while ($message->fetch()) {
-                               $entry = $this->twitter_rss_dmsg_array($message);
-                               $this->show_twitter_atom_entry($entry);
-                       }
-               }
-
-               $this->end_document('atom');
-       }
-
-       // swiped from MessageAction. Should it be place in util.php?
-       function notify($from, $to, $message) {
-               mail_notify_message($message, $from, $to);
-               # XXX: Jabber, SMS notifications... probably queued
-       }
+        if (!$source || in_array($source, $reserved_sources)) {
+            $source = 'api';
+        }
+
+        $content = $this->trimmed('text');
+
+        if (!$content) {
+            $this->client_error(_('No message text!'), $code = 406, $apidata['content-type']);
+        } else {
+            $content_shortened = common_shorten_links($content);
+            if (mb_strlen($content_shortened) > 140) {
+                $this->client_error(_('That\'s too long. Max message size is 140 chars.'),
+                    $code = 406, $apidata['content-type']);
+                return;
+            }
+        }
+
+        $other = $this->get_user($this->trimmed('user'));
+
+        if (!$other) {
+            $this->client_error(_('Recipient user not found.'), $code = 403, $apidata['content-type']);
+            return;
+        } else if (!$user->mutuallySubscribed($other)) {
+            $this->client_error(_('Can\'t send direct messages to users who aren\'t your friend.'),
+                $code = 403, $apidata['content-type']);
+            return;
+        } else if ($user->id == $other->id) {
+            // Sending msgs to yourself is allowed by Twitter
+            $this->client_error(_('Don\'t send a message to yourself; just say it to yourself quietly instead.'),
+                $code = 403, $apidata['content-type']);
+            return;
+        }
+
+        $message = Message::saveNew($user->id, $other->id,
+            html_entity_decode($content, ENT_NOQUOTES, 'UTF-8'), $source);
+
+        if (is_string($message)) {
+            $this->server_error($message);
+            return;
+        }
+
+        $this->notify($user, $other, $message);
+
+        if ($apidata['content-type'] == 'xml') {
+            $this->show_single_xml_dmsg($message);
+        } elseif ($apidata['content-type'] == 'json') {
+            $this->show_single_json_dmsg($message);
+        }
+
+    }
+
+    function destroy($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
+
+    function show_xml_dmsgs($message) {
+
+        $this->init_document('xml');
+        common_element_start('direct-messages', array('type' => 'array'));
+
+        if (is_array($messages)) {
+            foreach ($message as $m) {
+                $twitter_dm = $this->twitter_dmsg_array($m);
+                $this->show_twitter_xml_dmsg($twitter_dm);
+            }
+        } else {
+            while ($message->fetch()) {
+                $twitter_dm = $this->twitter_dmsg_array($message);
+                $this->show_twitter_xml_dmsg($twitter_dm);
+            }
+        }
+
+        common_element_end('direct-messages');
+        $this->end_document('xml');
+
+    }
+
+    function show_json_dmsgs($message) {
+
+        $this->init_document('json');
+
+        $dmsgs = array();
+
+        if (is_array($message)) {
+            foreach ($message as $m) {
+                $twitter_dm = $this->twitter_dmsg_array($m);
+                array_push($dmsgs, $twitter_dm);
+            }
+        } else {
+            while ($message->fetch()) {
+                $twitter_dm = $this->twitter_dmsg_array($message);
+                array_push($dmsgs, $twitter_dm);
+            }
+        }
+
+        $this->show_json_objects($dmsgs);
+        $this->end_document('json');
+
+    }
+
+    function show_rss_dmsgs($message, $title, $link, $subtitle) {
+
+        $this->init_document('rss');
+
+        common_element_start('channel');
+        common_element('title', NULL, $title);
+
+        common_element('link', NULL, $link);
+        common_element('description', NULL, $subtitle);
+        common_element('language', NULL, 'en-us');
+        common_element('ttl', NULL, '40');
+
+        if (is_array($message)) {
+            foreach ($message as $m) {
+                $entry = $this->twitter_rss_dmsg_array($m);
+                $this->show_twitter_rss_item($entry);
+            }
+        } else {
+            while ($message->fetch()) {
+                $entry = $this->twitter_rss_dmsg_array($message);
+                $this->show_twitter_rss_item($entry);
+            }
+        }
+
+        common_element_end('channel');
+        $this->end_twitter_rss();
+
+    }
+
+    function show_atom_dmsgs($message, $title, $link, $subtitle) {
+
+        $this->init_document('atom');
+
+        common_element('title', NULL, $title);
+        $siteserver = common_config('site', 'server');
+        common_element('id', NULL, "tag:$siteserver,2008:DirectMessage");
+        common_element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), NULL);
+        common_element('updated', NULL, common_date_iso8601(strftime('%c')));
+        common_element('subtitle', NULL, $subtitle);
+
+        if (is_array($message)) {
+            foreach ($message as $m) {
+                $entry = $this->twitter_rss_dmsg_array($m);
+                $this->show_twitter_atom_entry($entry);
+            }
+        } else {
+            while ($message->fetch()) {
+                $entry = $this->twitter_rss_dmsg_array($message);
+                $this->show_twitter_atom_entry($entry);
+            }
+        }
+
+        $this->end_document('atom');
+    }
+
+    // swiped from MessageAction. Should it be place in util.php?
+    function notify($from, $to, $message) {
+        mail_notify_message($message, $from, $to);
+        # XXX: Jabber, SMS notifications... probably queued
+    }
 
 }
index 3eaff327a1c202d684106ad70876ce9fefb9e192..ad8c5f18b1823cac6a3ea322b24f09a8bb21890e 100644 (file)
@@ -23,153 +23,153 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class TwitapifavoritesAction extends TwitterapiAction {
 
-       function favorites($args, $apidata) {
-               parent::handle($args);
-
-               $this->auth_user = $apidata['user'];
-               $user = $this->get_user($apidata['api_arg'], $apidata);
-
-               if (!$user) {
-                       $this->client_error('Not Found', 404, $apidata['content-type']);
-                       return;
-               }
-
-               $profile = $user->getProfile();
-
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
-
-               $page = $this->arg('page');
-
-               if (!$page) {
-                       $page = 1;
-               }
-
-               if (!$count) {
-                       $count = 20;
-               }
-
-               $notice = $user->favoriteNotices((($page-1)*20), $count);
-
-               if (!$notice) {
-                       common_server_error(_('Could not retrieve favorite notices.'));
-                       return;
-               }
-
-               $sitename = common_config('site', 'name');
-               $siteserver = common_config('site', 'server');
-
-               $title = sprintf(_('%s / Favorites from %s'), $sitename, $user->nickname);
-               $id = "tag:$siteserver:favorites:".$user->id;
-               $link = common_local_url('favorites', array('nickname' => $user->nickname));
-               $subtitle = sprintf(_('%s updates favorited by %s / %s.'), $sitename, $profile->getBestName(), $user->nickname);
-
-               switch($apidata['content-type']) {
-                case 'xml':
-                       $this->show_xml_timeline($notice);
-                       break;
-                case 'rss':
-                       $this->show_rss_timeline($notice, $title, $link, $subtitle);
-                       break;
-                case 'atom':
-                       $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
-                       break;
-                case 'json':
-                       $this->show_json_timeline($notice);
-                       break;
-                default:
-                       common_user_error(_('API method not found!'), $code = 404);
-               }
-
-       }
-
-       function create($args, $apidata) {
-               parent::handle($args);
-
-               // Check for RESTfulness
-               if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
-                       // XXX: Twitter just prints the err msg, no XML / JSON.
-                       $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
-                       return;
-               }
-
-               if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-                       common_user_error(_('API method not found!'), $code = 404);
-                       return;
-               }
-
-               $this->auth_user = $apidata['user'];
-               $user = $this->auth_user;
-               $notice_id = $apidata['api_arg'];
-               $notice = Notice::staticGet($notice_id);
-
-               if (!$notice) {
-                       $this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']);
-                       return;
-               }
-
-               // XXX: Twitter lets you fave things repeatedly via api.
-               if ($user->hasFave($notice)) {
-                       $this->client_error(_('This notice is already a favorite!'), 403, $apidata['content-type']);
-                       return;
-               }
-
-               $fave = Fave::addNew($user, $notice);
-
-               if (!$fave) {
-                       common_server_error(_('Could not create favorite.'));
-                       return;
-               }
-
-               $this->notify($fave, $notice, $user);
-               $user->blowFavesCache();
-
-               if ($apidata['content-type'] == 'xml') {
-                       $this->show_single_xml_status($notice);
-               } elseif ($apidata['content-type'] == 'json') {
-                       $this->show_single_json_status($notice);
-               }
-
-       }
-
-       function destroy($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
-
-       // XXX: these two funcs swiped from faves.  Maybe put in util.php, or some common base class?
-
-       function notify($fave, $notice, $user) {
-           $other = User::staticGet('id', $notice->profile_id);
-               if ($other && $other->id != $user->id) {
-                       if ($other->email && $other->emailnotifyfav) {
-                               $this->notify_mail($other, $user, $notice);
-                       }
-                       # XXX: notify by IM
-                       # XXX: notify by SMS
-               }
-       }
-
-       function notify_mail($other, $user, $notice) {
-               $profile = $user->getProfile();
-               $bestname = $profile->getBestName();
-               $subject = sprintf(_('%s added your notice as a favorite'), $bestname);
-               $body = sprintf(_("%1\$s just added your notice from %2\$s as one of their favorites.\n\n" .
-                                                 "In case you forgot, you can see the text of your notice here:\n\n" .
-                                                 "%3\$s\n\n" .
-                                                 "You can see the list of %1\$s's favorites here:\n\n" .
-                                                 "%4\$s\n\n" .
-                                                 "Faithfully yours,\n" .
-                                                 "%5\$s\n"),
-                                               $bestname,
-                                               common_exact_date($notice->created),
-                                               common_local_url('shownotice', array('notice' => $notice->id)),
-                                               common_local_url('showfavorites', array('nickname' => $user->nickname)),
-                                               common_config('site', 'name'));
-
-               mail_to_user($other, $subject, $body);
-       }
+    function favorites($args, $apidata) {
+        parent::handle($args);
+
+        $this->auth_user = $apidata['user'];
+        $user = $this->get_user($apidata['api_arg'], $apidata);
+
+        if (!$user) {
+            $this->client_error('Not Found', 404, $apidata['content-type']);
+            return;
+        }
+
+        $profile = $user->getProfile();
+
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
+
+        $page = $this->arg('page');
+
+        if (!$page) {
+            $page = 1;
+        }
+
+        if (!$count) {
+            $count = 20;
+        }
+
+        $notice = $user->favoriteNotices((($page-1)*20), $count);
+
+        if (!$notice) {
+            common_server_error(_('Could not retrieve favorite notices.'));
+            return;
+        }
+
+        $sitename = common_config('site', 'name');
+        $siteserver = common_config('site', 'server');
+
+        $title = sprintf(_('%s / Favorites from %s'), $sitename, $user->nickname);
+        $id = "tag:$siteserver:favorites:".$user->id;
+        $link = common_local_url('favorites', array('nickname' => $user->nickname));
+        $subtitle = sprintf(_('%s updates favorited by %s / %s.'), $sitename, $profile->getBestName(), $user->nickname);
+
+        switch($apidata['content-type']) {
+         case 'xml':
+            $this->show_xml_timeline($notice);
+            break;
+         case 'rss':
+            $this->show_rss_timeline($notice, $title, $link, $subtitle);
+            break;
+         case 'atom':
+            $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
+            break;
+         case 'json':
+            $this->show_json_timeline($notice);
+            break;
+         default:
+            common_user_error(_('API method not found!'), $code = 404);
+        }
+
+    }
+
+    function create($args, $apidata) {
+        parent::handle($args);
+
+        // Check for RESTfulness
+        if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
+            // XXX: Twitter just prints the err msg, no XML / JSON.
+            $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
+            return;
+        }
+
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            common_user_error(_('API method not found!'), $code = 404);
+            return;
+        }
+
+        $this->auth_user = $apidata['user'];
+        $user = $this->auth_user;
+        $notice_id = $apidata['api_arg'];
+        $notice = Notice::staticGet($notice_id);
+
+        if (!$notice) {
+            $this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']);
+            return;
+        }
+
+        // XXX: Twitter lets you fave things repeatedly via api.
+        if ($user->hasFave($notice)) {
+            $this->client_error(_('This notice is already a favorite!'), 403, $apidata['content-type']);
+            return;
+        }
+
+        $fave = Fave::addNew($user, $notice);
+
+        if (!$fave) {
+            common_server_error(_('Could not create favorite.'));
+            return;
+        }
+
+        $this->notify($fave, $notice, $user);
+        $user->blowFavesCache();
+
+        if ($apidata['content-type'] == 'xml') {
+            $this->show_single_xml_status($notice);
+        } elseif ($apidata['content-type'] == 'json') {
+            $this->show_single_json_status($notice);
+        }
+
+    }
+
+    function destroy($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
+
+    // XXX: these two funcs swiped from faves.  Maybe put in util.php, or some common base class?
+
+    function notify($fave, $notice, $user) {
+        $other = User::staticGet('id', $notice->profile_id);
+        if ($other && $other->id != $user->id) {
+            if ($other->email && $other->emailnotifyfav) {
+                $this->notify_mail($other, $user, $notice);
+            }
+            # XXX: notify by IM
+            # XXX: notify by SMS
+        }
+    }
+
+    function notify_mail($other, $user, $notice) {
+        $profile = $user->getProfile();
+        $bestname = $profile->getBestName();
+        $subject = sprintf(_('%s added your notice as a favorite'), $bestname);
+        $body = sprintf(_("%1\$s just added your notice from %2\$s as one of their favorites.\n\n" .
+                          "In case you forgot, you can see the text of your notice here:\n\n" .
+                          "%3\$s\n\n" .
+                          "You can see the list of %1\$s's favorites here:\n\n" .
+                          "%4\$s\n\n" .
+                          "Faithfully yours,\n" .
+                          "%5\$s\n"),
+                        $bestname,
+                        common_exact_date($notice->created),
+                        common_local_url('shownotice', array('notice' => $notice->id)),
+                        common_local_url('showfavorites', array('nickname' => $user->nickname)),
+                        common_config('site', 'name'));
+
+        mail_to_user($other, $subject, $body);
+    }
 
 }
\ No newline at end of file
index e4b49cbe4a92529cc2c470b2779ec68dfa8b96f4..d352b933b9d320713f79f65f4d16b907ee70afd9 100644 (file)
@@ -23,133 +23,133 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class TwitapifriendshipsAction extends TwitterapiAction {
 
-       function create($args, $apidata) {
-               parent::handle($args);
+    function create($args, $apidata) {
+        parent::handle($args);
 
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
-                       return;
-               }
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
+            return;
+        }
 
-               $id = $apidata['api_arg'];
+        $id = $apidata['api_arg'];
 
-               $other = $this->get_user($id);
+        $other = $this->get_user($id);
 
-               if (!$other) {
-                       $this->client_error(_('Could not follow user: User not found.'), 403, $apidata['content-type']);
-                       return;
-               }
+        if (!$other) {
+            $this->client_error(_('Could not follow user: User not found.'), 403, $apidata['content-type']);
+            return;
+        }
 
-               $user = $apidata['user'];
+        $user = $apidata['user'];
 
-               if ($user->isSubscribed($other)) {
-                       $errmsg = sprintf(_('Could not follow user: %s is already on your list.'), $other->nickname);
-                       $this->client_error($errmsg, 403, $apidata['content-type']);
-                       return;
-               }
+        if ($user->isSubscribed($other)) {
+            $errmsg = sprintf(_('Could not follow user: %s is already on your list.'), $other->nickname);
+            $this->client_error($errmsg, 403, $apidata['content-type']);
+            return;
+        }
 
-               $sub = new Subscription();
+        $sub = new Subscription();
 
-               $sub->query('BEGIN');
+        $sub->query('BEGIN');
 
-               $sub->subscriber = $user->id;
-               $sub->subscribed = $other->id;
-               $sub->created = DB_DataObject_Cast::dateTime(); # current time
+        $sub->subscriber = $user->id;
+        $sub->subscribed = $other->id;
+        $sub->created = DB_DataObject_Cast::dateTime(); # current time
 
-               $result = $sub->insert();
+        $result = $sub->insert();
 
-               if (!$result) {
-                       $errmsg = sprintf(_('Could not follow user: %s is already on your list.'), $other->nickname);
-                       $this->client_error($errmsg, 400, $apidata['content-type']);
-                       return;
-               }
+        if (!$result) {
+            $errmsg = sprintf(_('Could not follow user: %s is already on your list.'), $other->nickname);
+            $this->client_error($errmsg, 400, $apidata['content-type']);
+            return;
+        }
 
-               $sub->query('COMMIT');
+        $sub->query('COMMIT');
 
-               mail_subscribe_notify($other, $user);
+        mail_subscribe_notify($other, $user);
 
-               $type = $apidata['content-type'];
-               $this->init_document($type);
-               $this->show_profile($other, $type);
-               $this->end_document($type);
+        $type = $apidata['content-type'];
+        $this->init_document($type);
+        $this->show_profile($other, $type);
+        $this->end_document($type);
 
-       }
+    }
 
-       function destroy($args, $apidata) {
-               parent::handle($args);
+    function destroy($args, $apidata) {
+        parent::handle($args);
 
-               if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
-                       $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
-                       return;
-               }
+        if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
+            $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
+            return;
+        }
 
-               $id = $apidata['api_arg'];
+        $id = $apidata['api_arg'];
 
-               # We can't subscribe to a remote person, but we can unsub
+        # We can't subscribe to a remote person, but we can unsub
 
-               $other = $this->get_profile($id);
-               $user = $apidata['user'];
+        $other = $this->get_profile($id);
+        $user = $apidata['user'];
 
-               $sub = new Subscription();
-               $sub->subscriber = $user->id;
-               $sub->subscribed = $other->id;
+        $sub = new Subscription();
+        $sub->subscriber = $user->id;
+        $sub->subscribed = $other->id;
 
-               if ($sub->find(TRUE)) {
-                       $sub->query('BEGIN');
-                       $sub->delete();
-                       $sub->query('COMMIT');
-               } else {
-                       $this->client_error(_('You are not friends with the specified user.'), 403, $apidata['content-type']);
-                       return;
-               }
+        if ($sub->find(TRUE)) {
+            $sub->query('BEGIN');
+            $sub->delete();
+            $sub->query('COMMIT');
+        } else {
+            $this->client_error(_('You are not friends with the specified user.'), 403, $apidata['content-type']);
+            return;
+        }
 
-               $type = $apidata['content-type'];
-               $this->init_document($type);
-               $this->show_profile($other, $type);
-               $this->end_document($type);
+        $type = $apidata['content-type'];
+        $this->init_document($type);
+        $this->show_profile($other, $type);
+        $this->end_document($type);
 
-       }
+    }
 
-       function exists($args, $apidata) {
-               parent::handle($args);
+    function exists($args, $apidata) {
+        parent::handle($args);
 
-               if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-                       common_user_error(_('API method not found!'), $code = 404);
-                       return;
-               }
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            common_user_error(_('API method not found!'), $code = 404);
+            return;
+        }
 
-               $user_a_id = $this->trimmed('user_a');
-               $user_b_id = $this->trimmed('user_b');
+        $user_a_id = $this->trimmed('user_a');
+        $user_b_id = $this->trimmed('user_b');
 
-               $user_a = $this->get_user($user_a_id);
-               $user_b = $this->get_user($user_b_id);
+        $user_a = $this->get_user($user_a_id);
+        $user_b = $this->get_user($user_b_id);
 
-               if (!$user_a || !$user_b) {
-                       $this->client_error(_('Two user ids or screen_names must be supplied.'), 400, $apidata['content-type']);
-                       return;
-               }
+        if (!$user_a || !$user_b) {
+            $this->client_error(_('Two user ids or screen_names must be supplied.'), 400, $apidata['content-type']);
+            return;
+        }
 
-               if ($user_a->isSubscribed($user_b)) {
-                       $result = 'true';
-               } else {
-                       $result = 'false';
-               }
+        if ($user_a->isSubscribed($user_b)) {
+            $result = 'true';
+        } else {
+            $result = 'false';
+        }
 
-               switch ($apidata['content-type']) {
-                case 'xml':
-                       $this->init_document('xml');
-                       common_element('friends', NULL, $result);
-                       $this->end_document('xml');
-                       break;
-                case 'json':
-                       $this->init_document('json');
-                       print json_encode($result);
-                       $this->end_document('json');
-                       break;
-                default:
-                       break;
-               }
+        switch ($apidata['content-type']) {
+         case 'xml':
+            $this->init_document('xml');
+            common_element('friends', NULL, $result);
+            $this->end_document('xml');
+            break;
+         case 'json':
+            $this->init_document('json');
+            print json_encode($result);
+            $this->end_document('json');
+            break;
+         default:
+            break;
+        }
 
-       }
+    }
 
 }
\ No newline at end of file
index c5d503e11864cadd33f23dacaa6cafe4dec17302..d268b7c8224f7b7fac4811e31ca8e0c0e1ce7f1f 100644 (file)
@@ -23,30 +23,30 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class TwitapihelpAction extends TwitterapiAction {
 
-       /* Returns the string "ok" in the requested format with a 200 OK HTTP status code.
-        * URL:http://identi.ca/api/help/test.format
-        * Formats: xml, json
-        */
-       function test($args, $apidata) {
-               parent::handle($args);
-
-               if ($apidata['content-type'] == 'xml') {
-                       $this->init_document('xml');
-                       common_element('ok', NULL, 'true');
-                       $this->end_document('xml');
-               } elseif ($apidata['content-type'] == 'json') {
-                       $this->init_document('json');
-                       print '"ok"';
-                       $this->end_document('json');
-               } else {
-                       common_user_error(_('API method not found!'), $code=404);
-               }
-
-       }
-
-       function downtime_schedule($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
+    /* Returns the string "ok" in the requested format with a 200 OK HTTP status code.
+     * URL:http://identi.ca/api/help/test.format
+     * Formats: xml, json
+     */
+    function test($args, $apidata) {
+        parent::handle($args);
+
+        if ($apidata['content-type'] == 'xml') {
+            $this->init_document('xml');
+            common_element('ok', NULL, 'true');
+            $this->end_document('xml');
+        } elseif ($apidata['content-type'] == 'json') {
+            $this->init_document('json');
+            print '"ok"';
+            $this->end_document('json');
+        } else {
+            common_user_error(_('API method not found!'), $code=404);
+        }
+
+    }
+
+    function downtime_schedule($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
 
 }
\ No newline at end of file
index 8d93309a25a7149db9d18dcf19dda3451d5f8fa1..26f66d7e51ef2491351bc7548aeda445f5b7b493 100644 (file)
@@ -24,14 +24,14 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 # This naming convention looks real sick
 class TwitapinotificationsAction extends TwitterapiAction {
 
-       function follow($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
+    function follow($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
 
-       function leave($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
+    function leave($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
 
 }
\ No newline at end of file
index 7b6598b108e8fc8d4d2d74173cf05f63bc20fb35..c33643a3ce23123b7c7a7e1186094a5385869825 100644 (file)
@@ -23,541 +23,541 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class TwitapistatusesAction extends TwitterapiAction {
 
-       function public_timeline($args, $apidata) {
-               parent::handle($args);
-
-               $sitename = common_config('site', 'name');
-               $siteserver = common_config('site', 'server');
-               $title = sprintf(_("%s public timeline"), $sitename);
-               $id = "tag:$siteserver:Statuses";
-               $link = common_root_url();
-               $subtitle = sprintf(_("%s updates from everyone!"), $sitename);
-
-               // Number of public statuses to return by default -- Twitter sends 20
-               $MAX_PUBSTATUSES = 20;
-
-               // FIXME: To really live up to the spec we need to build a list
-               // of notices by users who have custom avatars, so fix this SQL -- Zach
-
-               $page = $this->arg('page');
-               $since_id = $this->arg('since_id');
-               $before_id = $this->arg('before_id');
-
-               // NOTE: page, since_id, and before_id are extensions to Twitter API -- TB
-               if (!$page) {
-                       $page = 1;
-               }
-               if (!$since_id) {
-                       $since_id = 0;
-               }
-               if (!$before_id) {
-                       $before_id = 0;
-               }
-
-               $since = strtotime($this->arg('since'));
-
-               $notice = Notice::publicStream((($page-1)*$MAX_PUBSTATUSES), $MAX_PUBSTATUSES, $since_id, $before_id, $since);
-
-               if ($notice) {
-
-                       switch($apidata['content-type']) {
-                               case 'xml':
-                                       $this->show_xml_timeline($notice);
-                                       break;
-                               case 'rss':
-                                       $this->show_rss_timeline($notice, $title, $link, $subtitle);
-                                       break;
-                               case 'atom':
-                                       $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
-                                       break;
-                               case 'json':
-                                       $this->show_json_timeline($notice);
-                                       break;
-                               default:
-                                       common_user_error(_('API method not found!'), $code = 404);
-                                       break;
-                       }
-
-               } else {
-                       common_server_error(_('Couldn\'t find any statuses.'), $code = 503);
-               }
-
-       }
-
-       function friends_timeline($args, $apidata) {
-               parent::handle($args);
-
-               $since = $this->arg('since');
-               $since_id = $this->arg('since_id');
-               $count = $this->arg('count');
-               $page = $this->arg('page');
-               $before_id = $this->arg('before_id');
-
-               if (!$page) {
-                       $page = 1;
-               }
-
-               if (!$count) {
-                       $count = 20;
-               }
-
-               if (!$since_id) {
-                       $since_id = 0;
-               }
-
-               // NOTE: before_id is an extension to Twitter API -- TB
-               if (!$before_id) {
-                       $before_id = 0;
-               }
-
-               $since = strtotime($this->arg('since'));
-
-               $user = $this->get_user(NULL, $apidata);
-               $this->auth_user = $user;
-
-               $profile = $user->getProfile();
-
-               $sitename = common_config('site', 'name');
-               $siteserver = common_config('site', 'server');
-
-               $title = sprintf(_("%s and friends"), $user->nickname);
-               $id = "tag:$siteserver:friends:" . $user->id;
-               $link = common_local_url('all', array('nickname' => $user->nickname));
-               $subtitle = sprintf(_('Updates from %1$s and friends on %2$s!'), $user->nickname, $sitename);
-
-               $notice = $user->noticesWithFriends(($page-1)*20, $count, $since_id, $before_id, $since);
-
-               switch($apidata['content-type']) {
-                case 'xml':
-                       $this->show_xml_timeline($notice);
-                       break;
-                case 'rss':
-                       $this->show_rss_timeline($notice, $title, $link, $subtitle);
-                       break;
-                case 'atom':
-                       $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
-                       break;
-                case 'json':
-                       $this->show_json_timeline($notice);
-                       break;
-                default:
-                       common_user_error(_('API method not found!'), $code = 404);
-               }
-
-       }
-
-       function user_timeline($args, $apidata) {
-               parent::handle($args);
-
-               $this->auth_user = $apidata['user'];
-               $user = $this->get_user($apidata['api_arg'], $apidata);
-
-               if (!$user) {
-                       $this->client_error('Not Found', 404, $apidata['content-type']);
-                       return;
-               }
-
-               $profile = $user->getProfile();
-
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
-
-               $count = $this->arg('count');
-               $since = $this->arg('since');
-               $since_id = $this->arg('since_id');
-               $page = $this->arg('page');
-               $before_id = $this->arg('before_id');
-
-               if (!$page) {
-                       $page = 1;
-               }
-
-               if (!$count) {
-                       $count = 20;
-               }
-
-               if (!$since_id) {
-                       $since_id = 0;
-               }
-
-               // NOTE: before_id is an extensions to Twitter API -- TB
-               if (!$before_id) {
-                       $before_id = 0;
-               }
-
-               $since = strtotime($this->arg('since'));
-
-               $sitename = common_config('site', 'name');
-               $siteserver = common_config('site', 'server');
-
-               $title = sprintf(_("%s timeline"), $user->nickname);
-               $id = "tag:$siteserver:user:".$user->id;
-               $link = common_local_url('showstream', array('nickname' => $user->nickname));
-               $subtitle = sprintf(_('Updates from %1$s on %2$s!'), $user->nickname, $sitename);
-
-               # FriendFeed's SUP protocol
-               # Also added RSS and Atom feeds
-
-               $suplink = common_local_url('sup', NULL, $user->id);
-               header('X-SUP-ID: '.$suplink);
-
-               # XXX: since
-
-               $notice = $user->getNotices((($page-1)*20), $count, $since_id, $before_id, $since);
-
-               switch($apidata['content-type']) {
-                case 'xml':
-                       $this->show_xml_timeline($notice);
-                       break;
-                case 'rss':
-                       $this->show_rss_timeline($notice, $title, $link, $subtitle, $suplink);
-                       break;
-                case 'atom':
-                       $this->show_atom_timeline($notice, $title, $id, $link, $subtitle, $suplink);
-                       break;
-                case 'json':
-                       $this->show_json_timeline($notice);
-                       break;
-                default:
-                       common_user_error(_('API method not found!'), $code = 404);
-               }
-
-       }
-
-       function update($args, $apidata) {
-
-               parent::handle($args);
-
-               if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-                       common_user_error(_('API method not found!'), $code = 404);
-                       return;
-               }
-
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
-                       return;
-               }
-
-               $this->auth_user = $apidata['user'];
-               $user = $this->auth_user;
-               $status = $this->trimmed('status');
-               $source = $this->trimmed('source');
-               $in_reply_to_status_id = intval($this->trimmed('in_reply_to_status_id'));
+    function public_timeline($args, $apidata) {
+        parent::handle($args);
+
+        $sitename = common_config('site', 'name');
+        $siteserver = common_config('site', 'server');
+        $title = sprintf(_("%s public timeline"), $sitename);
+        $id = "tag:$siteserver:Statuses";
+        $link = common_root_url();
+        $subtitle = sprintf(_("%s updates from everyone!"), $sitename);
+
+        // Number of public statuses to return by default -- Twitter sends 20
+        $MAX_PUBSTATUSES = 20;
+
+        // FIXME: To really live up to the spec we need to build a list
+        // of notices by users who have custom avatars, so fix this SQL -- Zach
+
+        $page = $this->arg('page');
+        $since_id = $this->arg('since_id');
+        $before_id = $this->arg('before_id');
+
+        // NOTE: page, since_id, and before_id are extensions to Twitter API -- TB
+        if (!$page) {
+            $page = 1;
+        }
+        if (!$since_id) {
+            $since_id = 0;
+        }
+        if (!$before_id) {
+            $before_id = 0;
+        }
+
+        $since = strtotime($this->arg('since'));
+
+        $notice = Notice::publicStream((($page-1)*$MAX_PUBSTATUSES), $MAX_PUBSTATUSES, $since_id, $before_id, $since);
+
+        if ($notice) {
+
+            switch($apidata['content-type']) {
+                case 'xml':
+                    $this->show_xml_timeline($notice);
+                    break;
+                case 'rss':
+                    $this->show_rss_timeline($notice, $title, $link, $subtitle);
+                    break;
+                case 'atom':
+                    $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
+                    break;
+                case 'json':
+                    $this->show_json_timeline($notice);
+                    break;
+                default:
+                    common_user_error(_('API method not found!'), $code = 404);
+                    break;
+            }
+
+        } else {
+            common_server_error(_('Couldn\'t find any statuses.'), $code = 503);
+        }
+
+    }
+
+    function friends_timeline($args, $apidata) {
+        parent::handle($args);
+
+        $since = $this->arg('since');
+        $since_id = $this->arg('since_id');
+        $count = $this->arg('count');
+        $page = $this->arg('page');
+        $before_id = $this->arg('before_id');
+
+        if (!$page) {
+            $page = 1;
+        }
+
+        if (!$count) {
+            $count = 20;
+        }
+
+        if (!$since_id) {
+            $since_id = 0;
+        }
+
+        // NOTE: before_id is an extension to Twitter API -- TB
+        if (!$before_id) {
+            $before_id = 0;
+        }
+
+        $since = strtotime($this->arg('since'));
+
+        $user = $this->get_user(NULL, $apidata);
+        $this->auth_user = $user;
+
+        $profile = $user->getProfile();
+
+        $sitename = common_config('site', 'name');
+        $siteserver = common_config('site', 'server');
+
+        $title = sprintf(_("%s and friends"), $user->nickname);
+        $id = "tag:$siteserver:friends:" . $user->id;
+        $link = common_local_url('all', array('nickname' => $user->nickname));
+        $subtitle = sprintf(_('Updates from %1$s and friends on %2$s!'), $user->nickname, $sitename);
+
+        $notice = $user->noticesWithFriends(($page-1)*20, $count, $since_id, $before_id, $since);
+
+        switch($apidata['content-type']) {
+         case 'xml':
+            $this->show_xml_timeline($notice);
+            break;
+         case 'rss':
+            $this->show_rss_timeline($notice, $title, $link, $subtitle);
+            break;
+         case 'atom':
+            $this->show_atom_timeline($notice, $title, $id, $link, $subtitle);
+            break;
+         case 'json':
+            $this->show_json_timeline($notice);
+            break;
+         default:
+            common_user_error(_('API method not found!'), $code = 404);
+        }
+
+    }
+
+    function user_timeline($args, $apidata) {
+        parent::handle($args);
+
+        $this->auth_user = $apidata['user'];
+        $user = $this->get_user($apidata['api_arg'], $apidata);
+
+        if (!$user) {
+            $this->client_error('Not Found', 404, $apidata['content-type']);
+            return;
+        }
+
+        $profile = $user->getProfile();
+
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
+
+        $count = $this->arg('count');
+        $since = $this->arg('since');
+        $since_id = $this->arg('since_id');
+        $page = $this->arg('page');
+        $before_id = $this->arg('before_id');
+
+        if (!$page) {
+            $page = 1;
+        }
+
+        if (!$count) {
+            $count = 20;
+        }
+
+        if (!$since_id) {
+            $since_id = 0;
+        }
+
+        // NOTE: before_id is an extensions to Twitter API -- TB
+        if (!$before_id) {
+            $before_id = 0;
+        }
+
+        $since = strtotime($this->arg('since'));
+
+        $sitename = common_config('site', 'name');
+        $siteserver = common_config('site', 'server');
+
+        $title = sprintf(_("%s timeline"), $user->nickname);
+        $id = "tag:$siteserver:user:".$user->id;
+        $link = common_local_url('showstream', array('nickname' => $user->nickname));
+        $subtitle = sprintf(_('Updates from %1$s on %2$s!'), $user->nickname, $sitename);
+
+        # FriendFeed's SUP protocol
+        # Also added RSS and Atom feeds
+
+        $suplink = common_local_url('sup', NULL, $user->id);
+        header('X-SUP-ID: '.$suplink);
+
+        # XXX: since
+
+        $notice = $user->getNotices((($page-1)*20), $count, $since_id, $before_id, $since);
+
+        switch($apidata['content-type']) {
+         case 'xml':
+            $this->show_xml_timeline($notice);
+            break;
+         case 'rss':
+            $this->show_rss_timeline($notice, $title, $link, $subtitle, $suplink);
+            break;
+         case 'atom':
+            $this->show_atom_timeline($notice, $title, $id, $link, $subtitle, $suplink);
+            break;
+         case 'json':
+            $this->show_json_timeline($notice);
+            break;
+         default:
+            common_user_error(_('API method not found!'), $code = 404);
+        }
+
+    }
+
+    function update($args, $apidata) {
+
+        parent::handle($args);
+
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            common_user_error(_('API method not found!'), $code = 404);
+            return;
+        }
+
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            $this->client_error(_('This method requires a POST.'), 400, $apidata['content-type']);
+            return;
+        }
+
+        $this->auth_user = $apidata['user'];
+        $user = $this->auth_user;
+        $status = $this->trimmed('status');
+        $source = $this->trimmed('source');
+        $in_reply_to_status_id = intval($this->trimmed('in_reply_to_status_id'));
         $reserved_sources = array('web', 'omb', 'mail', 'xmpp', 'api');
-               if (!$source || in_array($source, $reserved_sources)) {
-                       $source = 'api';
-               }
+        if (!$source || in_array($source, $reserved_sources)) {
+            $source = 'api';
+        }
 
-               if (!$status) {
+        if (!$status) {
 
-                       // XXX: Note: In this case, Twitter simply returns '200 OK'
-                       // No error is given, but the status is not posted to the
-                       // user's timeline.      Seems bad.      Shouldn't we throw an
-                       // errror? -- Zach
-                       return;
+            // XXX: Note: In this case, Twitter simply returns '200 OK'
+            // No error is given, but the status is not posted to the
+            // user's timeline.     Seems bad.     Shouldn't we throw an
+            // errror? -- Zach
+            return;
 
-               } else {
+        } else {
 
-                       $status_shortened = common_shorten_links($status);
+            $status_shortened = common_shorten_links($status);
 
-                       if (mb_strlen($status_shortened) > 140) {
+            if (mb_strlen($status_shortened) > 140) {
 
-                               // XXX: Twitter truncates anything over 140, flags the status
-                               // as "truncated." Sending this error may screw up some clients
-                               // that assume Twitter will truncate for them.  Should we just
-                               // truncate too? -- Zach
-                               $this->client_error(_('That\'s too long. Max notice size is 140 chars.'), $code = 406, $apidata['content-type']);
-                               return;
+                // XXX: Twitter truncates anything over 140, flags the status
+                // as "truncated." Sending this error may screw up some clients
+                // that assume Twitter will truncate for them.    Should we just
+                // truncate too? -- Zach
+                $this->client_error(_('That\'s too long. Max notice size is 140 chars.'), $code = 406, $apidata['content-type']);
+                return;
 
-                       }
-               }
+            }
+        }
 
-               // Check for commands
-               $inter = new CommandInterpreter();
-               $cmd = $inter->handle_command($user, $status_shortened);
+        // Check for commands
+        $inter = new CommandInterpreter();
+        $cmd = $inter->handle_command($user, $status_shortened);
 
-               if ($cmd) {
+        if ($cmd) {
 
-                       if ($this->supported($cmd)) {
-                               $cmd->execute(new Channel());
-                       }
-
-                       // cmd not supported?  Twitter just returns your latest status.
-                       // And, it returns your last status whether the cmd was successful
-                       // or not!
-                       $n = $user->getCurrentNotice();
-                       $apidata['api_arg'] = $n->id;
-               } else {
+            if ($this->supported($cmd)) {
+                $cmd->execute(new Channel());
+            }
+
+            // cmd not supported?  Twitter just returns your latest status.
+            // And, it returns your last status whether the cmd was successful
+            // or not!
+            $n = $user->getCurrentNotice();
+            $apidata['api_arg'] = $n->id;
+        } else {
 
-                       $reply_to = NULL;
+            $reply_to = NULL;
 
-                       if ($in_reply_to_status_id) {
-
-                               // check whether notice actually exists
-                               $reply = Notice::staticGet($in_reply_to_status_id);
-
-                               if ($reply) {
-                                       $reply_to = $in_reply_to_status_id;
-                               } else {
-                                       $this->client_error(_('Not found'), $code = 404, $apidata['content-type']);
-                                       return;
-                               }
-                       }
-
-                       $notice = Notice::saveNew($user->id, html_entity_decode($status, ENT_NOQUOTES, 'UTF-8'),
-                               $source, 1, $reply_to);
-
-                       if (is_string($notice)) {
-                               $this->server_error($notice);
-                               return;
-                       }
-
-                       common_broadcast_notice($notice);
-                       $apidata['api_arg'] = $notice->id;
-               }
-
-               $this->show($args, $apidata);
-       }
-
-       function replies($args, $apidata) {
-
-               parent::handle($args);
-
-               $since = $this->arg('since');
-               $count = $this->arg('count');
-               $page = $this->arg('page');
-               $since_id = $this->arg('since_id');
-               $before_id = $this->arg('before_id');
-
-               $this->auth_user = $apidata['user'];
-               $user = $this->auth_user;
-               $profile = $user->getProfile();
-
-               $sitename = common_config('site', 'name');
-               $siteserver = common_config('site', 'server');
-
-               $title = sprintf(_('%1$s / Updates replying to %2$s'), $sitename, $user->nickname);
-               $id = "tag:$siteserver:replies:".$user->id;
-               $link = common_local_url('replies', array('nickname' => $user->nickname));
-               $subtitle = sprintf(_('%1$s updates that reply to updates from %2$s / %3$s.'), $sitename, $user->nickname, $profile->getBestName());
-
-               if (!$page) {
-                       $page = 1;
-               }
-
-               if (!$count) {
-                       $count = 20;
-               }
-
-               if (!$since_id) {
-                       $since_id = 0;
-               }
-
-               // NOTE: before_id is an extension to Twitter API -- TB
-               if (!$before_id) {
-                       $before_id = 0;
-               }
-
-               $since = strtotime($this->arg('since'));
-
-               $notice = $user->getReplies((($page-1)*20), $count, $since_id, $before_id, $since);
-               $notices = array();
-
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
-
-               switch($apidata['content-type']) {
-                case 'xml':
-                       $this->show_xml_timeline($notices);
-                       break;
-                case 'rss':
-                       $this->show_rss_timeline($notices, $title, $link, $subtitle);
-                       break;
-                case 'atom':
-                       $this->show_atom_timeline($notices, $title, $id, $link, $subtitle);
-                       break;
-                case 'json':
-                       $this->show_json_timeline($notices);
-                       break;
-                default:
-                       common_user_error(_('API method not found!'), $code = 404);
-               }
-
-       }
-
-       function show($args, $apidata) {
-               parent::handle($args);
-
-               if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-                       common_user_error(_('API method not found!'), $code = 404);
-                       return;
-               }
-
-               $this->auth_user = $apidata['user'];
-               $notice_id = $apidata['api_arg'];
-               $notice = Notice::staticGet($notice_id);
-
-               if ($notice) {
-                       if ($apidata['content-type'] == 'xml') {
-                               $this->show_single_xml_status($notice);
-                       } elseif ($apidata['content-type'] == 'json') {
-                               $this->show_single_json_status($notice);
-                       }
-               } else {
-                       // XXX: Twitter just sets a 404 header and doens't bother to return an err msg
-                       $this->client_error(_('No status with that ID found.'), 404, $apidata['content-type']);
-               }
-
-       }
-
-       function destroy($args, $apidata) {
-
-               parent::handle($args);
-
-               if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-                       common_user_error(_('API method not found!'), $code = 404);
-                       return;
-               }
-
-               // Check for RESTfulness
-               if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
-                       // XXX: Twitter just prints the err msg, no XML / JSON.
-                       $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
-                       return;
-               }
-
-               $this->auth_user = $apidata['user'];
-               $user = $this->auth_user;
-               $notice_id = $apidata['api_arg'];
-               $notice = Notice::staticGet($notice_id);
-
-               if (!$notice) {
-                       $this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']);
-                       return;
-               }
-
-               if ($user->id == $notice->profile_id) {
-                       $replies = new Reply;
-                       $replies->get('notice_id', $notice_id);
-                       common_dequeue_notice($notice);
-                       $replies->delete();
-                       $notice->delete();
-
-                       if ($apidata['content-type'] == 'xml') {
-                               $this->show_single_xml_status($notice);
-                       } elseif ($apidata['content-type'] == 'json') {
-                               $this->show_single_json_status($notice);
-                       }
-               } else {
-                       $this->client_error(_('You may not delete another user\'s status.'), 403, $apidata['content-type']);
-               }
-
-       }
-
-       function friends($args, $apidata) {
-               parent::handle($args);
-               return $this->subscriptions($apidata, 'subscribed', 'subscriber');
-       }
-
-       function followers($args, $apidata) {
-               parent::handle($args);
-
-               return $this->subscriptions($apidata, 'subscriber', 'subscribed');
-       }
-
-       function subscriptions($apidata, $other_attr, $user_attr) {
-
-               # XXX: lite
-
-               $this->auth_user = $apidate['user'];
-               $user = $this->get_user($apidata['api_arg'], $apidata);
-
-               if (!$user) {
-                       $this->client_error('Not Found', 404, $apidata['content-type']);
-                       return;
-               }
-
-               $page = $this->trimmed('page');
-
-               if (!$page || !is_numeric($page)) {
-                       $page = 1;
-               }
-
-               $profile = $user->getProfile();
-
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
-
-               $sub = new Subscription();
-               $sub->$user_attr = $profile->id;
-
-               $since = strtotime($this->trimmed('since'));
-
-               if ($since) {
-                       $d = date('Y-m-d H:i:s', $since);
-                       $sub->whereAdd("created > '$d'");
-               }
-
-               $sub->orderBy('created DESC');
-               $sub->limit(($page-1)*100, 100);
-
-               $others = array();
-
-               if ($sub->find()) {
-                       while ($sub->fetch()) {
-                               $others[] = Profile::staticGet($sub->$other_attr);
-                       }
-               } else {
-                       // user has no followers
-               }
-
-               $type = $apidata['content-type'];
-
-               $this->init_document($type);
-               $this->show_profiles($others, $type);
-               $this->end_document($type);
-       }
-
-       function show_profiles($profiles, $type) {
-               switch ($type) {
-                case 'xml':
-                       common_element_start('users', array('type' => 'array'));
-                       foreach ($profiles as $profile) {
-                               $this->show_profile($profile);
-                       }
-                       common_element_end('users');
-                       break;
-                case 'json':
-                       $arrays = array();
-                       foreach ($profiles as $profile) {
-                               $arrays[] = $this->twitter_user_array($profile, true);
-                       }
-                       print json_encode($arrays);
-                       break;
-                default:
-                       $this->client_error(_('unsupported file type'));
-               }
-       }
-
-       function featured($args, $apidata) {
-               parent::handle($args);
-               common_server_error(_('API method under construction.'), $code=501);
-       }
-
-       function supported($cmd) {
-
-               $cmdlist = array('MessageCommand', 'SubCommand', 'UnsubCommand', 'FavCommand', 'OnCommand', 'OffCommand');
+            if ($in_reply_to_status_id) {
+
+                // check whether notice actually exists
+                $reply = Notice::staticGet($in_reply_to_status_id);
+
+                if ($reply) {
+                    $reply_to = $in_reply_to_status_id;
+                } else {
+                    $this->client_error(_('Not found'), $code = 404, $apidata['content-type']);
+                    return;
+                }
+            }
+
+            $notice = Notice::saveNew($user->id, html_entity_decode($status, ENT_NOQUOTES, 'UTF-8'),
+                $source, 1, $reply_to);
+
+            if (is_string($notice)) {
+                $this->server_error($notice);
+                return;
+            }
+
+            common_broadcast_notice($notice);
+            $apidata['api_arg'] = $notice->id;
+        }
+
+        $this->show($args, $apidata);
+    }
+
+    function replies($args, $apidata) {
+
+        parent::handle($args);
+
+        $since = $this->arg('since');
+        $count = $this->arg('count');
+        $page = $this->arg('page');
+        $since_id = $this->arg('since_id');
+        $before_id = $this->arg('before_id');
+
+        $this->auth_user = $apidata['user'];
+        $user = $this->auth_user;
+        $profile = $user->getProfile();
+
+        $sitename = common_config('site', 'name');
+        $siteserver = common_config('site', 'server');
+
+        $title = sprintf(_('%1$s / Updates replying to %2$s'), $sitename, $user->nickname);
+        $id = "tag:$siteserver:replies:".$user->id;
+        $link = common_local_url('replies', array('nickname' => $user->nickname));
+        $subtitle = sprintf(_('%1$s updates that reply to updates from %2$s / %3$s.'), $sitename, $user->nickname, $profile->getBestName());
+
+        if (!$page) {
+            $page = 1;
+        }
+
+        if (!$count) {
+            $count = 20;
+        }
+
+        if (!$since_id) {
+            $since_id = 0;
+        }
+
+        // NOTE: before_id is an extension to Twitter API -- TB
+        if (!$before_id) {
+            $before_id = 0;
+        }
+
+        $since = strtotime($this->arg('since'));
+
+        $notice = $user->getReplies((($page-1)*20), $count, $since_id, $before_id, $since);
+        $notices = array();
+
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
+
+        switch($apidata['content-type']) {
+         case 'xml':
+            $this->show_xml_timeline($notices);
+            break;
+         case 'rss':
+            $this->show_rss_timeline($notices, $title, $link, $subtitle);
+            break;
+         case 'atom':
+            $this->show_atom_timeline($notices, $title, $id, $link, $subtitle);
+            break;
+         case 'json':
+            $this->show_json_timeline($notices);
+            break;
+         default:
+            common_user_error(_('API method not found!'), $code = 404);
+        }
+
+    }
+
+    function show($args, $apidata) {
+        parent::handle($args);
+
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            common_user_error(_('API method not found!'), $code = 404);
+            return;
+        }
+
+        $this->auth_user = $apidata['user'];
+        $notice_id = $apidata['api_arg'];
+        $notice = Notice::staticGet($notice_id);
+
+        if ($notice) {
+            if ($apidata['content-type'] == 'xml') {
+                $this->show_single_xml_status($notice);
+            } elseif ($apidata['content-type'] == 'json') {
+                $this->show_single_json_status($notice);
+            }
+        } else {
+            // XXX: Twitter just sets a 404 header and doens't bother to return an err msg
+            $this->client_error(_('No status with that ID found.'), 404, $apidata['content-type']);
+        }
+
+    }
+
+    function destroy($args, $apidata) {
+
+        parent::handle($args);
+
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            common_user_error(_('API method not found!'), $code = 404);
+            return;
+        }
+
+        // Check for RESTfulness
+        if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
+            // XXX: Twitter just prints the err msg, no XML / JSON.
+            $this->client_error(_('This method requires a POST or DELETE.'), 400, $apidata['content-type']);
+            return;
+        }
+
+        $this->auth_user = $apidata['user'];
+        $user = $this->auth_user;
+        $notice_id = $apidata['api_arg'];
+        $notice = Notice::staticGet($notice_id);
+
+        if (!$notice) {
+            $this->client_error(_('No status found with that ID.'), 404, $apidata['content-type']);
+            return;
+        }
+
+        if ($user->id == $notice->profile_id) {
+            $replies = new Reply;
+            $replies->get('notice_id', $notice_id);
+            common_dequeue_notice($notice);
+            $replies->delete();
+            $notice->delete();
+
+            if ($apidata['content-type'] == 'xml') {
+                $this->show_single_xml_status($notice);
+            } elseif ($apidata['content-type'] == 'json') {
+                $this->show_single_json_status($notice);
+            }
+        } else {
+            $this->client_error(_('You may not delete another user\'s status.'), 403, $apidata['content-type']);
+        }
+
+    }
+
+    function friends($args, $apidata) {
+        parent::handle($args);
+        return $this->subscriptions($apidata, 'subscribed', 'subscriber');
+    }
+
+    function followers($args, $apidata) {
+        parent::handle($args);
+
+        return $this->subscriptions($apidata, 'subscriber', 'subscribed');
+    }
+
+    function subscriptions($apidata, $other_attr, $user_attr) {
+
+        # XXX: lite
+
+        $this->auth_user = $apidate['user'];
+        $user = $this->get_user($apidata['api_arg'], $apidata);
+
+        if (!$user) {
+            $this->client_error('Not Found', 404, $apidata['content-type']);
+            return;
+        }
+
+        $page = $this->trimmed('page');
+
+        if (!$page || !is_numeric($page)) {
+            $page = 1;
+        }
+
+        $profile = $user->getProfile();
+
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
+
+        $sub = new Subscription();
+        $sub->$user_attr = $profile->id;
+
+        $since = strtotime($this->trimmed('since'));
+
+        if ($since) {
+            $d = date('Y-m-d H:i:s', $since);
+            $sub->whereAdd("created > '$d'");
+        }
+
+        $sub->orderBy('created DESC');
+        $sub->limit(($page-1)*100, 100);
+
+        $others = array();
+
+        if ($sub->find()) {
+            while ($sub->fetch()) {
+                $others[] = Profile::staticGet($sub->$other_attr);
+            }
+        } else {
+            // user has no followers
+        }
+
+        $type = $apidata['content-type'];
+
+        $this->init_document($type);
+        $this->show_profiles($others, $type);
+        $this->end_document($type);
+    }
+
+    function show_profiles($profiles, $type) {
+        switch ($type) {
+         case 'xml':
+            common_element_start('users', array('type' => 'array'));
+            foreach ($profiles as $profile) {
+                $this->show_profile($profile);
+            }
+            common_element_end('users');
+            break;
+         case 'json':
+            $arrays = array();
+            foreach ($profiles as $profile) {
+                $arrays[] = $this->twitter_user_array($profile, true);
+            }
+            print json_encode($arrays);
+            break;
+         default:
+            $this->client_error(_('unsupported file type'));
+        }
+    }
+
+    function featured($args, $apidata) {
+        parent::handle($args);
+        common_server_error(_('API method under construction.'), $code=501);
+    }
+
+    function supported($cmd) {
+
+        $cmdlist = array('MessageCommand', 'SubCommand', 'UnsubCommand', 'FavCommand', 'OnCommand', 'OffCommand');
 
-               if (in_array(get_class($cmd), $cmdlist)) {
-                       return true;
-               }
+        if (in_array(get_class($cmd), $cmdlist)) {
+            return true;
+        }
 
-               return false;
-       }
+        return false;
+    }
 
 }
index 9e06efa64286976a5600c262bb303f7cdb34e980..43f6969f4f52295fe517f0ac96fa393295d1389b 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,30 +23,30 @@ require_once(INSTALLDIR.'/lib/twitterapi.php');
 
 class TwitapiusersAction extends TwitterapiAction {
 
-       function show($args, $apidata) {
-               parent::handle($args);
+    function show($args, $apidata) {
+        parent::handle($args);
 
-               if (!in_array($apidata['content-type'], array('xml', 'json'))) {
-                       common_user_error(_('API method not found!'), $code = 404);
-                       return;
-               }
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            common_user_error(_('API method not found!'), $code = 404);
+            return;
+        }
 
-               $user = null;
-               $email = $this->arg('email');
+        $user = null;
+        $email = $this->arg('email');
 
-               if ($email) {
-                       $user = User::staticGet('email', $email);
-               } elseif (isset($apidata['api_arg'])) {
-                       $user = $this->get_user($apidata['api_arg']);
-               }
+        if ($email) {
+            $user = User::staticGet('email', $email);
+        } elseif (isset($apidata['api_arg'])) {
+            $user = $this->get_user($apidata['api_arg']);
+        }
 
-               if (!$user) {
-                       // XXX: Twitter returns a random(?) user instead of throwing and err! -- Zach
-                       $this->client_error(_('Not found.'), 404, $apidata['content-type']);
-                       return;
-               }
+        if (!$user) {
+            // XXX: Twitter returns a random(?) user instead of throwing and err! -- Zach
+            $this->client_error(_('Not found.'), 404, $apidata['content-type']);
+            return;
+        }
 
-               $this->show_extended_profile($user, $apidata);
-       }
+        $this->show_extended_profile($user, $apidata);
+    }
 
 }
index ae3aff877837c80809d5bcf51ff2b18d21cfa965..e300e699a3e84615826cd7e79361e5c34e5a72a4 100644 (file)
@@ -25,354 +25,354 @@ define('SUBSCRIPTIONS', 80);
 
 class TwittersettingsAction extends SettingsAction {
 
-       function get_instructions() {
-               return _('Add your Twitter account to automatically send your notices to Twitter, ' .
-                       'and subscribe to Twitter friends already here.');
-       }
+    function get_instructions() {
+        return _('Add your Twitter account to automatically send your notices to Twitter, ' .
+            'and subscribe to Twitter friends already here.');
+    }
 
-       function show_form($msg=NULL, $success=false) {
-               $user = common_current_user();
-               $profile = $user->getProfile();
-               $fuser = NULL;
-               $flink = Foreign_link::getByUserID($user->id, 1); // 1 == Twitter
+    function show_form($msg=NULL, $success=false) {
+        $user = common_current_user();
+        $profile = $user->getProfile();
+        $fuser = NULL;
+        $flink = Foreign_link::getByUserID($user->id, 1); // 1 == Twitter
 
-               if ($flink) {
-                       $fuser = $flink->getForeignUser();
-               }
+        if ($flink) {
+            $fuser = $flink->getForeignUser();
+        }
 
-               $this->form_header(_('Twitter settings'), $msg, $success);
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'twittersettings',
-                                                                                  'action' =>
-                                                                                  common_local_url('twittersettings')));
-               common_hidden('token', common_session_token());
+        $this->form_header(_('Twitter settings'), $msg, $success);
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'twittersettings',
+                                           'action' =>
+                                           common_local_url('twittersettings')));
+        common_hidden('token', common_session_token());
 
-               common_element('h2', NULL, _('Twitter Account'));
+        common_element('h2', NULL, _('Twitter Account'));
 
-               if ($fuser) {
-                       common_element_start('p');
+        if ($fuser) {
+            common_element_start('p');
 
-                       common_element('span', 'twitter_user', $fuser->nickname);
-                       common_element('a', array('href' => $fuser->uri),  $fuser->uri);
-                       common_element('span', 'input_instructions',
-                                      _('Current verified Twitter account.'));
-                       common_hidden('flink_foreign_id', $flink->foreign_id);
-                       common_element_end('p');
-                       common_submit('remove', _('Remove'));
-               } else {
-                       common_input('twitter_username', _('Twitter user name'),
-                                                ($this->arg('twitter_username')) ? $this->arg('twitter_username') : $profile->nickname,
-                                                _('No spaces, please.')); // hey, it's what Twitter says
+            common_element('span', 'twitter_user', $fuser->nickname);
+            common_element('a', array('href' => $fuser->uri),  $fuser->uri);
+            common_element('span', 'input_instructions',
+                           _('Current verified Twitter account.'));
+            common_hidden('flink_foreign_id', $flink->foreign_id);
+            common_element_end('p');
+            common_submit('remove', _('Remove'));
+        } else {
+            common_input('twitter_username', _('Twitter user name'),
+                         ($this->arg('twitter_username')) ? $this->arg('twitter_username') : $profile->nickname,
+                         _('No spaces, please.')); // hey, it's what Twitter says
 
-                       common_password('twitter_password', _('Twitter password'));
-               }
+            common_password('twitter_password', _('Twitter password'));
+        }
 
-               common_element('h2', NULL, _('Preferences'));
+        common_element('h2', NULL, _('Preferences'));
 
-               common_checkbox('noticesync', _('Automatically send my notices to Twitter.'),
-                                               ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND) : true);
+        common_checkbox('noticesync', _('Automatically send my notices to Twitter.'),
+                        ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND) : true);
 
-               common_checkbox('replysync', _('Send local "@" replies to Twitter.'),
-                                               ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true);
+        common_checkbox('replysync', _('Send local "@" replies to Twitter.'),
+                        ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true);
 
-               common_checkbox('friendsync', _('Subscribe to my Twitter friends here.'),
-                                               ($flink) ? ($flink->friendsync & FOREIGN_FRIEND_RECV) : false);
+        common_checkbox('friendsync', _('Subscribe to my Twitter friends here.'),
+                        ($flink) ? ($flink->friendsync & FOREIGN_FRIEND_RECV) : false);
 
-               if ($flink) {
-                       common_submit('save', _('Save'));
-               } else {
-                       common_submit('add', _('Add'));
-               }
+        if ($flink) {
+            common_submit('save', _('Save'));
+        } else {
+            common_submit('add', _('Add'));
+        }
 
-               $this->show_twitter_subscriptions();
+        $this->show_twitter_subscriptions();
 
-               common_element_end('form');
+        common_element_end('form');
 
-               common_show_footer();
-       }
+        common_show_footer();
+    }
 
-       function subscribed_twitter_users() {
+    function subscribed_twitter_users() {
 
-               $current_user = common_current_user();
+        $current_user = common_current_user();
 
-               $qry = 'SELECT user.* ' .
-                       'FROM subscription ' .
-                       'JOIN user ON subscription.subscribed = user.id ' .
-                       'JOIN foreign_link ON foreign_link.user_id = user.id ' .
-                       'WHERE subscriber = %d ' .
-                       'ORDER BY user.nickname';
+        $qry = 'SELECT user.* ' .
+            'FROM subscription ' .
+            'JOIN user ON subscription.subscribed = user.id ' .
+            'JOIN foreign_link ON foreign_link.user_id = user.id ' .
+            'WHERE subscriber = %d ' .
+            'ORDER BY user.nickname';
 
-               $user = new User();
+        $user = new User();
 
-               $user->query(sprintf($qry, $current_user->id));
-
-               $users = array();
+        $user->query(sprintf($qry, $current_user->id));
+
+        $users = array();
 
-               while ($user->fetch()) {
-
-                       // Don't include the user's own self-subscription
-                       if ($user->id != $current_user->id) {
-                               $users[] = clone($user);
-                       }
-               }
-
-               return $users;
-       }
-
-       function show_twitter_subscriptions() {
-
-               $friends = $this->subscribed_twitter_users();
-               $friends_count = count($friends);
-
-               if ($friends_count > 0) {
-
-                       common_element('h3', NULL, _('Twitter Friends'));
-                       common_element_start('div', array('id' => 'subscriptions'));
-                       common_element_start('ul', array('id' => 'subscriptions_avatars'));
-
-                       for ($i = 0; $i < min($friends_count, SUBSCRIPTIONS); $i++) {
-
-                               $other = Profile::staticGet($friends[$i]->id);
-
-                               if (!$other) {
-                                       common_log_db_error($subs, 'SELECT', __FILE__);
-                                       continue;
-                               }
-
-                               common_element_start('li');
-                               common_element_start('a', array('title' => ($other->fullname) ?
-                                                                                               $other->fullname :
-                                                                                               $other->nickname,
-                                                                                               'href' => $other->profileurl,
-                                                                                               'rel' => 'contact',
-                                                                                               'class' => 'subscription'));
-                               $avatar = $other->getAvatar(AVATAR_MINI_SIZE);
-                               common_element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
-                                                                                       'width' => AVATAR_MINI_SIZE,
-                                                                                       'height' => AVATAR_MINI_SIZE,
-                                                                                       'class' => 'avatar mini',
-                                                                                       'alt' =>  ($other->fullname) ?
-                                                                                       $other->fullname :
-                                                                                       $other->nickname));
-                               common_element_end('a');
-                               common_element_end('li');
-
-                       }
+        while ($user->fetch()) {
+
+            // Don't include the user's own self-subscription
+            if ($user->id != $current_user->id) {
+                $users[] = clone($user);
+            }
+        }
+
+        return $users;
+    }
+
+    function show_twitter_subscriptions() {
+
+        $friends = $this->subscribed_twitter_users();
+        $friends_count = count($friends);
+
+        if ($friends_count > 0) {
+
+            common_element('h3', NULL, _('Twitter Friends'));
+            common_element_start('div', array('id' => 'subscriptions'));
+            common_element_start('ul', array('id' => 'subscriptions_avatars'));
+
+            for ($i = 0; $i < min($friends_count, SUBSCRIPTIONS); $i++) {
+
+                $other = Profile::staticGet($friends[$i]->id);
+
+                if (!$other) {
+                    common_log_db_error($subs, 'SELECT', __FILE__);
+                    continue;
+                }
+
+                common_element_start('li');
+                common_element_start('a', array('title' => ($other->fullname) ?
+                                                $other->fullname :
+                                                $other->nickname,
+                                                'href' => $other->profileurl,
+                                                'rel' => 'contact',
+                                                'class' => 'subscription'));
+                $avatar = $other->getAvatar(AVATAR_MINI_SIZE);
+                common_element('img', array('src' => (($avatar) ? common_avatar_display_url($avatar) :  common_default_avatar(AVATAR_MINI_SIZE)),
+                                            'width' => AVATAR_MINI_SIZE,
+                                            'height' => AVATAR_MINI_SIZE,
+                                            'class' => 'avatar mini',
+                                            'alt' =>  ($other->fullname) ?
+                                            $other->fullname :
+                                            $other->nickname));
+                common_element_end('a');
+                common_element_end('li');
+
+            }
 
-                       common_element_end('ul');
-                       common_element_end('div');
+            common_element_end('ul');
+            common_element_end('div');
 
-               }
+        }
 
-               // XXX Figure out a way to show all Twitter friends... ?
+        // XXX Figure out a way to show all Twitter friends... ?
 
-               /*
-               if ($subs_count > SUBSCRIPTIONS) {
-                       common_element_start('p', array('id' => 'subscriptions_viewall'));
+        /*
+        if ($subs_count > SUBSCRIPTIONS) {
+            common_element_start('p', array('id' => 'subscriptions_viewall'));
 
-                       common_element('a', array('href' => common_local_url('subscriptions',
-                                                                                                                                array('nickname' => $profile->nickname)),
-                                                                         'class' => 'moresubscriptions'),
-                                                  _('All subscriptions'));
-                       common_element_end('p');
-               }
-               */
+            common_element('a', array('href' => common_local_url('subscriptions',
+                                                                 array('nickname' => $profile->nickname)),
+                                      'class' => 'moresubscriptions'),
+                           _('All subscriptions'));
+            common_element_end('p');
+        }
+        */
 
-       }
-
-       function handle_post() {
+    }
+
+    function handle_post() {
 
-               # CSRF protection
-               $token = $this->trimmed('token');
-               if (!$token || $token != common_session_token()) {
-                       $this->show_form(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
-
-               if ($this->arg('save')) {
-                       $this->save_preferences();
-               } else if ($this->arg('add')) {
-                       $this->add_twitter_acct();
-               } else if ($this->arg('remove')) {
-                       $this->remove_twitter_acct();
-               } else {
-                       $this->show_form(_('Unexpected form submission.'));
-               }
-       }
+        # CSRF protection
+        $token = $this->trimmed('token');
+        if (!$token || $token != common_session_token()) {
+            $this->show_form(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
+
+        if ($this->arg('save')) {
+            $this->save_preferences();
+        } else if ($this->arg('add')) {
+            $this->add_twitter_acct();
+        } else if ($this->arg('remove')) {
+            $this->remove_twitter_acct();
+        } else {
+            $this->show_form(_('Unexpected form submission.'));
+        }
+    }
 
-       function add_twitter_acct() {
+    function add_twitter_acct() {
 
-               $screen_name = $this->trimmed('twitter_username');
-               $password = $this->trimmed('twitter_password');
-               $noticesync = $this->boolean('noticesync');
-               $replysync = $this->boolean('replysync');
-               $friendsync = $this->boolean('friendsync');
-
-               if (!Validate::string($screen_name,
-                               array(  'min_length' => 1,
-                                               'max_length' => 15,
-                                               'format' => VALIDATE_NUM . VALIDATE_ALPHA . '_'))) {
-                       $this->show_form(
-                               _('Username must have only numbers, upper- and lowercase letters, and underscore (_). 15 chars max.'));
-                       return;
-               }
-
-               if (!$this->verify_credentials($screen_name, $password)) {
-                       $this->show_form(_('Could not verify your Twitter credentials!'));
-                       return;
-               }
-
-               $twit_user = twitter_user_info($screen_name, $password);
-
-               if (!$twit_user) {
-                       $this->show_form(sprintf(_('Unable to retrieve account information for "%s" from Twitter.'),
-                               $screen_name));
-                       return;
-               }
-
-               if (!save_twitter_user($twit_user->id, $screen_name)) {
-                       $this->show_form(_('Unable to save your Twitter settings!'));
-                       return;
-               }
-
-               $user = common_current_user();
-
-               $flink = DB_DataObject::factory('foreign_link');
-               $flink->user_id = $user->id;
-               $flink->foreign_id = $twit_user->id;
-               $flink->service = 1; // Twitter
-               $flink->credentials = $password;
-               $flink->created = common_sql_now();
-
-               $this->set_flags($flink, $noticesync, $replysync, $friendsync);
-
-               $flink_id = $flink->insert();
-
-               if (!$flink_id) {
-                       common_log_db_error($flink, 'INSERT', __FILE__);
-                       $this->show_form(_('Unable to save your Twitter settings!'));
-                       return;
-               }
+        $screen_name = $this->trimmed('twitter_username');
+        $password = $this->trimmed('twitter_password');
+        $noticesync = $this->boolean('noticesync');
+        $replysync = $this->boolean('replysync');
+        $friendsync = $this->boolean('friendsync');
+
+        if (!Validate::string($screen_name,
+                array(    'min_length' => 1,
+                        'max_length' => 15,
+                         'format' => VALIDATE_NUM . VALIDATE_ALPHA . '_'))) {
+            $this->show_form(
+                _('Username must have only numbers, upper- and lowercase letters, and underscore (_). 15 chars max.'));
+            return;
+        }
+
+        if (!$this->verify_credentials($screen_name, $password)) {
+            $this->show_form(_('Could not verify your Twitter credentials!'));
+            return;
+        }
+
+        $twit_user = twitter_user_info($screen_name, $password);
+
+        if (!$twit_user) {
+            $this->show_form(sprintf(_('Unable to retrieve account information for "%s" from Twitter.'),
+                $screen_name));
+            return;
+        }
+
+        if (!save_twitter_user($twit_user->id, $screen_name)) {
+            $this->show_form(_('Unable to save your Twitter settings!'));
+            return;
+        }
+
+        $user = common_current_user();
+
+        $flink = DB_DataObject::factory('foreign_link');
+        $flink->user_id = $user->id;
+        $flink->foreign_id = $twit_user->id;
+        $flink->service = 1; // Twitter
+        $flink->credentials = $password;
+        $flink->created = common_sql_now();
+
+        $this->set_flags($flink, $noticesync, $replysync, $friendsync);
+
+        $flink_id = $flink->insert();
+
+        if (!$flink_id) {
+            common_log_db_error($flink, 'INSERT', __FILE__);
+            $this->show_form(_('Unable to save your Twitter settings!'));
+            return;
+        }
 
-               if ($friendsync) {
-                       save_twitter_friends($user, $twit_user->id, $screen_name, $password);
-               }
+        if ($friendsync) {
+            save_twitter_friends($user, $twit_user->id, $screen_name, $password);
+        }
 
-               $this->show_form(_('Twitter settings saved.'), true);
-       }
+        $this->show_form(_('Twitter settings saved.'), true);
+    }
 
-       function remove_twitter_acct() {
-
-               $user = common_current_user();
-               $flink = Foreign_link::getByUserID($user->id, 1);
-               $flink_foreign_id = $this->arg('flink_foreign_id');
-
-               # Maybe an old tab open...?
-               if ($flink->foreign_id != $flink_foreign_id) {
-                   $this->show_form(_('That is not your Twitter account.'));
-                   return;
-               }
-
-               $result = $flink->delete();
-
-               if (!$result) {
-                       common_log_db_error($flink, 'DELETE', __FILE__);
-                       common_server_error(_('Couldn\'t remove Twitter user.'));
-                       return;
-               }
-
-               $this->show_form(_('Twitter account removed.'), TRUE);
-       }
-
-       function save_preferences() {
-
-               $noticesync = $this->boolean('noticesync');
-               $friendsync = $this->boolean('friendsync');
-               $replysync = $this->boolean('replysync');
-
-               $user = common_current_user();
-
-               $flink = Foreign_link::getByUserID($user->id, 1);
-
-               if (!$flink) {
-                       common_log_db_error($flink, 'SELECT', __FILE__);
-                       $this->show_form(_('Couldn\'t save Twitter preferences.'));
-                       return;
-               }
+    function remove_twitter_acct() {
+
+        $user = common_current_user();
+        $flink = Foreign_link::getByUserID($user->id, 1);
+        $flink_foreign_id = $this->arg('flink_foreign_id');
+
+        # Maybe an old tab open...?
+        if ($flink->foreign_id != $flink_foreign_id) {
+            $this->show_form(_('That is not your Twitter account.'));
+            return;
+        }
+
+        $result = $flink->delete();
+
+        if (!$result) {
+            common_log_db_error($flink, 'DELETE', __FILE__);
+            common_server_error(_('Couldn\'t remove Twitter user.'));
+            return;
+        }
+
+        $this->show_form(_('Twitter account removed.'), TRUE);
+    }
+
+    function save_preferences() {
+
+        $noticesync = $this->boolean('noticesync');
+        $friendsync = $this->boolean('friendsync');
+        $replysync = $this->boolean('replysync');
+
+        $user = common_current_user();
+
+        $flink = Foreign_link::getByUserID($user->id, 1);
+
+        if (!$flink) {
+            common_log_db_error($flink, 'SELECT', __FILE__);
+            $this->show_form(_('Couldn\'t save Twitter preferences.'));
+            return;
+        }
 
-               $twitter_id = $flink->foreign_id;
-               $password = $flink->credentials;
-
-               $fuser = $flink->getForeignUser();
+        $twitter_id = $flink->foreign_id;
+        $password = $flink->credentials;
+
+        $fuser = $flink->getForeignUser();
 
-               if (!$fuser) {
-                       common_log_db_error($fuser, 'SELECT', __FILE__);
-                       $this->show_form(_('Couldn\'t save Twitter preferences.'));
-                       return;
-               }
+        if (!$fuser) {
+            common_log_db_error($fuser, 'SELECT', __FILE__);
+            $this->show_form(_('Couldn\'t save Twitter preferences.'));
+            return;
+        }
 
-               $screen_name = $fuser->nickname;
+        $screen_name = $fuser->nickname;
 
-               $original = clone($flink);
-               $this->set_flags($flink, $noticesync, $replysync, $friendsync);
-               $result = $flink->update($original);
+        $original = clone($flink);
+        $this->set_flags($flink, $noticesync, $replysync, $friendsync);
+        $result = $flink->update($original);
 
-               if ($result === FALSE) {
-                       common_log_db_error($flink, 'UPDATE', __FILE__);
-                       $this->show_form(_('Couldn\'t save Twitter preferences.'));
-                       return;
-               }
+        if ($result === FALSE) {
+            common_log_db_error($flink, 'UPDATE', __FILE__);
+            $this->show_form(_('Couldn\'t save Twitter preferences.'));
+            return;
+        }
 
-               if ($friendsync) {
-                       save_twitter_friends($user, $flink->foreign_id, $screen_name, $password);
-               }
+        if ($friendsync) {
+            save_twitter_friends($user, $flink->foreign_id, $screen_name, $password);
+        }
 
-               $this->show_form(_('Twitter preferences saved.'));
-       }
+        $this->show_form(_('Twitter preferences saved.'));
+    }
 
-       function verify_credentials($screen_name, $password) {
-               $uri = 'http://twitter.com/account/verify_credentials.json';
-               $data = get_twitter_data($uri, $screen_name, $password);
+    function verify_credentials($screen_name, $password) {
+        $uri = 'http://twitter.com/account/verify_credentials.json';
+        $data = get_twitter_data($uri, $screen_name, $password);
 
-               if (!$data) {
-                       return false;
-               }
+        if (!$data) {
+            return false;
+        }
 
-               $user = json_decode($data);
+        $user = json_decode($data);
 
-               if (!$user) {
-                       return false;
-               }
+        if (!$user) {
+            return false;
+        }
 
-               $twitter_id = $user->status->id;
+         $twitter_id = $user->status->id;
 
-               if ($twitter_id) {
-                       return $twitter_id;
-               }
+        if ($twitter_id) {
+            return $twitter_id;
+        }
 
-               return false;
-       }
+        return false;
+    }
 
-       function set_flags(&$flink, $noticesync, $replysync, $friendsync) {
-               if ($noticesync) {
-                       $flink->noticesync |= FOREIGN_NOTICE_SEND;
-               } else {
-                       $flink->noticesync &= ~FOREIGN_NOTICE_SEND;
-               }
+    function set_flags(&$flink, $noticesync, $replysync, $friendsync) {
+        if ($noticesync) {
+            $flink->noticesync |= FOREIGN_NOTICE_SEND;
+        } else {
+            $flink->noticesync &= ~FOREIGN_NOTICE_SEND;
+        }
 
-               if ($replysync) {
-                       $flink->noticesync |= FOREIGN_NOTICE_SEND_REPLY;
-               } else {
-                       $flink->noticesync &= ~FOREIGN_NOTICE_SEND_REPLY;
-               }
+        if ($replysync) {
+            $flink->noticesync |= FOREIGN_NOTICE_SEND_REPLY;
+        } else {
+            $flink->noticesync &= ~FOREIGN_NOTICE_SEND_REPLY;
+        }
 
-               if ($friendsync) {
-                       $flink->friendsync |= FOREIGN_FRIEND_RECV;
-               } else {
-                       $flink->friendsync &= ~FOREIGN_FRIEND_RECV;
-               }
+        if ($friendsync) {
+            $flink->friendsync |= FOREIGN_FRIEND_RECV;
+        } else {
+            $flink->friendsync &= ~FOREIGN_FRIEND_RECV;
+        }
 
-               $flink->profilesync = 0;
-       }
+        $flink->profilesync = 0;
+    }
 
 }
\ No newline at end of file
index d60cc7088595de49380f17a09635b989f58b2815..6a86c2bf0f9a48e6662bd6c8e27251d83d33c413 100644 (file)
@@ -32,12 +32,12 @@ class UnblockAction extends Action {
             return false;
         }
 
-               $token = $this->trimmed('token');
+        $token = $this->trimmed('token');
 
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
         $id = $this->trimmed('unblockto');
 
index 98291e897ee198efeaf49b6cdcea811ca94ddc96..38fcc21dea0c2ae3ae30b294eb3a01227fde9d47 100644 (file)
 
 class UnsubscribeAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-                       return;
-               }
+    function handle($args) {
+        parent::handle($args);
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+            return;
+        }
 
-               $user = common_current_user();
+        $user = common_current_user();
 
-               if ($_SERVER['REQUEST_METHOD'] != 'POST') {
-                       common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname)));
-                       return;
-               }
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            common_redirect(common_local_url('subscriptions', array('nickname' => $user->nickname)));
+            return;
+        }
 
-               # CSRF protection
+        # CSRF protection
 
-               $token = $this->trimmed('token');
+        $token = $this->trimmed('token');
 
-               if (!$token || $token != common_session_token()) {
-                       $this->client_error(_('There was a problem with your session token. Try again, please.'));
-                       return;
-               }
+        if (!$token || $token != common_session_token()) {
+            $this->client_error(_('There was a problem with your session token. Try again, please.'));
+            return;
+        }
 
-               $other_id = $this->arg('unsubscribeto');
+        $other_id = $this->arg('unsubscribeto');
 
         if (!$other_id) {
             $this->client_error(_('No profile id in request.'));
@@ -56,25 +56,25 @@ class UnsubscribeAction extends Action {
             return;
         }
 
-               $result = subs_unsubscribe_to($user, $other);
+        $result = subs_unsubscribe_to($user, $other);
 
-               if ($result != true) {
-                       common_user_error($result);
-                       return;
-               }
+        if ($result != true) {
+            common_user_error($result);
+            return;
+        }
 
-               if ($this->boolean('ajax')) {
-                       common_start_html('text/xml;charset=utf-8', true);
-                       common_element_start('head');
-                       common_element('title', null, _('Unsubscribed'));
-                       common_element_end('head');
-                       common_element_start('body');
-                       common_subscribe_form($other);
-                       common_element_end('body');
-                       common_element_end('html');
-               } else {
-               common_redirect(common_local_url('subscriptions', array('nickname' =>
-                                                                                                                               $user->nickname)));
+        if ($this->boolean('ajax')) {
+            common_start_html('text/xml;charset=utf-8', true);
+            common_element_start('head');
+            common_element('title', null, _('Unsubscribed'));
+            common_element_end('head');
+            common_element_start('body');
+            common_subscribe_form($other);
+            common_element_end('body');
+            common_element_end('html');
+        } else {
+            common_redirect(common_local_url('subscriptions', array('nickname' =>
+                                                                    $user->nickname)));
         }
-       }
+    }
 }
index 921e88e635408f54aa51495aa0723a172beec632..4b4bb53a127006ddb40b958ebd2640aca3976f65 100644 (file)
@@ -22,153 +22,153 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/lib/omb.php');
 
 class UpdateprofileAction extends Action {
-       
-       function handle($args) {
-               parent::handle($args);
-               try {
-                       common_remove_magic_from_request();
-                       $req = OAuthRequest::from_request();
-                       # Note: server-to-server function!
-                       $server = omb_oauth_server();
-                       list($consumer, $token) = $server->verify_request($req);
-                       if ($this->update_profile($req, $consumer, $token)) {
-                               print "omb_version=".OMB_VERSION_01;
-                       }
-               } catch (OAuthException $e) {
-                       $this->server_error($e->getMessage());
-                       return;
-               }
-       }
+    
+    function handle($args) {
+        parent::handle($args);
+        try {
+            common_remove_magic_from_request();
+            $req = OAuthRequest::from_request();
+            # Note: server-to-server function!
+            $server = omb_oauth_server();
+            list($consumer, $token) = $server->verify_request($req);
+            if ($this->update_profile($req, $consumer, $token)) {
+                print "omb_version=".OMB_VERSION_01;
+            }
+        } catch (OAuthException $e) {
+            $this->server_error($e->getMessage());
+            return;
+        }
+    }
 
-       function update_profile($req, $consumer, $token) {
-               $version = $req->get_parameter('omb_version');
-               if ($version != OMB_VERSION_01) {
-                       $this->client_error(_('Unsupported OMB version'), 400);
-                       return false;
-               }
-               # First, check to see if listenee exists
-               $listenee =  $req->get_parameter('omb_listenee');
-               $remote = Remote_profile::staticGet('uri', $listenee);
-               if (!$remote) {
-                       $this->client_error(_('Profile unknown'), 404);
-                       return false;
-               }
-               # Second, check to see if they should be able to post updates!
-               # We see if there are any subscriptions to that remote user with
-               # the given token.
+    function update_profile($req, $consumer, $token) {
+        $version = $req->get_parameter('omb_version');
+        if ($version != OMB_VERSION_01) {
+            $this->client_error(_('Unsupported OMB version'), 400);
+            return false;
+        }
+        # First, check to see if listenee exists
+        $listenee =  $req->get_parameter('omb_listenee');
+        $remote = Remote_profile::staticGet('uri', $listenee);
+        if (!$remote) {
+            $this->client_error(_('Profile unknown'), 404);
+            return false;
+        }
+        # Second, check to see if they should be able to post updates!
+        # We see if there are any subscriptions to that remote user with
+        # the given token.
 
-               $sub = new Subscription();
-               $sub->subscribed = $remote->id;
-               $sub->token = $token->key;
-               if (!$sub->find(true)) {
-                       $this->client_error(_('You did not send us that profile'), 403);
-                       return false;
-               }
+        $sub = new Subscription();
+        $sub->subscribed = $remote->id;
+        $sub->token = $token->key;
+        if (!$sub->find(true)) {
+            $this->client_error(_('You did not send us that profile'), 403);
+            return false;
+        }
 
-               $profile = Profile::staticGet('id', $remote->id);
-               if (!$profile) {
-                       # This one is our fault
-                       $this->server_error(_('Remote profile with no matching profile'), 500);
-                       return false;
-               }
-               $nickname = $req->get_parameter('omb_listenee_nickname');
-               if ($nickname && !Validate::string($nickname, array('min_length' => 1,
-                                                                                                                       'max_length' => 64,
-                                                                                                                       'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
-                       $this->client_error(_('Nickname must have only lowercase letters and numbers and no spaces.'));
-                       return false;
-               }
-               $license = $req->get_parameter('omb_listenee_license');
-               if ($license && !common_valid_http_url($license)) {
-                       $this->client_error(sprintf(_("Invalid license URL '%s'"), $license));
-                       return false;
-               }
-               $profile_url = $req->get_parameter('omb_listenee_profile');
-               if ($profile_url && !common_valid_http_url($profile_url)) {
-                       $this->client_error(sprintf(_("Invalid profile URL '%s'."), $profile_url));
-                       return false;
-               }
-               # optional stuff
-               $fullname = $req->get_parameter('omb_listenee_fullname');
-               if ($fullname && strlen($fullname) > 255) {
-                       $this->client_error(_("Full name is too long (max 255 chars)."));
-                       return false;
-               }
-               $homepage = $req->get_parameter('omb_listenee_homepage');
-               if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) {
-                       $this->client_error(sprintf(_("Invalid homepage '%s'"), $homepage));
-                       return false;
-               }
-               $bio = $req->get_parameter('omb_listenee_bio');
-               if ($bio && strlen($bio) > 140) {
-                       $this->client_error(_("Bio is too long (max 140 chars)."));
-                       return false;
-               }
-               $location = $req->get_parameter('omb_listenee_location');
-               if ($location && strlen($location) > 255) {
-                       $this->client_error(_("Location is too long (max 255 chars)."));
-                       return false;
-               }
-               $avatar = $req->get_parameter('omb_listenee_avatar');
-               if ($avatar) {
-                       if (!common_valid_http_url($avatar) || strlen($avatar) > 255) {
-                               $this->client_error(sprintf(_("Invalid avatar URL '%s'"), $avatar));
-                               return false;
-                       }
-                       $size = @getimagesize($avatar);
-                       if (!$size) {
-                               $this->client_error(sprintf(_("Can't read avatar URL '%s'"), $avatar));
-                               return false;
-                       }
-                       if ($size[0] != AVATAR_PROFILE_SIZE || $size[1] != AVATAR_PROFILE_SIZE) {
-                               $this->client_error(sprintf(_("Wrong size image at '%s'"), $avatar));
-                               return false;
-                       }
-                       if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG,
-                                                                                 IMAGETYPE_PNG))) {
-                               $this->client_error(sprintf(_("Wrong image type for '%s'"), $avatar));
-                               return false;
-                       }
-               }
+        $profile = Profile::staticGet('id', $remote->id);
+        if (!$profile) {
+            # This one is our fault
+            $this->server_error(_('Remote profile with no matching profile'), 500);
+            return false;
+        }
+        $nickname = $req->get_parameter('omb_listenee_nickname');
+        if ($nickname && !Validate::string($nickname, array('min_length' => 1,
+                                                            'max_length' => 64,
+                                                            'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+            $this->client_error(_('Nickname must have only lowercase letters and numbers and no spaces.'));
+            return false;
+        }
+        $license = $req->get_parameter('omb_listenee_license');
+        if ($license && !common_valid_http_url($license)) {
+            $this->client_error(sprintf(_("Invalid license URL '%s'"), $license));
+            return false;
+        }
+        $profile_url = $req->get_parameter('omb_listenee_profile');
+        if ($profile_url && !common_valid_http_url($profile_url)) {
+            $this->client_error(sprintf(_("Invalid profile URL '%s'."), $profile_url));
+            return false;
+        }
+        # optional stuff
+        $fullname = $req->get_parameter('omb_listenee_fullname');
+        if ($fullname && strlen($fullname) > 255) {
+            $this->client_error(_("Full name is too long (max 255 chars)."));
+            return false;
+        }
+        $homepage = $req->get_parameter('omb_listenee_homepage');
+        if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) {
+            $this->client_error(sprintf(_("Invalid homepage '%s'"), $homepage));
+            return false;
+        }
+        $bio = $req->get_parameter('omb_listenee_bio');
+        if ($bio && strlen($bio) > 140) {
+            $this->client_error(_("Bio is too long (max 140 chars)."));
+            return false;
+        }
+        $location = $req->get_parameter('omb_listenee_location');
+        if ($location && strlen($location) > 255) {
+            $this->client_error(_("Location is too long (max 255 chars)."));
+            return false;
+        }
+        $avatar = $req->get_parameter('omb_listenee_avatar');
+        if ($avatar) {
+            if (!common_valid_http_url($avatar) || strlen($avatar) > 255) {
+                $this->client_error(sprintf(_("Invalid avatar URL '%s'"), $avatar));
+                return false;
+            }
+            $size = @getimagesize($avatar);
+            if (!$size) {
+                $this->client_error(sprintf(_("Can't read avatar URL '%s'"), $avatar));
+                return false;
+            }
+            if ($size[0] != AVATAR_PROFILE_SIZE || $size[1] != AVATAR_PROFILE_SIZE) {
+                $this->client_error(sprintf(_("Wrong size image at '%s'"), $avatar));
+                return false;
+            }
+            if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG,
+                                          IMAGETYPE_PNG))) {
+                $this->client_error(sprintf(_("Wrong image type for '%s'"), $avatar));
+                return false;
+            }
+        }
 
-               $orig_profile = clone($profile);
+        $orig_profile = clone($profile);
 
-               if ($nickname) {
-                       $profile->nickname = $nickname;
-               }
-               if ($profile_url) {
-                       $profile->profileurl = $profile_url;
-               }
-               if ($fullname) {
-                       $profile->fullname = $fullname;
-               }
-               if ($homepage) {
-                       $profile->homepage = $homepage;
-               }
-               if ($bio) {
-                       $profile->bio = $bio;
-               }
-               if ($location) {
-                       $profile->location = $location;
-               }
+        if ($nickname) {
+            $profile->nickname = $nickname;
+        }
+        if ($profile_url) {
+            $profile->profileurl = $profile_url;
+        }
+        if ($fullname) {
+            $profile->fullname = $fullname;
+        }
+        if ($homepage) {
+            $profile->homepage = $homepage;
+        }
+        if ($bio) {
+            $profile->bio = $bio;
+        }
+        if ($location) {
+            $profile->location = $location;
+        }
 
-               if (!$profile->update($orig_profile)) {
-                       $this->server_error(_('Could not save new profile info'), 500);
-                       return false;
-               } else {
-                       if ($avatar) {
-                               $temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar');
-                               copy($avatar, $temp_filename);
-                               if (!$profile->setOriginal($temp_filename)) {
-                                       $this->server_error(_('Could not save avatar info'), 500);
-                                       return false;
-                               }
-                       }
-                       header('HTTP/1.1 200 OK');
-                       header('Content-type: text/plain');
-                       print 'Updated profile';
-                       print "\n";
-                       return true;
-               }
-       }
+        if (!$profile->update($orig_profile)) {
+            $this->server_error(_('Could not save new profile info'), 500);
+            return false;
+        } else {
+            if ($avatar) {
+                $temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar');
+                copy($avatar, $temp_filename);
+                if (!$profile->setOriginal($temp_filename)) {
+                    $this->server_error(_('Could not save avatar info'), 500);
+                    return false;
+                }
+            }
+            header('HTTP/1.1 200 OK');
+            header('Content-type: text/plain');
+            print 'Updated profile';
+            print "\n";
+            return true;
+        }
+    }
 }
index ac0a0728cf29bec374f68ceede10408114aedebe..97809f197a6cb6d4e047257d39defeb3c9eb37d5 100644 (file)
@@ -24,556 +24,556 @@ define('TIMESTAMP_THRESHOLD', 300);
 
 class UserauthorizationAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-
-               if ($_SERVER['REQUEST_METHOD'] == 'POST') {
-                       # CSRF protection
-                       $token = $this->trimmed('token');
-                       if (!$token || $token != common_session_token()) {
-                               $req = $this->get_stored_request();
-                               $this->show_form(_('There was a problem with your session token. Try again, please.'), $req);
-                               return;
-                       }
-                       # We've shown the form, now post user's choice
-                       $this->send_authorization();
-               } else {
-                       if (!common_logged_in()) {
-                               # Go log in, and then come back
-                               common_debug('saving URL for returnto', __FILE__);
-                               common_set_returnto($_SERVER['REQUEST_URI']);
-
-                               common_debug('redirecting to login', __FILE__);
-                               common_redirect(common_local_url('login'));
-                               return;
-                       }
-                       try {
-                               # this must be a new request
-                               common_debug('getting new request', __FILE__);
-                               $req = $this->get_new_request();
-                               if (!$req) {
-                                       $this->client_error(_('No request found!'));
-                               }
-                               common_debug('validating request', __FILE__);
-                               # XXX: only validate new requests, since nonce is one-time use
-                               $this->validate_request($req);
-                               common_debug('showing form', __FILE__);
-                               $this->store_request($req);
-                               $this->show_form($req);
-                       } catch (OAuthException $e) {
-                               $this->clear_request();
-                               $this->client_error($e->getMessage());
-                               return;
-                       }
-
-               }
-       }
-
-       function show_form($req) {
-
-               $nickname = $req->get_parameter('omb_listenee_nickname');
-               $profile = $req->get_parameter('omb_listenee_profile');
-               $license = $req->get_parameter('omb_listenee_license');
-               $fullname = $req->get_parameter('omb_listenee_fullname');
-               $homepage = $req->get_parameter('omb_listenee_homepage');
-               $bio = $req->get_parameter('omb_listenee_bio');
-               $location = $req->get_parameter('omb_listenee_location');
-               $avatar = $req->get_parameter('omb_listenee_avatar');
-
-               common_show_header(_('Authorize subscription'));
-               common_element('p', NULL, _('Please check these details to make sure '.
-                                                                        'that you want to subscribe to this user\'s notices. '.
-                                                                        'If you didn\'t just ask to subscribe to someone\'s notices, '.
-                                                                        'click "Cancel".'));
-               common_element_start('div', 'profile');
-               if ($avatar) {
-                       common_element('img', array('src' => $avatar,
-                                                                               'class' => 'avatar profile',
-                                                                               'width' => AVATAR_PROFILE_SIZE,
-                                                                               'height' => AVATAR_PROFILE_SIZE,
-                                                                               'alt' => $nickname));
-               }
-               common_element('a', array('href' => $profile,
-                                                                 'class' => 'external profile nickname'),
-                                          $nickname);
-               if ($fullname) {
-                       common_element_start('div', 'fullname');
-                       if ($homepage) {
-                               common_element('a', array('href' => $homepage),
-                                                          $fullname);
-                       } else {
-                               common_text($fullname);
-                       }
-                       common_element_end('div');
-               }
-               if ($location) {
-                       common_element('div', 'location', $location);
-               }
-               if ($bio) {
-                       common_element('div', 'bio', $bio);
-               }
-               common_element_start('div', 'license');
-               common_element('a', array('href' => $license,
-                                                                 'class' => 'license'),
-                                          $license);
-               common_element_end('div');
-               common_element_end('div');
-               common_element_start('form', array('method' => 'post',
-                                                                                  'id' => 'userauthorization',
-                                                                                  'name' => 'userauthorization',
-                                                                                  'action' => common_local_url('userauthorization')));
-               common_hidden('token', common_session_token());
-               common_submit('accept', _('Accept'));
-               common_submit('reject', _('Reject'));
-               common_element_end('form');
-               common_show_footer();
-       }
-
-       function send_authorization() {
-               $req = $this->get_stored_request();
-
-               if (!$req) {
-                       common_user_error(_('No authorization request!'));
-                       return;
-               }
-
-               $callback = $req->get_parameter('oauth_callback');
-
-               if ($this->arg('accept')) {
-                       if (!$this->authorize_token($req)) {
-                               $this->client_error(_('Error authorizing token'));
-                       }
-                       if (!$this->save_remote_profile($req)) {
-                               $this->client_error(_('Error saving remote profile'));
-                       }
-                       if (!$callback) {
-                               $this->show_accept_message($req->get_parameter('oauth_token'));
-                       } else {
-                               $params = array();
-                               $params['oauth_token'] = $req->get_parameter('oauth_token');
-                               $params['omb_version'] = OMB_VERSION_01;
-                               $user = User::staticGet('uri', $req->get_parameter('omb_listener'));
-                               $profile = $user->getProfile();
-                               if (!$profile) {
-                                       common_log_db_error($user, 'SELECT', __FILE__);
-                                       $this->server_error(_('User without matching profile'));
-                                       return;
-                               }
-                               $params['omb_listener_nickname'] = $user->nickname;
-                               $params['omb_listener_profile'] = common_local_url('showstream',
-                                                                                                                                  array('nickname' => $user->nickname));
-                               if ($profile->fullname) {
-                                       $params['omb_listener_fullname'] = $profile->fullname;
-                               }
-                               if ($profile->homepage) {
-                                       $params['omb_listener_homepage'] = $profile->homepage;
-                               }
-                               if ($profile->bio) {
-                                       $params['omb_listener_bio'] = $profile->bio;
-                               }
-                               if ($profile->location) {
-                                       $params['omb_listener_location'] = $profile->location;
-                               }
-                               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-                               if ($avatar) {
-                                       $params['omb_listener_avatar'] = $avatar->url;
-                               }
-                               $parts = array();
-                               foreach ($params as $k => $v) {
-                                       $parts[] = $k . '=' . OAuthUtil::urlencodeRFC3986($v);
-                               }
-                               $query_string = implode('&', $parts);
-                               $parsed = parse_url($callback);
-                               $url = $callback . (($parsed['query']) ? '&' : '?') . $query_string;
-                               common_redirect($url, 303);
-                       }
-               } else {
-                       if (!$callback) {
-                               $this->show_reject_message();
-                       } else {
-                               # XXX: not 100% sure how to signal failure... just redirect without token?
-                               common_redirect($callback, 303);
-                       }
-               }
-       }
-
-       function authorize_token(&$req) {
-               $consumer_key = $req->get_parameter('oauth_consumer_key');
-               $token_field = $req->get_parameter('oauth_token');
-               common_debug('consumer key = "'.$consumer_key.'"', __FILE__);
-               common_debug('token field = "'.$token_field.'"', __FILE__);
-               $rt = new Token();
-               $rt->consumer_key = $consumer_key;
-               $rt->tok = $token_field;
-               $rt->type = 0;
-               $rt->state = 0;
-               common_debug('request token to look up: "'.print_r($rt,TRUE).'"');
-               if ($rt->find(true)) {
-                       common_debug('found request token to authorize', __FILE__);
-                       $orig_rt = clone($rt);
-                       $rt->state = 1; # Authorized but not used
-                       if ($rt->update($orig_rt)) {
-                               common_debug('updated request token so it is authorized', __FILE__);
-                               return true;
-                       }
-               }
-               return FALSE;
-       }
-
-       # XXX: refactor with similar code in finishremotesubscribe.php
-
-       function save_remote_profile(&$req) {
-               # FIXME: we should really do this when the consumer comes
-               # back for an access token. If they never do, we've got stuff in a
-               # weird state.
-
-               $nickname = $req->get_parameter('omb_listenee_nickname');
-               $fullname = $req->get_parameter('omb_listenee_fullname');
-               $profile_url = $req->get_parameter('omb_listenee_profile');
-               $homepage = $req->get_parameter('omb_listenee_homepage');
-               $bio = $req->get_parameter('omb_listenee_bio');
-               $location = $req->get_parameter('omb_listenee_location');
-               $avatar_url = $req->get_parameter('omb_listenee_avatar');
-
-               $listenee = $req->get_parameter('omb_listenee');
-               $remote = Remote_profile::staticGet('uri', $listenee);
-
-               if ($remote) {
-                       $exists = true;
-                       $profile = Profile::staticGet($remote->id);
-                       $orig_remote = clone($remote);
-                       $orig_profile = clone($profile);
-               } else {
-                       $exists = false;
-                       $remote = new Remote_profile();
-                       $remote->uri = $listenee;
-                       $profile = new Profile();
-               }
-
-               $profile->nickname = $nickname;
-               $profile->profileurl = $profile_url;
-
-               if ($fullname) {
-                       $profile->fullname = $fullname;
-               }
-               if ($homepage) {
-                       $profile->homepage = $homepage;
-               }
-               if ($bio) {
-                       $profile->bio = $bio;
-               }
-               if ($location) {
-                       $profile->location = $location;
-               }
-
-               if ($exists) {
-                       $profile->update($orig_profile);
-               } else {
-                       $profile->created = DB_DataObject_Cast::dateTime(); # current time
-                       $id = $profile->insert();
-                       if (!$id) {
-                               return FALSE;
-                       }
-                       $remote->id = $id;
-               }
-
-               if ($exists) {
-                       if (!$remote->update($orig_remote)) {
-                               return FALSE;
-                       }
-               } else {
-                       $remote->created = DB_DataObject_Cast::dateTime(); # current time
-                       if (!$remote->insert()) {
-                               return FALSE;
-                       }
-               }
-
-               if ($avatar_url) {
-                       if (!$this->add_avatar($profile, $avatar_url)) {
-                               return FALSE;
-                       }
-               }
-
-               $user = common_current_user();
-               $datastore = omb_oauth_datastore();
-               $consumer = $this->get_consumer($datastore, $req);
-               $token = $this->get_token($datastore, $req, $consumer);
-
-               $sub = new Subscription();
-               $sub->subscriber = $user->id;
-               $sub->subscribed = $remote->id;
-               $sub->token = $token->key; # NOTE: request token, not valid for use!
-               $sub->created = DB_DataObject_Cast::dateTime(); # current time
-
-               if (!$sub->insert()) {
-                       return FALSE;
-               }
-
-               return TRUE;
-       }
-
-       function add_avatar($profile, $url) {
-               $temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar');
-               copy($url, $temp_filename);
-               return $profile->setOriginal($temp_filename);
-       }
-
-       function show_accept_message($tok) {
-               common_show_header(_('Subscription authorized'));
-               common_element('p', NULL,
-                                          _('The subscription has been authorized, but no '.
-                                                 'callback URL was passed. Check with the site\'s instructions for '.
-                                                 'details on how to authorize the subscription. Your subscription token is:'));
-               common_element('blockquote', 'token', $tok);
-               common_show_footer();
-       }
-
-       function show_reject_message($tok) {
-               common_show_header(_('Subscription rejected'));
-               common_element('p', NULL,
-                                          _('The subscription has been rejected, but no '.
-                                                 'callback URL was passed. Check with the site\'s instructions for '.
-                                                 'details on how to fully reject the subscription.'));
-               common_show_footer();
-       }
-
-       function store_request($req) {
-               common_ensure_session();
-               $_SESSION['userauthorizationrequest'] = $req;
-       }
-
-       function clear_request() {
-               common_ensure_session();
-               unset($_SESSION['userauthorizationrequest']);
-       }
-
-       function get_stored_request() {
-               common_ensure_session();
-               $req = $_SESSION['userauthorizationrequest'];
-               return $req;
-       }
-
-       function get_new_request() {
-               common_remove_magic_from_request();
-               $req = OAuthRequest::from_request();
-               return $req;
-       }
-
-       # Throws an OAuthException if anything goes wrong
-
-       function validate_request(&$req) {
-               # OAuth stuff -- have to copy from OAuth.php since they're
-               # all private methods, and there's no user-authentication method
-               common_debug('checking version', __FILE__);
-               $this->check_version($req);
-               common_debug('getting datastore', __FILE__);
-               $datastore = omb_oauth_datastore();
-               common_debug('getting consumer', __FILE__);
-               $consumer = $this->get_consumer($datastore, $req);
-               common_debug('getting token', __FILE__);
-               $token = $this->get_token($datastore, $req, $consumer);
-               common_debug('checking timestamp', __FILE__);
-               $this->check_timestamp($req);
-               common_debug('checking nonce', __FILE__);
-               $this->check_nonce($datastore, $req, $consumer, $token);
-               common_debug('checking signature', __FILE__);
-               $this->check_signature($req, $consumer, $token);
-               common_debug('validating omb stuff', __FILE__);
-               $this->validate_omb($req);
-               common_debug('done validating', __FILE__);
-               return true;
-       }
-
-       function validate_omb(&$req) {
-               foreach (array('omb_version', 'omb_listener', 'omb_listenee',
-                                          'omb_listenee_profile', 'omb_listenee_nickname',
-                                          'omb_listenee_license') as $param)
-               {
-                       if (!$req->get_parameter($param)) {
-                               throw new OAuthException("Required parameter '$param' not found");
-                       }
-               }
-               # Now, OMB stuff
-               $version = $req->get_parameter('omb_version');
-               if ($version != OMB_VERSION_01) {
-                       throw new OAuthException("OpenMicroBlogging version '$version' not supported");
-               }
-               $listener =     $req->get_parameter('omb_listener');
-               $user = User::staticGet('uri', $listener);
-               if (!$user) {
-                       throw new OAuthException("Listener URI '$listener' not found here");
-               }
-               $cur = common_current_user();
-               if ($cur->id != $user->id) {
-                       throw new OAuthException("Can't add for another user!");
-               }
-               $listenee = $req->get_parameter('omb_listenee');
-               if (!Validate::uri($listenee) &&
-                       !common_valid_tag($listenee)) {
-                       throw new OAuthException("Listenee URI '$listenee' not a recognizable URI");
-               }
-               if (strlen($listenee) > 255) {
-                       throw new OAuthException("Listenee URI '$listenee' too long");
-               }
-
-               $other = User::staticGet('uri', $listenee);
-               if ($other) {
-                       throw new OAuthException("Listenee URI '$listenee' is local user");
-               }
-
-               $remote = Remote_profile::staticGet('uri', $listenee);
-               if ($remote) {
-                       $sub = new Subscription();
-                       $sub->subscriber = $user->id;
-                       $sub->subscribed = $remote->id;
-                       if ($sub->find(TRUE)) {
-                               throw new OAuthException("Already subscribed to user!");
-                       }
-               }
-               $nickname = $req->get_parameter('omb_listenee_nickname');
-               if (!Validate::string($nickname, array('min_length' => 1,
-                                                                                          'max_length' => 64,
-                                                                                          'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
-                       throw new OAuthException('Nickname must have only letters and numbers and no spaces.');
-               }
-               $profile = $req->get_parameter('omb_listenee_profile');
-               if (!common_valid_http_url($profile)) {
-                       throw new OAuthException("Invalid profile URL '$profile'.");
-               }
-
-               if ($profile == common_local_url('showstream', array('nickname' => $nickname))) {
-                       throw new OAuthException("Profile URL '$profile' is for a local user.");
-               }
-
-               $license = $req->get_parameter('omb_listenee_license');
-               if (!common_valid_http_url($license)) {
-                       throw new OAuthException("Invalid license URL '$license'.");
-               }
-               $site_license = common_config('license', 'url');
-               if (!common_compatible_license($license, $site_license)) {
-                       throw new OAuthException("Listenee stream license '$license' not compatible with site license '$site_license'.");
-               }
-               # optional stuff
-               $fullname = $req->get_parameter('omb_listenee_fullname');
-               if ($fullname && strlen($fullname) > 255) {
-                       throw new OAuthException("Full name '$fullname' too long.");
-               }
-               $homepage = $req->get_parameter('omb_listenee_homepage');
-               if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) {
-                       throw new OAuthException("Invalid homepage '$homepage'");
-               }
-               $bio = $req->get_parameter('omb_listenee_bio');
-               if ($bio && strlen($bio) > 140) {
-                       throw new OAuthException("Bio too long '$bio'");
-               }
-               $location = $req->get_parameter('omb_listenee_location');
-               if ($location && strlen($location) > 255) {
-                       throw new OAuthException("Location too long '$location'");
-               }
-               $avatar = $req->get_parameter('omb_listenee_avatar');
-               if ($avatar) {
-                       if (!common_valid_http_url($avatar) || strlen($avatar) > 255) {
-                               throw new OAuthException("Invalid avatar URL '$avatar'");
-                       }
-                       $size = @getimagesize($avatar);
-                       if (!$size) {
-                               throw new OAuthException("Can't read avatar URL '$avatar'");
-                       }
-                       if ($size[0] != AVATAR_PROFILE_SIZE || $size[1] != AVATAR_PROFILE_SIZE) {
-                               throw new OAuthException("Wrong size image at '$avatar'");
-                       }
-                       if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG,
-                                                                                 IMAGETYPE_PNG))) {
-                               throw new OAuthException("Wrong image type for '$avatar'");
-                       }
-               }
-               $callback = $req->get_parameter('oauth_callback');
-               if ($callback && !common_valid_http_url($callback)) {
-                       throw new OAuthException("Invalid callback URL '$callback'");
-               }
-               if ($callback && $callback == common_local_url('finishremotesubscribe')) {
-                       throw new OAuthException("Callback URL '$callback' is for local site.");
-               }
-       }
-
-       # Snagged from OAuthServer
-
-       function check_version(&$req) {
-               $version = $req->get_parameter("oauth_version");
-               if (!$version) {
-                       $version = 1.0;
-               }
-               if ($version != 1.0) {
-                       throw new OAuthException("OAuth version '$version' not supported");
-               }
-               return $version;
-       }
-
-       # Snagged from OAuthServer
-
-       function get_consumer($datastore, $req) {
-               $consumer_key = @$req->get_parameter("oauth_consumer_key");
-               if (!$consumer_key) {
-                       throw new OAuthException("Invalid consumer key");
-               }
-
-               $consumer = $datastore->lookup_consumer($consumer_key);
-               if (!$consumer) {
-                       throw new OAuthException("Invalid consumer");
-               }
-               return $consumer;
-       }
-
-       # Mostly cadged from OAuthServer
-
-       function get_token($datastore, &$req, $consumer) {/*{{{*/
-               $token_field = @$req->get_parameter('oauth_token');
-               $token = $datastore->lookup_token($consumer, 'request', $token_field);
-               if (!$token) {
-                       throw new OAuthException("Invalid $token_type token: $token_field");
-               }
-               return $token;
-       }
-
-       function check_timestamp(&$req) {
-               $timestamp = @$req->get_parameter('oauth_timestamp');
-               $now = time();
-               if ($now - $timestamp > TIMESTAMP_THRESHOLD) {
-                       throw new OAuthException("Expired timestamp, yours $timestamp, ours $now");
-               }
-       }
-
-       # NOTE: don't call twice on the same request; will fail!
-       function check_nonce(&$datastore, &$req, $consumer, $token) {
-               $timestamp = @$req->get_parameter('oauth_timestamp');
-               $nonce = @$req->get_parameter('oauth_nonce');
-               $found = $datastore->lookup_nonce($consumer, $token, $nonce, $timestamp);
-               if ($found) {
-                       throw new OAuthException("Nonce already used");
-               }
-               return true;
-       }
-
-       function check_signature(&$req, $consumer, $token) {
-               $signature_method = $this->get_signature_method($req);
-               $signature = $req->get_parameter('oauth_signature');
-               $valid_sig = $signature_method->check_signature($req,
-                                                                                                               $consumer,
-                                                                                                               $token,
-                                                                                                               $signature);
-               if (!$valid_sig) {
-                       throw new OAuthException("Invalid signature");
-               }
-       }
-
-       function get_signature_method(&$req) {
-               $signature_method = @$req->get_parameter("oauth_signature_method");
-               if (!$signature_method) {
-                       $signature_method = "PLAINTEXT";
-               }
-               if ($signature_method != 'HMAC-SHA1') {
-                       throw new OAuthException("Signature method '$signature_method' not supported.");
-               }
-               return omb_hmac_sha1();
-       }
+    function handle($args) {
+        parent::handle($args);
+
+        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
+            # CSRF protection
+            $token = $this->trimmed('token');
+            if (!$token || $token != common_session_token()) {
+                $req = $this->get_stored_request();
+                $this->show_form(_('There was a problem with your session token. Try again, please.'), $req);
+                return;
+            }
+            # We've shown the form, now post user's choice
+            $this->send_authorization();
+        } else {
+            if (!common_logged_in()) {
+                # Go log in, and then come back
+                common_debug('saving URL for returnto', __FILE__);
+                common_set_returnto($_SERVER['REQUEST_URI']);
+
+                common_debug('redirecting to login', __FILE__);
+                common_redirect(common_local_url('login'));
+                return;
+            }
+            try {
+                # this must be a new request
+                common_debug('getting new request', __FILE__);
+                $req = $this->get_new_request();
+                if (!$req) {
+                    $this->client_error(_('No request found!'));
+                }
+                common_debug('validating request', __FILE__);
+                # XXX: only validate new requests, since nonce is one-time use
+                $this->validate_request($req);
+                common_debug('showing form', __FILE__);
+                $this->store_request($req);
+                $this->show_form($req);
+            } catch (OAuthException $e) {
+                $this->clear_request();
+                $this->client_error($e->getMessage());
+                return;
+            }
+
+        }
+    }
+
+    function show_form($req) {
+
+        $nickname = $req->get_parameter('omb_listenee_nickname');
+        $profile = $req->get_parameter('omb_listenee_profile');
+        $license = $req->get_parameter('omb_listenee_license');
+        $fullname = $req->get_parameter('omb_listenee_fullname');
+        $homepage = $req->get_parameter('omb_listenee_homepage');
+        $bio = $req->get_parameter('omb_listenee_bio');
+        $location = $req->get_parameter('omb_listenee_location');
+        $avatar = $req->get_parameter('omb_listenee_avatar');
+
+        common_show_header(_('Authorize subscription'));
+        common_element('p', NULL, _('Please check these details to make sure '.
+                                     'that you want to subscribe to this user\'s notices. '.
+                                     'If you didn\'t just ask to subscribe to someone\'s notices, '.
+                                     'click "Cancel".'));
+        common_element_start('div', 'profile');
+        if ($avatar) {
+            common_element('img', array('src' => $avatar,
+                                        'class' => 'avatar profile',
+                                        'width' => AVATAR_PROFILE_SIZE,
+                                        'height' => AVATAR_PROFILE_SIZE,
+                                        'alt' => $nickname));
+        }
+        common_element('a', array('href' => $profile,
+                                  'class' => 'external profile nickname'),
+                       $nickname);
+        if ($fullname) {
+            common_element_start('div', 'fullname');
+            if ($homepage) {
+                common_element('a', array('href' => $homepage),
+                               $fullname);
+            } else {
+                common_text($fullname);
+            }
+            common_element_end('div');
+        }
+        if ($location) {
+            common_element('div', 'location', $location);
+        }
+        if ($bio) {
+            common_element('div', 'bio', $bio);
+        }
+        common_element_start('div', 'license');
+        common_element('a', array('href' => $license,
+                                  'class' => 'license'),
+                       $license);
+        common_element_end('div');
+        common_element_end('div');
+        common_element_start('form', array('method' => 'post',
+                                           'id' => 'userauthorization',
+                                           'name' => 'userauthorization',
+                                           'action' => common_local_url('userauthorization')));
+        common_hidden('token', common_session_token());
+        common_submit('accept', _('Accept'));
+        common_submit('reject', _('Reject'));
+        common_element_end('form');
+        common_show_footer();
+    }
+
+    function send_authorization() {
+        $req = $this->get_stored_request();
+
+        if (!$req) {
+            common_user_error(_('No authorization request!'));
+            return;
+        }
+
+        $callback = $req->get_parameter('oauth_callback');
+
+        if ($this->arg('accept')) {
+            if (!$this->authorize_token($req)) {
+                $this->client_error(_('Error authorizing token'));
+            }
+            if (!$this->save_remote_profile($req)) {
+                $this->client_error(_('Error saving remote profile'));
+            }
+            if (!$callback) {
+                $this->show_accept_message($req->get_parameter('oauth_token'));
+            } else {
+                $params = array();
+                $params['oauth_token'] = $req->get_parameter('oauth_token');
+                $params['omb_version'] = OMB_VERSION_01;
+                $user = User::staticGet('uri', $req->get_parameter('omb_listener'));
+                $profile = $user->getProfile();
+                if (!$profile) {
+                    common_log_db_error($user, 'SELECT', __FILE__);
+                    $this->server_error(_('User without matching profile'));
+                    return;
+                }
+                $params['omb_listener_nickname'] = $user->nickname;
+                $params['omb_listener_profile'] = common_local_url('showstream',
+                                                                   array('nickname' => $user->nickname));
+                if ($profile->fullname) {
+                    $params['omb_listener_fullname'] = $profile->fullname;
+                }
+                if ($profile->homepage) {
+                    $params['omb_listener_homepage'] = $profile->homepage;
+                }
+                if ($profile->bio) {
+                    $params['omb_listener_bio'] = $profile->bio;
+                }
+                if ($profile->location) {
+                    $params['omb_listener_location'] = $profile->location;
+                }
+                $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+                if ($avatar) {
+                    $params['omb_listener_avatar'] = $avatar->url;
+                }
+                $parts = array();
+                foreach ($params as $k => $v) {
+                    $parts[] = $k . '=' . OAuthUtil::urlencodeRFC3986($v);
+                }
+                $query_string = implode('&', $parts);
+                $parsed = parse_url($callback);
+                $url = $callback . (($parsed['query']) ? '&' : '?') . $query_string;
+                common_redirect($url, 303);
+            }
+        } else {
+            if (!$callback) {
+                $this->show_reject_message();
+            } else {
+                # XXX: not 100% sure how to signal failure... just redirect without token?
+                common_redirect($callback, 303);
+            }
+        }
+    }
+
+    function authorize_token(&$req) {
+        $consumer_key = $req->get_parameter('oauth_consumer_key');
+        $token_field = $req->get_parameter('oauth_token');
+        common_debug('consumer key = "'.$consumer_key.'"', __FILE__);
+        common_debug('token field = "'.$token_field.'"', __FILE__);
+        $rt = new Token();
+        $rt->consumer_key = $consumer_key;
+        $rt->tok = $token_field;
+        $rt->type = 0;
+        $rt->state = 0;
+        common_debug('request token to look up: "'.print_r($rt,TRUE).'"');
+        if ($rt->find(true)) {
+            common_debug('found request token to authorize', __FILE__);
+            $orig_rt = clone($rt);
+            $rt->state = 1; # Authorized but not used
+            if ($rt->update($orig_rt)) {
+                common_debug('updated request token so it is authorized', __FILE__);
+                return true;
+            }
+        }
+        return FALSE;
+    }
+
+    # XXX: refactor with similar code in finishremotesubscribe.php
+
+    function save_remote_profile(&$req) {
+        # FIXME: we should really do this when the consumer comes
+        # back for an access token. If they never do, we've got stuff in a
+        # weird state.
+
+        $nickname = $req->get_parameter('omb_listenee_nickname');
+        $fullname = $req->get_parameter('omb_listenee_fullname');
+        $profile_url = $req->get_parameter('omb_listenee_profile');
+        $homepage = $req->get_parameter('omb_listenee_homepage');
+        $bio = $req->get_parameter('omb_listenee_bio');
+        $location = $req->get_parameter('omb_listenee_location');
+        $avatar_url = $req->get_parameter('omb_listenee_avatar');
+
+        $listenee = $req->get_parameter('omb_listenee');
+        $remote = Remote_profile::staticGet('uri', $listenee);
+
+        if ($remote) {
+            $exists = true;
+            $profile = Profile::staticGet($remote->id);
+            $orig_remote = clone($remote);
+            $orig_profile = clone($profile);
+        } else {
+            $exists = false;
+            $remote = new Remote_profile();
+            $remote->uri = $listenee;
+            $profile = new Profile();
+        }
+
+        $profile->nickname = $nickname;
+        $profile->profileurl = $profile_url;
+
+        if ($fullname) {
+            $profile->fullname = $fullname;
+        }
+        if ($homepage) {
+            $profile->homepage = $homepage;
+        }
+        if ($bio) {
+            $profile->bio = $bio;
+        }
+        if ($location) {
+            $profile->location = $location;
+        }
+
+        if ($exists) {
+            $profile->update($orig_profile);
+        } else {
+            $profile->created = DB_DataObject_Cast::dateTime(); # current time
+            $id = $profile->insert();
+            if (!$id) {
+                return FALSE;
+            }
+            $remote->id = $id;
+        }
+
+        if ($exists) {
+            if (!$remote->update($orig_remote)) {
+                return FALSE;
+            }
+        } else {
+            $remote->created = DB_DataObject_Cast::dateTime(); # current time
+            if (!$remote->insert()) {
+                return FALSE;
+            }
+        }
+
+        if ($avatar_url) {
+            if (!$this->add_avatar($profile, $avatar_url)) {
+                return FALSE;
+            }
+        }
+
+        $user = common_current_user();
+        $datastore = omb_oauth_datastore();
+        $consumer = $this->get_consumer($datastore, $req);
+        $token = $this->get_token($datastore, $req, $consumer);
+
+        $sub = new Subscription();
+        $sub->subscriber = $user->id;
+        $sub->subscribed = $remote->id;
+        $sub->token = $token->key; # NOTE: request token, not valid for use!
+        $sub->created = DB_DataObject_Cast::dateTime(); # current time
+
+        if (!$sub->insert()) {
+            return FALSE;
+        }
+
+        return TRUE;
+    }
+
+    function add_avatar($profile, $url) {
+        $temp_filename = tempnam(sys_get_temp_dir(), 'listenee_avatar');
+        copy($url, $temp_filename);
+        return $profile->setOriginal($temp_filename);
+    }
+
+    function show_accept_message($tok) {
+        common_show_header(_('Subscription authorized'));
+        common_element('p', NULL,
+                       _('The subscription has been authorized, but no '.
+                          'callback URL was passed. Check with the site\'s instructions for '.
+                          'details on how to authorize the subscription. Your subscription token is:'));
+        common_element('blockquote', 'token', $tok);
+        common_show_footer();
+    }
+
+    function show_reject_message($tok) {
+        common_show_header(_('Subscription rejected'));
+        common_element('p', NULL,
+                       _('The subscription has been rejected, but no '.
+                          'callback URL was passed. Check with the site\'s instructions for '.
+                          'details on how to fully reject the subscription.'));
+        common_show_footer();
+    }
+
+    function store_request($req) {
+        common_ensure_session();
+        $_SESSION['userauthorizationrequest'] = $req;
+    }
+
+    function clear_request() {
+        common_ensure_session();
+        unset($_SESSION['userauthorizationrequest']);
+    }
+
+    function get_stored_request() {
+        common_ensure_session();
+        $req = $_SESSION['userauthorizationrequest'];
+        return $req;
+    }
+
+    function get_new_request() {
+        common_remove_magic_from_request();
+        $req = OAuthRequest::from_request();
+        return $req;
+    }
+
+    # Throws an OAuthException if anything goes wrong
+
+    function validate_request(&$req) {
+        # OAuth stuff -- have to copy from OAuth.php since they're
+        # all private methods, and there's no user-authentication method
+        common_debug('checking version', __FILE__);
+        $this->check_version($req);
+        common_debug('getting datastore', __FILE__);
+        $datastore = omb_oauth_datastore();
+        common_debug('getting consumer', __FILE__);
+        $consumer = $this->get_consumer($datastore, $req);
+        common_debug('getting token', __FILE__);
+        $token = $this->get_token($datastore, $req, $consumer);
+        common_debug('checking timestamp', __FILE__);
+        $this->check_timestamp($req);
+        common_debug('checking nonce', __FILE__);
+        $this->check_nonce($datastore, $req, $consumer, $token);
+        common_debug('checking signature', __FILE__);
+        $this->check_signature($req, $consumer, $token);
+        common_debug('validating omb stuff', __FILE__);
+        $this->validate_omb($req);
+        common_debug('done validating', __FILE__);
+        return true;
+    }
+
+    function validate_omb(&$req) {
+        foreach (array('omb_version', 'omb_listener', 'omb_listenee',
+                       'omb_listenee_profile', 'omb_listenee_nickname',
+                       'omb_listenee_license') as $param)
+        {
+            if (!$req->get_parameter($param)) {
+                throw new OAuthException("Required parameter '$param' not found");
+            }
+        }
+        # Now, OMB stuff
+        $version = $req->get_parameter('omb_version');
+        if ($version != OMB_VERSION_01) {
+            throw new OAuthException("OpenMicroBlogging version '$version' not supported");
+        }
+        $listener =    $req->get_parameter('omb_listener');
+        $user = User::staticGet('uri', $listener);
+        if (!$user) {
+            throw new OAuthException("Listener URI '$listener' not found here");
+        }
+        $cur = common_current_user();
+        if ($cur->id != $user->id) {
+            throw new OAuthException("Can't add for another user!");
+        }
+        $listenee = $req->get_parameter('omb_listenee');
+        if (!Validate::uri($listenee) &&
+            !common_valid_tag($listenee)) {
+            throw new OAuthException("Listenee URI '$listenee' not a recognizable URI");
+        }
+        if (strlen($listenee) > 255) {
+            throw new OAuthException("Listenee URI '$listenee' too long");
+        }
+
+        $other = User::staticGet('uri', $listenee);
+        if ($other) {
+            throw new OAuthException("Listenee URI '$listenee' is local user");
+        }
+
+        $remote = Remote_profile::staticGet('uri', $listenee);
+        if ($remote) {
+            $sub = new Subscription();
+            $sub->subscriber = $user->id;
+            $sub->subscribed = $remote->id;
+            if ($sub->find(TRUE)) {
+                throw new OAuthException("Already subscribed to user!");
+            }
+        }
+        $nickname = $req->get_parameter('omb_listenee_nickname');
+        if (!Validate::string($nickname, array('min_length' => 1,
+                                               'max_length' => 64,
+                                               'format' => VALIDATE_NUM . VALIDATE_ALPHA_LOWER))) {
+            throw new OAuthException('Nickname must have only letters and numbers and no spaces.');
+        }
+        $profile = $req->get_parameter('omb_listenee_profile');
+        if (!common_valid_http_url($profile)) {
+            throw new OAuthException("Invalid profile URL '$profile'.");
+        }
+
+        if ($profile == common_local_url('showstream', array('nickname' => $nickname))) {
+            throw new OAuthException("Profile URL '$profile' is for a local user.");
+        }
+
+        $license = $req->get_parameter('omb_listenee_license');
+        if (!common_valid_http_url($license)) {
+            throw new OAuthException("Invalid license URL '$license'.");
+        }
+        $site_license = common_config('license', 'url');
+        if (!common_compatible_license($license, $site_license)) {
+            throw new OAuthException("Listenee stream license '$license' not compatible with site license '$site_license'.");
+        }
+        # optional stuff
+        $fullname = $req->get_parameter('omb_listenee_fullname');
+        if ($fullname && strlen($fullname) > 255) {
+            throw new OAuthException("Full name '$fullname' too long.");
+        }
+        $homepage = $req->get_parameter('omb_listenee_homepage');
+        if ($homepage && (!common_valid_http_url($homepage) || strlen($homepage) > 255)) {
+            throw new OAuthException("Invalid homepage '$homepage'");
+        }
+        $bio = $req->get_parameter('omb_listenee_bio');
+        if ($bio && strlen($bio) > 140) {
+            throw new OAuthException("Bio too long '$bio'");
+        }
+        $location = $req->get_parameter('omb_listenee_location');
+        if ($location && strlen($location) > 255) {
+            throw new OAuthException("Location too long '$location'");
+        }
+        $avatar = $req->get_parameter('omb_listenee_avatar');
+        if ($avatar) {
+            if (!common_valid_http_url($avatar) || strlen($avatar) > 255) {
+                throw new OAuthException("Invalid avatar URL '$avatar'");
+            }
+            $size = @getimagesize($avatar);
+            if (!$size) {
+                throw new OAuthException("Can't read avatar URL '$avatar'");
+            }
+            if ($size[0] != AVATAR_PROFILE_SIZE || $size[1] != AVATAR_PROFILE_SIZE) {
+                throw new OAuthException("Wrong size image at '$avatar'");
+            }
+            if (!in_array($size[2], array(IMAGETYPE_GIF, IMAGETYPE_JPEG,
+                                          IMAGETYPE_PNG))) {
+                throw new OAuthException("Wrong image type for '$avatar'");
+            }
+        }
+        $callback = $req->get_parameter('oauth_callback');
+        if ($callback && !common_valid_http_url($callback)) {
+            throw new OAuthException("Invalid callback URL '$callback'");
+        }
+        if ($callback && $callback == common_local_url('finishremotesubscribe')) {
+            throw new OAuthException("Callback URL '$callback' is for local site.");
+        }
+    }
+
+    # Snagged from OAuthServer
+
+    function check_version(&$req) {
+        $version = $req->get_parameter("oauth_version");
+        if (!$version) {
+            $version = 1.0;
+        }
+        if ($version != 1.0) {
+            throw new OAuthException("OAuth version '$version' not supported");
+        }
+        return $version;
+    }
+
+    # Snagged from OAuthServer
+
+    function get_consumer($datastore, $req) {
+        $consumer_key = @$req->get_parameter("oauth_consumer_key");
+        if (!$consumer_key) {
+            throw new OAuthException("Invalid consumer key");
+        }
+
+        $consumer = $datastore->lookup_consumer($consumer_key);
+        if (!$consumer) {
+            throw new OAuthException("Invalid consumer");
+        }
+        return $consumer;
+    }
+
+    # Mostly cadged from OAuthServer
+
+    function get_token($datastore, &$req, $consumer) {/*{{{*/
+        $token_field = @$req->get_parameter('oauth_token');
+        $token = $datastore->lookup_token($consumer, 'request', $token_field);
+        if (!$token) {
+            throw new OAuthException("Invalid $token_type token: $token_field");
+        }
+        return $token;
+    }
+
+    function check_timestamp(&$req) {
+        $timestamp = @$req->get_parameter('oauth_timestamp');
+        $now = time();
+        if ($now - $timestamp > TIMESTAMP_THRESHOLD) {
+            throw new OAuthException("Expired timestamp, yours $timestamp, ours $now");
+        }
+    }
+
+    # NOTE: don't call twice on the same request; will fail!
+    function check_nonce(&$datastore, &$req, $consumer, $token) {
+        $timestamp = @$req->get_parameter('oauth_timestamp');
+        $nonce = @$req->get_parameter('oauth_nonce');
+        $found = $datastore->lookup_nonce($consumer, $token, $nonce, $timestamp);
+        if ($found) {
+            throw new OAuthException("Nonce already used");
+        }
+        return true;
+    }
+
+    function check_signature(&$req, $consumer, $token) {
+        $signature_method = $this->get_signature_method($req);
+        $signature = $req->get_parameter('oauth_signature');
+        $valid_sig = $signature_method->check_signature($req,
+                                                        $consumer,
+                                                        $token,
+                                                        $signature);
+        if (!$valid_sig) {
+            throw new OAuthException("Invalid signature");
+        }
+    }
+
+    function get_signature_method(&$req) {
+        $signature_method = @$req->get_parameter("oauth_signature_method");
+        if (!$signature_method) {
+            $signature_method = "PLAINTEXT";
+        }
+        if ($signature_method != 'HMAC-SHA1') {
+            throw new OAuthException("Signature method '$signature_method' not supported.");
+        }
+        return omb_hmac_sha1();
+    }
 }
index 38bff2edeee6b3a18640275bcb1319990450cdb5..4eab8758c222e95009c9188ad84e76b181d3999e 100644 (file)
 if (!defined('LACONICA')) { exit(1); }
 
 class UserbyidAction extends Action {
-       
-       function is_readonly() {                                
-               return true;
-       }
-       
+    
+    function is_readonly() {                
+        return true;
+    }
+    
     function handle($args) {
         parent::handle($args);
         $id = $this->trimmed('id');
         if (!$id) {
-               $this->client_error(_('No id.'));
-               }
-               $user =& User::staticGet($id);
-               if (!$user) {
-                       $this->client_error(_('No such user.'));
+            $this->client_error(_('No id.'));
+        }
+        $user =& User::staticGet($id);
+        if (!$user) {
+            $this->client_error(_('No such user.'));
         }
 
         // support redirecting to FOAF rdf/xml if the agent prefers it
         $page_prefs = 'application/rdf+xml,text/html,application/xhtml+xml,application/xml;q=0.3,text/xml;q=0.2';
         $httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : NULL;
-       $type = common_negotiate_type(common_accept_to_prefs($httpaccept),
+        $type = common_negotiate_type(common_accept_to_prefs($httpaccept),
                                       common_accept_to_prefs($page_prefs));
-               $page = $type == 'application/rdf+xml' ? 'foaf' : 'showstream';
+        $page = $type == 'application/rdf+xml' ? 'foaf' : 'showstream';
 
-               $url = common_local_url($page, array('nickname' => $user->nickname));
-               common_redirect($url, 303);
-       }
+        $url = common_local_url($page, array('nickname' => $user->nickname));
+        common_redirect($url, 303);
+    }
 }
index e57f861054bc70964b7108092246cf1ceff36077..b5cb5a40a062c446bb36a075a1d1fe7b83670ced 100644 (file)
@@ -25,66 +25,66 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
 
 class UserrssAction extends Rss10Action {
 
-       var $user = NULL;
+    var $user = NULL;
 
-       function init() {
-               $nickname = $this->trimmed('nickname');
-               $this->user = User::staticGet('nickname', $nickname);
+    function init() {
+        $nickname = $this->trimmed('nickname');
+        $this->user = User::staticGet('nickname', $nickname);
 
-               if (!$this->user) {
-                       common_user_error(_('No such user.'));
-                       return false;
-               } else {
-                       return true;
-               }
-       }
+        if (!$this->user) {
+            common_user_error(_('No such user.'));
+            return false;
+        } else {
+            return true;
+        }
+    }
 
-       function get_notices($limit=0) {
+    function get_notices($limit=0) {
 
-               $user = $this->user;
-               
-               if (is_null($user)) {
-                       return NULL;
-               }
-               
-               $notice = $user->getNotices(0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
-               
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
+        $user = $this->user;
+        
+        if (is_null($user)) {
+            return NULL;
+        }
+        
+        $notice = $user->getNotices(0, ($limit == 0) ? NOTICES_PER_PAGE : $limit);
+        
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
 
-               return $notices;
-       }
+        return $notices;
+    }
 
-       function get_channel() {
-               $user = $this->user;
-               $profile = $user->getProfile();
-               $c = array('url' => common_local_url('userrss',
-                                                                                        array('nickname' =>
-                                                                                                  $user->nickname)),
-                                  'title' => $user->nickname,
-                                  'link' => $profile->profileurl,
-                                  'description' => sprintf(_('Microblog by %s'), $user->nickname));
-               return $c;
-       }
+    function get_channel() {
+        $user = $this->user;
+        $profile = $user->getProfile();
+        $c = array('url' => common_local_url('userrss',
+                                             array('nickname' =>
+                                                   $user->nickname)),
+                   'title' => $user->nickname,
+                   'link' => $profile->profileurl,
+                   'description' => sprintf(_('Microblog by %s'), $user->nickname));
+        return $c;
+    }
 
-       function get_image() {
-               $user = $this->user;
-               $profile = $user->getProfile();
-               if (!$profile) {
-                       common_log_db_error($user, 'SELECT', __FILE__);
-                       $this->server_error(_('User without matching profile'));
-                       return NULL;
-               }
-               $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-               return ($avatar) ? $avatar->url : NULL;
-       }
+    function get_image() {
+        $user = $this->user;
+        $profile = $user->getProfile();
+        if (!$profile) {
+            common_log_db_error($user, 'SELECT', __FILE__);
+            $this->server_error(_('User without matching profile'));
+            return NULL;
+        }
+        $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+        return ($avatar) ? $avatar->url : NULL;
+    }
 
-       # override parent to add X-SUP-ID URL
-       
-       function init_rss($limit=0) {
-               $url = common_local_url('sup', NULL, $this->user->id);
-               header('X-SUP-ID: '.$url);
-               parent::init_rss($limit);
-       }
+    # override parent to add X-SUP-ID URL
+    
+    function init_rss($limit=0) {
+        $url = common_local_url('sup', NULL, $this->user->id);
+        header('X-SUP-ID: '.$url);
+        parent::init_rss($limit);
+    }
 }
\ No newline at end of file
index 1d516aab72e78d6681e7b6d614f71810fc146eb5..9788c87aab688f21ec5b468a48ea636cf600b96a 100644 (file)
@@ -23,110 +23,110 @@ require_once(INSTALLDIR.'/lib/omb.php');
 
 class XrdsAction extends Action {
 
-       function is_readonly() {                                
-               return true;
-       }
-
-       function handle($args) {
-               parent::handle($args);
-               $nickname = $this->trimmed('nickname');
-               $user = User::staticGet('nickname', $nickname);
-               if (!$user) {
-                       common_user_error(_('No such user.'));
-                       return;
-               }
-               $this->show_xrds($user);
-       }
-
-       function show_xrds($user) {
-
-               header('Content-Type: application/xrds+xml');
-
-               common_start_xml();
-               common_element_start('XRDS', array('xmlns' => 'xri://$xrds'));
-
-               common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
-                                                 'xml:id' => 'oauth',
-                                                                                 'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
-                                                                                 'version' => '2.0'));
-
-               common_element('Type', NULL, 'xri://$xrds*simple');
-
-               $this->show_service(OAUTH_ENDPOINT_REQUEST,
-                                                       common_local_url('requesttoken'),
-                                                       array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
-                                                       array(OAUTH_HMAC_SHA1),
-                                                       $user->uri);
-
-               $this->show_service(OAUTH_ENDPOINT_AUTHORIZE,
-                                                       common_local_url('userauthorization'),
-                                                       array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
-                                                       array(OAUTH_HMAC_SHA1));
-
-               $this->show_service(OAUTH_ENDPOINT_ACCESS,
-                                                       common_local_url('accesstoken'),
-                                                       array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
-                                                       array(OAUTH_HMAC_SHA1));
-
-               $this->show_service(OAUTH_ENDPOINT_RESOURCE,
-                                                       NULL,
-                                                       array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
-                                                       array(OAUTH_HMAC_SHA1));
-
-               common_element_end('XRD');
-
-               # XXX: decide whether to include user's ID/nickname in postNotice URL
-
-               common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
-                                                 'xml:id' => 'omb',
-                                                                                 'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
-                                                                                 'version' => '2.0'));
-
-               common_element('Type', NULL, 'xri://$xrds*simple');
-
-               $this->show_service(OMB_ENDPOINT_POSTNOTICE,
-                                                       common_local_url('postnotice'));
-
-               $this->show_service(OMB_ENDPOINT_UPDATEPROFILE,
-                                                       common_local_url('updateprofile'));
-
-               common_element_end('XRD');
-
-               common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
-                                                                                 'version' => '2.0'));
-
-               common_element('Type', NULL, 'xri://$xrds*simple');
-
-               $this->show_service(OAUTH_DISCOVERY,
-                                                       '#oauth');
-               $this->show_service(OMB_NAMESPACE,
-                                                       '#omb');
-
-               common_element_end('XRD');
-
-               common_element_end('XRDS');
-               common_end_xml();
-       }
-
-       function show_service($type, $uri, $params=NULL, $sigs=NULL, $localId=NULL) {
-               common_element_start('Service');
-               if ($uri) {
-                       common_element('URI', NULL, $uri);
-               }
-               common_element('Type', NULL, $type);
-               if ($params) {
-                       foreach ($params as $param) {
-                               common_element('Type', NULL, $param);
-                       }
-               }
-               if ($sigs) {
-                       foreach ($sigs as $sig) {
-                               common_element('Type', NULL, $sig);
-                       }
-               }
-               if ($localId) {
-                       common_element('LocalID', NULL, $localId);
-               }
-               common_element_end('Service');
-       }
+    function is_readonly() {                
+        return true;
+    }
+
+    function handle($args) {
+        parent::handle($args);
+        $nickname = $this->trimmed('nickname');
+        $user = User::staticGet('nickname', $nickname);
+        if (!$user) {
+            common_user_error(_('No such user.'));
+            return;
+        }
+        $this->show_xrds($user);
+    }
+
+    function show_xrds($user) {
+
+        header('Content-Type: application/xrds+xml');
+
+        common_start_xml();
+        common_element_start('XRDS', array('xmlns' => 'xri://$xrds'));
+
+        common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
+                                          'xml:id' => 'oauth',
+                                          'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
+                                          'version' => '2.0'));
+
+        common_element('Type', NULL, 'xri://$xrds*simple');
+
+        $this->show_service(OAUTH_ENDPOINT_REQUEST,
+                            common_local_url('requesttoken'),
+                            array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
+                            array(OAUTH_HMAC_SHA1),
+                            $user->uri);
+
+        $this->show_service(OAUTH_ENDPOINT_AUTHORIZE,
+                            common_local_url('userauthorization'),
+                            array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
+                            array(OAUTH_HMAC_SHA1));
+
+        $this->show_service(OAUTH_ENDPOINT_ACCESS,
+                            common_local_url('accesstoken'),
+                            array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
+                            array(OAUTH_HMAC_SHA1));
+
+        $this->show_service(OAUTH_ENDPOINT_RESOURCE,
+                            NULL,
+                            array(OAUTH_AUTH_HEADER, OAUTH_POST_BODY),
+                            array(OAUTH_HMAC_SHA1));
+
+        common_element_end('XRD');
+
+        # XXX: decide whether to include user's ID/nickname in postNotice URL
+
+        common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
+                                          'xml:id' => 'omb',
+                                          'xmlns:simple' => 'http://xrds-simple.net/core/1.0',
+                                          'version' => '2.0'));
+
+        common_element('Type', NULL, 'xri://$xrds*simple');
+
+        $this->show_service(OMB_ENDPOINT_POSTNOTICE,
+                            common_local_url('postnotice'));
+
+        $this->show_service(OMB_ENDPOINT_UPDATEPROFILE,
+                            common_local_url('updateprofile'));
+
+        common_element_end('XRD');
+
+        common_element_start('XRD', array('xmlns' => 'xri://$xrd*($v*2.0)',
+                                          'version' => '2.0'));
+
+        common_element('Type', NULL, 'xri://$xrds*simple');
+
+        $this->show_service(OAUTH_DISCOVERY,
+                            '#oauth');
+        $this->show_service(OMB_NAMESPACE,
+                            '#omb');
+
+        common_element_end('XRD');
+
+        common_element_end('XRDS');
+        common_end_xml();
+    }
+
+    function show_service($type, $uri, $params=NULL, $sigs=NULL, $localId=NULL) {
+        common_element_start('Service');
+        if ($uri) {
+            common_element('URI', NULL, $uri);
+        }
+        common_element('Type', NULL, $type);
+        if ($params) {
+            foreach ($params as $param) {
+                common_element('Type', NULL, $param);
+            }
+        }
+        if ($sigs) {
+            foreach ($sigs as $sig) {
+                common_element('Type', NULL, $sig);
+            }
+        }
+        if ($localId) {
+            common_element('LocalID', NULL, $localId);
+        }
+        common_element_end('Service');
+    }
 }
\ No newline at end of file
index 901c47c51e8e4c039f15daaeaefe1dcad7d27397..e63668a3360c0f9f80508bfdc872fad88dc55737 100644 (file)
@@ -26,70 +26,70 @@ class Avatar extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-       # We clean up the file, too
+    # We clean up the file, too
 
-       function delete() {
-               $filename = $this->filename;
-               if (parent::delete()) {
-                       @unlink(common_avatar_path($filename));
-               }
-       }
+    function delete() {
+        $filename = $this->filename;
+        if (parent::delete()) {
+            @unlink(common_avatar_path($filename));
+        }
+    }
 
-       # Create and save scaled version of this avatar
-       # XXX: maybe break into different methods
+    # Create and save scaled version of this avatar
+    # XXX: maybe break into different methods
 
-       function scale($size) {
+    function scale($size) {
 
-               $image_s = imagecreatetruecolor($size, $size);
-               $image_a = $this->to_image();
-               $square = min($this->width, $this->height);
+        $image_s = imagecreatetruecolor($size, $size);
+        $image_a = $this->to_image();
+        $square = min($this->width, $this->height);
         imagecolortransparent($image_s, imagecolorallocate($image_s, 0, 0, 0));
         imagealphablending($image_s, false);
         imagesavealpha($image_s, true);
-               imagecopyresampled($image_s, $image_a, 0, 0, 0, 0,
-                                                  $size, $size, $square, $square);
+        imagecopyresampled($image_s, $image_a, 0, 0, 0, 0,
+                           $size, $size, $square, $square);
 
-               $ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png";
+        $ext = ($this->mediattype == 'image/jpeg') ? ".jpeg" : ".png";
 
-               $filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp());
+        $filename = common_avatar_filename($this->profile_id, $ext, $size, common_timestamp());
 
-               if ($this->mediatype == 'image/jpeg') {
-                       imagejpeg($image_s, common_avatar_path($filename));
-               } else {
-                       imagepng($image_s, common_avatar_path($filename));
-               }
+        if ($this->mediatype == 'image/jpeg') {
+            imagejpeg($image_s, common_avatar_path($filename));
+        } else {
+            imagepng($image_s, common_avatar_path($filename));
+        }
 
-               $scaled = DB_DataObject::factory('avatar');
-               $scaled->profile_id = $this->profile_id;
-               $scaled->width = $size;
-               $scaled->height = $size;
-               $scaled->original = false;
-               $scaled->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png';
-               $scaled->filename = $filename;
-               $scaled->url = common_avatar_url($filename);
-               $scaled->created = DB_DataObject_Cast::dateTime(); # current time
+        $scaled = DB_DataObject::factory('avatar');
+        $scaled->profile_id = $this->profile_id;
+        $scaled->width = $size;
+        $scaled->height = $size;
+        $scaled->original = false;
+        $scaled->mediatype = ($this->mediattype == 'image/jpeg') ? 'image/jpeg' : 'image/png';
+        $scaled->filename = $filename;
+        $scaled->url = common_avatar_url($filename);
+        $scaled->created = DB_DataObject_Cast::dateTime(); # current time
 
-               if ($scaled->insert()) {
-                       return $scaled;
-               } else {
-                       return NULL;
-               }
-       }
+        if ($scaled->insert()) {
+            return $scaled;
+        } else {
+            return NULL;
+        }
+    }
 
-       function to_image() {
-               $filepath = common_avatar_path($this->filename);
-               if ($this->mediatype == 'image/gif') {
-                       return imagecreatefromgif($filepath);
-               } else if ($this->mediatype == 'image/jpeg') {
-                       return imagecreatefromjpeg($filepath);
-               } else if ($this->mediatype == 'image/png') {
-                       return imagecreatefrompng($filepath);
-               } else {
-                       return NULL;
-               }
-       }
-       
-       function &pkeyGet($kv) {
-               return Memcached_DataObject::pkeyGet('Avatar', $kv);
-       }
+    function to_image() {
+        $filepath = common_avatar_path($this->filename);
+        if ($this->mediatype == 'image/gif') {
+            return imagecreatefromgif($filepath);
+        } else if ($this->mediatype == 'image/jpeg') {
+            return imagecreatefromjpeg($filepath);
+        } else if ($this->mediatype == 'image/png') {
+            return imagecreatefrompng($filepath);
+        } else {
+            return NULL;
+        }
+    }
+    
+    function &pkeyGet($kv) {
+        return Memcached_DataObject::pkeyGet('Avatar', $kv);
+    }
 }
index bcc0c36b56517a0ac813fcf885bd78bace4b0012..384fe8bb194c85b64f4d8bcf998dfc77884ae5b2 100644 (file)
 if (!defined('LACONICA')) { exit(1); }
 
 class Channel {
-       
-       function on($user) {
-               return false;
-       }
-
-       function off($user) {
-               return false;
-       }
-
-       function output($user, $text) {
-               return false;
-       }
-       
-       function error($user, $text) {
-               return false;
-       }
-       
-       function source() {
-               return NULL;
-       }
+    
+    function on($user) {
+        return false;
+    }
+
+    function off($user) {
+        return false;
+    }
+
+    function output($user, $text) {
+        return false;
+    }
+    
+    function error($user, $text) {
+        return false;
+    }
+    
+    function source() {
+        return NULL;
+    }
 }
 
 class XMPPChannel extends Channel {
 
-       var $conn = NULL;
-       
-       function source() {
-               return 'xmpp';
-       }
-       
-       function __construct($conn) {
-               $this->conn = $conn;
-       }
-       
-       function on($user) {
-               return $this->set_notify($user, 1);
-       }
-       
-       function off($user) {
-               return $this->set_notify($user, 0);
-       }
-
-       function output($user, $text) {
-               $text = '['.common_config('site', 'name') . '] ' . $text;
-               jabber_send_message($user->jabber, $text);
-       }
-       
-       function error($user, $text) {
-               $text = '['.common_config('site', 'name') . '] ' . $text;
-               jabber_send_message($user->jabber, $text);
-       }
-       
-       function set_notify(&$user, $notify) {
-               $orig = clone($user);
-               $user->jabbernotify = $notify;
-               $result = $user->update($orig);
-               if (!$result) {
-                       $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
-                       common_log(LOG_ERR,
-                                          'Could not set notify flag to ' . $notify .
-                                          ' for user ' . common_log_objstring($user) .
-                                          ': ' . $last_error->message);
-                       return false;
-               } else {
-                       common_log(LOG_INFO,
-                                          'User ' . $user->nickname . ' set notify flag to ' . $notify);
-                       return true;
-               }
-       }
+    var $conn = NULL;
+    
+    function source() {
+        return 'xmpp';
+    }
+    
+    function __construct($conn) {
+        $this->conn = $conn;
+    }
+    
+    function on($user) {
+        return $this->set_notify($user, 1);
+    }
+    
+    function off($user) {
+        return $this->set_notify($user, 0);
+    }
+
+    function output($user, $text) {
+        $text = '['.common_config('site', 'name') . '] ' . $text;
+        jabber_send_message($user->jabber, $text);
+    }
+    
+    function error($user, $text) {
+        $text = '['.common_config('site', 'name') . '] ' . $text;
+        jabber_send_message($user->jabber, $text);
+    }
+    
+    function set_notify(&$user, $notify) {
+        $orig = clone($user);
+        $user->jabbernotify = $notify;
+        $result = $user->update($orig);
+        if (!$result) {
+            $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError');
+            common_log(LOG_ERR,
+                       'Could not set notify flag to ' . $notify .
+                       ' for user ' . common_log_objstring($user) .
+                       ': ' . $last_error->message);
+            return false;
+        } else {
+            common_log(LOG_INFO,
+                       'User ' . $user->nickname . ' set notify flag to ' . $notify);
+            return true;
+        }
+    }
 }
 
 
 class WebChannel extends Channel {
 
-       function source() {
-               return 'web';
-       }
-       
-       function on($user) {
-               return false;
-       }
-       
-       function off($user) {
-               return false;
-       }
-
-       function output($user, $text) {
-               # XXX: buffer all output and send it at the end
-               # XXX: even better, redirect to appropriate page
-               #      depending on what command was run
-               common_show_header(_('Command results'));
-               common_element('p', NULL, $text);
-               common_show_footer();
-       }
-       
-       function error($user, $text) {
-               common_user_error($text);
-       }
+    function source() {
+        return 'web';
+    }
+    
+    function on($user) {
+        return false;
+    }
+    
+    function off($user) {
+        return false;
+    }
+
+    function output($user, $text) {
+        # XXX: buffer all output and send it at the end
+        # XXX: even better, redirect to appropriate page
+        #      depending on what command was run
+        common_show_header(_('Command results'));
+        common_element('p', NULL, $text);
+        common_show_footer();
+    }
+    
+    function error($user, $text) {
+        common_user_error($text);
+    }
 }
 
 
 class AjaxWebChannel extends WebChannel {
 
-       function output($user, $text) {
-               common_start_html('text/xml;charset=utf-8', true);
-               common_element_start('head');
-               common_element('title', null, _('Command results'));
-               common_element_end('head');
-               common_element_start('body');
-               common_element('p', array('id' => 'command_result'), $text);
-               common_element_end('body');
-               common_element_end('html');
-       }
-
-       function error($user, $text) {
-               common_start_html('text/xml;charset=utf-8', true);
-               common_element_start('head');
-               common_element('title', null, _('Ajax Error'));
-               common_element_end('head');
-               common_element_start('body');
-               common_element('p', array('id' => 'error'), $text);
-               common_element_end('body');
-               common_element_end('html');
-       }
+    function output($user, $text) {
+        common_start_html('text/xml;charset=utf-8', true);
+        common_element_start('head');
+        common_element('title', null, _('Command results'));
+        common_element_end('head');
+        common_element_start('body');
+        common_element('p', array('id' => 'command_result'), $text);
+        common_element_end('body');
+        common_element_end('html');
+    }
+
+    function error($user, $text) {
+        common_start_html('text/xml;charset=utf-8', true);
+        common_element_start('head');
+        common_element('title', null, _('Ajax Error'));
+        common_element_end('head');
+        common_element_start('body');
+        common_element('p', array('id' => 'error'), $text);
+        common_element_end('body');
+        common_element_end('html');
+    }
 }
 
 
 class MailChannel extends Channel {
 
-       var $addr = NULL;
-
-       function source() {
-               return 'mail';
-       }
-       
-       function __construct($addr=NULL) {
-               $this->addr = $addr;
-       }
-       
-       function on($user) {
-               return $this->set_notify($user, 1);
-       }
-       
-       function off($user) {
-               return $this->set_notify($user, 0);
-       }
-
-       function output($user, $text) {
-
-               $headers['From'] = $user->incomingemail;
-               $headers['To'] = $this->addr;
-               
-               $headers['Subject'] = _('Command complete');
-
-               return mail_send(array($this->addr), $headers, $text);
-       }
-       
-       function error($user, $text) {
-               
-               $headers['From'] = $user->incomingemail;
-               $headers['To'] = $this->addr;
-               
-               $headers['Subject'] = _('Command failed');
-
-               return mail_send(array($this->addr), $headers, $text);
-       }
-       
-       function set_notify($user, $value) {
-               $orig = clone($user);
-               $user->smsnotify = $value;
-               $result = $user->update($orig);
-               if (!$result) {
-                       common_log_db_error($user, 'UPDATE', __FILE__);
-                       return false;
-               }
-               return true;
-       }
+    var $addr = NULL;
+
+    function source() {
+        return 'mail';
+    }
+    
+    function __construct($addr=NULL) {
+        $this->addr = $addr;
+    }
+    
+    function on($user) {
+        return $this->set_notify($user, 1);
+    }
+    
+    function off($user) {
+        return $this->set_notify($user, 0);
+    }
+
+    function output($user, $text) {
+
+        $headers['From'] = $user->incomingemail;
+        $headers['To'] = $this->addr;
+        
+        $headers['Subject'] = _('Command complete');
+
+        return mail_send(array($this->addr), $headers, $text);
+    }
+    
+    function error($user, $text) {
+        
+        $headers['From'] = $user->incomingemail;
+        $headers['To'] = $this->addr;
+        
+        $headers['Subject'] = _('Command failed');
+
+        return mail_send(array($this->addr), $headers, $text);
+    }
+    
+    function set_notify($user, $value) {
+        $orig = clone($user);
+        $user->smsnotify = $value;
+        $result = $user->update($orig);
+        if (!$result) {
+            common_log_db_error($user, 'UPDATE', __FILE__);
+            return false;
+        }
+        return true;
+    }
 }
index c2409d140a2ac152c86ca780ffe36d288833bf42..ff44b9d1eb7cc1d17a13ead6088821b9c81970d5 100644 (file)
@@ -22,22 +22,22 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/classes/Channel.php');
 
 class Command {
-       
-       var $user = NULL;
-       
-       function __construct($user=NULL) {
-               $this->user = $user;
-       }
-       
-       function execute($channel) {
-               return false;
-       }
+    
+    var $user = NULL;
+    
+    function __construct($user=NULL) {
+        $this->user = $user;
+    }
+    
+    function execute($channel) {
+        return false;
+    }
 }
 
 class UnimplementedCommand extends Command {
-       function execute($channel) {
-               $channel->error($this->user, _("Sorry, this command is not yet implemented."));
-       }
+    function execute($channel) {
+        $channel->error($this->user, _("Sorry, this command is not yet implemented."));
+    }
 }
 
 class TrackingCommand extends UnimplementedCommand {
@@ -47,330 +47,330 @@ class TrackOffCommand extends UnimplementedCommand {
 }
 
 class TrackCommand extends UnimplementedCommand {
-       var $word = NULL;
-       function __construct($user, $word) {
-               parent::__construct($user);
-               $this->word = $word;
-       }
+    var $word = NULL;
+    function __construct($user, $word) {
+        parent::__construct($user);
+        $this->word = $word;
+    }
 }
 
 class UntrackCommand extends UnimplementedCommand {
-       var $word = NULL;
-       function __construct($user, $word) {
-               parent::__construct($user);
-               $this->word = $word;
-       }
+    var $word = NULL;
+    function __construct($user, $word) {
+        parent::__construct($user);
+        $this->word = $word;
+    }
 }
 
 class NudgeCommand extends UnimplementedCommand {
-       var $other = NULL;
-       function __construct($user, $other) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
+    var $other = NULL;
+    function __construct($user, $other) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
 }
 
 class InviteCommand extends UnimplementedCommand {
-       var $other = NULL;
-       function __construct($user, $other) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
+    var $other = NULL;
+    function __construct($user, $other) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
 }
 
 class StatsCommand extends Command {
-       function execute($channel) {
+    function execute($channel) {
 
-               $subs = new Subscription();
-               $subs->subscriber = $this->user->id;
-               $subs_count = (int) $subs->count() - 1;
+        $subs = new Subscription();
+        $subs->subscriber = $this->user->id;
+        $subs_count = (int) $subs->count() - 1;
 
-               $subbed = new Subscription();
-               $subbed->subscribed = $this->user->id;
-               $subbed_count = (int) $subbed->count() - 1;
+        $subbed = new Subscription();
+        $subbed->subscribed = $this->user->id;
+        $subbed_count = (int) $subbed->count() - 1;
 
-               $notices = new Notice();
-               $notices->profile_id = $this->user->id;
-               $notice_count = (int) $notices->count();
-               
-               $channel->output($this->user, sprintf(_("Subscriptions: %1\$s\n".
-                                                                  "Subscribers: %2\$s\n".
-                                                                  "Notices: %3\$s"),
-                                                                $subs_count,
-                                                                $subbed_count,
-                                                                $notice_count));
-       }
+        $notices = new Notice();
+        $notices->profile_id = $this->user->id;
+        $notice_count = (int) $notices->count();
+        
+        $channel->output($this->user, sprintf(_("Subscriptions: %1\$s\n".
+                                   "Subscribers: %2\$s\n".
+                                   "Notices: %3\$s"),
+                                 $subs_count,
+                                 $subbed_count,
+                                 $notice_count));
+    }
 }
 
 class FavCommand extends Command {
-       
-       var $other = NULL;
-       
-       function __construct($user, $other) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
-       
-       function execute($channel) {
-               
-               $recipient = 
-                 common_relative_profile($this->user, common_canonical_nickname($this->other));
-               
-               if (!$recipient) {
-                       $channel->error($this->user, _('No such user.'));
-                       return;
-               }
-               $notice = $recipient->getCurrentNotice();
-               if (!$notice) {
-                       $channel->error($this->user, _('User has no last notice'));
-                       return;
-               }
-               
-               $fave = Fave::addNew($this->user, $notice);
+    
+    var $other = NULL;
+    
+    function __construct($user, $other) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
+    
+    function execute($channel) {
+        
+        $recipient = 
+          common_relative_profile($this->user, common_canonical_nickname($this->other));
+        
+        if (!$recipient) {
+            $channel->error($this->user, _('No such user.'));
+            return;
+        }
+        $notice = $recipient->getCurrentNotice();
+        if (!$notice) {
+            $channel->error($this->user, _('User has no last notice'));
+            return;
+        }
+        
+        $fave = Fave::addNew($this->user, $notice);
 
-               if (!$fave) {
-                       $channel->error($this->user, _('Could not create favorite.'));
-                       return;
-               }
+        if (!$fave) {
+            $channel->error($this->user, _('Could not create favorite.'));
+            return;
+        }
 
-           $other = User::staticGet('id', $recipient->id);
-               
-               if ($other && $other->id != $user->id) {
-                       if ($other->email && $other->emailnotifyfav) {
-                               mail_notify_fave($other, $this->user, $notice);
-                       }
-               }
-               
-               $this->user->blowFavesCache();
-               
-               $channel->output($this->user, _('Notice marked as fave.'));
-       }
+        $other = User::staticGet('id', $recipient->id);
+        
+        if ($other && $other->id != $user->id) {
+            if ($other->email && $other->emailnotifyfav) {
+                mail_notify_fave($other, $this->user, $notice);
+            }
+        }
+        
+        $this->user->blowFavesCache();
+        
+        $channel->output($this->user, _('Notice marked as fave.'));
+    }
 }
 
 class WhoisCommand extends Command {
-       var $other = NULL;
-       function __construct($user, $other) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
-       
-       function execute($channel) {
-               $recipient = 
-                 common_relative_profile($this->user, common_canonical_nickname($this->other));
-               
-               if (!$recipient) {
-                       $channel->error($this->user, _('No such user.'));
-                       return;
-               }
-               
-               $whois = sprintf(_("%1\$s (%2\$s)"), $recipient->nickname,
-                                                $recipient->profileurl);
-               if ($recipient->fullname) {
-                       $whois .= "\n" . sprintf(_('Fullname: %s'), $recipient->fullname);
-               }
-               if ($recipient->location) {
-                       $whois .= "\n" . sprintf(_('Location: %s'), $recipient->location);
-               }
-               if ($recipient->homepage) {
-                       $whois .= "\n" . sprintf(_('Homepage: %s'), $recipient->homepage);
-               }
-               if ($recipient->bio) {
-                       $whois .= "\n" . sprintf(_('About: %s'), $recipient->bio);
-               }
-               $channel->output($this->user, $whois);
-       }
+    var $other = NULL;
+    function __construct($user, $other) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
+    
+    function execute($channel) {
+        $recipient = 
+          common_relative_profile($this->user, common_canonical_nickname($this->other));
+        
+        if (!$recipient) {
+            $channel->error($this->user, _('No such user.'));
+            return;
+        }
+        
+        $whois = sprintf(_("%1\$s (%2\$s)"), $recipient->nickname,
+                         $recipient->profileurl);
+        if ($recipient->fullname) {
+            $whois .= "\n" . sprintf(_('Fullname: %s'), $recipient->fullname);
+        }
+        if ($recipient->location) {
+            $whois .= "\n" . sprintf(_('Location: %s'), $recipient->location);
+        }
+        if ($recipient->homepage) {
+            $whois .= "\n" . sprintf(_('Homepage: %s'), $recipient->homepage);
+        }
+        if ($recipient->bio) {
+            $whois .= "\n" . sprintf(_('About: %s'), $recipient->bio);
+        }
+        $channel->output($this->user, $whois);
+    }
 }
 
 class MessageCommand extends Command {
-       var $other = NULL;
-       var $text = NULL;
-       function __construct($user, $other, $text) {
-               parent::__construct($user);
-               $this->other = $other;
-               $this->text = $text;
-       }
-       
-       function execute($channel) {
-               $other = User::staticGet('nickname', common_canonical_nickname($this->other));
-               $len = mb_strlen($this->text);
-               if ($len == 0) {
-                       $channel->error($this->user, _('No content!'));
-                       return;
-               } else if ($len > 140) {
-                       $content = common_shorten_links($content);
-                       if (mb_strlen($content) > 140) {
-                               $channel->error($this->user, sprintf(_('Message too long - maximum is 140 characters, you sent %d'), $len));
-                               return;
-                       }
-               }
-               
-               if (!$other) {
-                       $channel->error($this->user, _('No such user.'));
-                       return;
-               } else if (!$this->user->mutuallySubscribed($other)) {
-                       $channel->error($this->user, _('You can\'t send a message to this user.'));
-                       return;
-               } else if ($this->user->id == $other->id) {
-                       $channel->error($this->user, _('Don\'t send a message to yourself; just say it to yourself quietly instead.'));
-                       return;
-               }
-               $message = Message::saveNew($this->user->id, $other->id, $this->text, $channel->source());
-               if ($message) {
-                       $channel->output($this->user, sprintf(_('Direct message to %s sent'), $this->other));
-               } else {
-                       $channel->error($this->user, _('Error sending direct message.'));
-               }
-       }
+    var $other = NULL;
+    var $text = NULL;
+    function __construct($user, $other, $text) {
+        parent::__construct($user);
+        $this->other = $other;
+        $this->text = $text;
+    }
+    
+    function execute($channel) {
+        $other = User::staticGet('nickname', common_canonical_nickname($this->other));
+        $len = mb_strlen($this->text);
+        if ($len == 0) {
+            $channel->error($this->user, _('No content!'));
+            return;
+        } else if ($len > 140) {
+            $content = common_shorten_links($content);
+            if (mb_strlen($content) > 140) {
+                $channel->error($this->user, sprintf(_('Message too long - maximum is 140 characters, you sent %d'), $len));
+                return;
+            }
+        }
+        
+        if (!$other) {
+            $channel->error($this->user, _('No such user.'));
+            return;
+        } else if (!$this->user->mutuallySubscribed($other)) {
+            $channel->error($this->user, _('You can\'t send a message to this user.'));
+            return;
+        } else if ($this->user->id == $other->id) {
+            $channel->error($this->user, _('Don\'t send a message to yourself; just say it to yourself quietly instead.'));
+            return;
+        }
+        $message = Message::saveNew($this->user->id, $other->id, $this->text, $channel->source());
+        if ($message) {
+            $channel->output($this->user, sprintf(_('Direct message to %s sent'), $this->other));
+        } else {
+            $channel->error($this->user, _('Error sending direct message.'));
+        }
+    }
 }
 
 class GetCommand extends Command {
-       
-       var $other = NULL;
-       
-       function __construct($user, $other) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
-       
-       function execute($channel) {
-               $target_nickname = common_canonical_nickname($this->other);
-               
-               $target =
-                 common_relative_profile($this->user, $target_nickname);
+    
+    var $other = NULL;
+    
+    function __construct($user, $other) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
+    
+    function execute($channel) {
+        $target_nickname = common_canonical_nickname($this->other);
+        
+        $target =
+          common_relative_profile($this->user, $target_nickname);
 
-               if (!$target) {
-                       $channel->error($this->user, _('No such user.'));
-                       return;
-               }
-               $notice = $target->getCurrentNotice();
-               if (!$notice) {
-                       $channel->error($this->user, _('User has no last notice'));
-                       return;
-               }
-               $notice_content = $notice->content;
-               
-               $channel->output($this->user, $target_nickname . ": " . $notice_content);
-       }
+        if (!$target) {
+            $channel->error($this->user, _('No such user.'));
+            return;
+        }
+        $notice = $target->getCurrentNotice();
+        if (!$notice) {
+            $channel->error($this->user, _('User has no last notice'));
+            return;
+        }
+        $notice_content = $notice->content;
+        
+        $channel->output($this->user, $target_nickname . ": " . $notice_content);
+    }
 }
 
 class SubCommand extends Command {
-       
-       var $other = NULL;
-       
-       function __construct($user, $other) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
-       
-       function execute($channel) {
-               
-               if (!$this->other) {
-                       $channel->error($this->user, _('Specify the name of the user to subscribe to'));
-                       return;
-               }
-               
-               $result = subs_subscribe_user($this->user, $this->other);
-               
-               if ($result == 'true') {
-                       $channel->output($this->user, sprintf(_('Subscribed to %s'), $this->other));
-               } else {
-                       $channel->error($this->user, $result);
-               }
-       }
+    
+    var $other = NULL;
+    
+    function __construct($user, $other) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
+    
+    function execute($channel) {
+        
+        if (!$this->other) {
+            $channel->error($this->user, _('Specify the name of the user to subscribe to'));
+            return;
+        }
+        
+        $result = subs_subscribe_user($this->user, $this->other);
+        
+        if ($result == 'true') {
+            $channel->output($this->user, sprintf(_('Subscribed to %s'), $this->other));
+        } else {
+            $channel->error($this->user, $result);
+        }
+    }
 }
 
 class UnsubCommand extends Command {
 
-       var $other = NULL;
-       
-       function __construct($user, $other) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
+    var $other = NULL;
+    
+    function __construct($user, $other) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
 
-       function execute($channel) {
-               if(!$this->other) {
-                       $channel->error($this->user, _('Specify the name of the user to unsubscribe from'));
-                       return;
-               }
-               
-               $result=subs_unsubscribe_user($this->user, $this->other);
-               
-               if ($result) {
-                       $channel->output($this->user, sprintf(_('Unsubscribed from %s'), $this->other));
-               } else {
-                       $channel->error($this->user, $result);
-               }
-       }
+    function execute($channel) {
+        if(!$this->other) {
+            $channel->error($this->user, _('Specify the name of the user to unsubscribe from'));
+            return;
+        }
+        
+        $result=subs_unsubscribe_user($this->user, $this->other);
+        
+        if ($result) {
+            $channel->output($this->user, sprintf(_('Unsubscribed from %s'), $this->other));
+        } else {
+            $channel->error($this->user, $result);
+        }
+    }
 }
 
 class OffCommand extends Command {
-       var $other = NULL;
-       function __construct($user, $other=NULL) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
-       function execute($channel) {
-               if ($other) {
-                       $channel->error($this->user, _("Command not yet implemented."));
-               } else {
-                       if ($channel->off($this->user)) {
-                               $channel->output($this->user, _('Notification off.'));
-                       } else {
-                               $channel->error($this->user, _('Can\'t turn off notification.'));
-                       }
-               }
-       }
+    var $other = NULL;
+    function __construct($user, $other=NULL) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
+    function execute($channel) {
+        if ($other) {
+            $channel->error($this->user, _("Command not yet implemented."));
+        } else {
+            if ($channel->off($this->user)) {
+                $channel->output($this->user, _('Notification off.'));
+            } else {
+                $channel->error($this->user, _('Can\'t turn off notification.'));
+            }
+        }
+    }
 }
 
 class OnCommand extends Command {
-       var $other = NULL;
-       function __construct($user, $other=NULL) {
-               parent::__construct($user);
-               $this->other = $other;
-       }
-       
-       function execute($channel) {
-               if ($other) {
-                       $channel->error($this->user, _("Command not yet implemented."));
-               } else {
-                       if ($channel->on($this->user)) {
-                               $channel->output($this->user, _('Notification on.'));
-                       } else {
-                               $channel->error($this->user, _('Can\'t turn on notification.'));
-                       }
-               }
-       }
+    var $other = NULL;
+    function __construct($user, $other=NULL) {
+        parent::__construct($user);
+        $this->other = $other;
+    }
+    
+    function execute($channel) {
+        if ($other) {
+            $channel->error($this->user, _("Command not yet implemented."));
+        } else {
+            if ($channel->on($this->user)) {
+                $channel->output($this->user, _('Notification on.'));
+            } else {
+                $channel->error($this->user, _('Can\'t turn on notification.'));
+            }
+        }
+    }
 }
 
 class HelpCommand extends Command {
-       function execute($channel) {
-               $channel->output($this->user,
-                                                _("Commands:\n".
-                                                  "on - turn on notifications\n".
-                                                  "off - turn off notifications\n".
-                                                  "help - show this help\n".
-                                                  "follow <nickname> - subscribe to user\n".
-                                                  "leave <nickname> - unsubscribe from user\n".
-                                                  "d <nickname> <text> - direct message to user\n".
-                                                  "get <nickname> - get last notice from user\n".
-                                                  "whois <nickname> - get profile info on user\n".
-                                                  "fav <nickname> - add user's last notice as a 'fave'\n".
-                                                  "stats - get your stats\n".
-                                                  "stop - same as 'off'\n".
-                                                  "quit - same as 'off'\n".
-                                                  "sub <nickname> - same as 'follow'\n".
-                                                  "unsub <nickname> - same as 'leave'\n".
-                                                  "last <nickname> - same as 'get'\n".
-                                                  "on <nickname> - not yet implemented.\n".
-                                                  "off <nickname> - not yet implemented.\n".                                              
-                                                  "nudge <nickname> - not yet implemented.\n".
-                                                  "invite <phone number> - not yet implemented.\n".
-                                                  "track <word> - not yet implemented.\n".
-                                                  "untrack <word> - not yet implemented.\n".
-                                                  "track off - not yet implemented.\n".
-                                                  "untrack all - not yet implemented.\n".
-                                                  "tracks - not yet implemented.\n".
-                                                  "tracking - not yet implemented.\n"));
-       }
+    function execute($channel) {
+        $channel->output($this->user,
+                         _("Commands:\n".
+                           "on - turn on notifications\n".
+                           "off - turn off notifications\n".
+                           "help - show this help\n".
+                           "follow <nickname> - subscribe to user\n".
+                           "leave <nickname> - unsubscribe from user\n".
+                           "d <nickname> <text> - direct message to user\n".
+                           "get <nickname> - get last notice from user\n".
+                           "whois <nickname> - get profile info on user\n".
+                           "fav <nickname> - add user's last notice as a 'fave'\n".
+                           "stats - get your stats\n".
+                           "stop - same as 'off'\n".
+                           "quit - same as 'off'\n".
+                           "sub <nickname> - same as 'follow'\n".
+                           "unsub <nickname> - same as 'leave'\n".
+                           "last <nickname> - same as 'get'\n".
+                           "on <nickname> - not yet implemented.\n".
+                           "off <nickname> - not yet implemented.\n".                           
+                           "nudge <nickname> - not yet implemented.\n".
+                           "invite <phone number> - not yet implemented.\n".
+                           "track <word> - not yet implemented.\n".
+                           "untrack <word> - not yet implemented.\n".
+                           "track off - not yet implemented.\n".
+                           "untrack all - not yet implemented.\n".
+                           "tracks - not yet implemented.\n".
+                           "tracking - not yet implemented.\n"));
+    }
 }
index 4e27f8f7966d8a1201189ae3f11fb2ace516a3e9..8192fb1a93e3309b4a6b176e522ed972e3acee59 100644 (file)
@@ -22,174 +22,174 @@ if (!defined('LACONICA')) { exit(1); }
 require_once(INSTALLDIR.'/classes/Command.php');
 
 class CommandInterpreter {
-       
-       function handle_command($user, $text) {
-               # XXX: localise
+    
+    function handle_command($user, $text) {
+        # XXX: localise
 
-               $text = preg_replace('/\s+/', ' ', trim($text));
-               list($cmd, $arg) = explode(' ', $text, 2);
+        $text = preg_replace('/\s+/', ' ', trim($text));
+        list($cmd, $arg) = explode(' ', $text, 2);
 
-               # We try to support all the same commands as Twitter, see
-               # http://getsatisfaction.com/twitter/topics/what_are_the_twitter_commands
-               # There are a few compatibility commands from earlier versions of 
-               # Laconica
-               
-               switch(strtolower($cmd)) {
-                case 'help':
-                       if ($arg) {
-                               return NULL;
-                       }
-                       return new HelpCommand($user);
-                case 'on':
-                       if ($arg) {
-                               list($other, $extra) = explode(' ', $arg, 2);
-                               if ($extra) {
-                                       return NULL;
-                               } else {
-                                       return new OnCommand($user, $other);
-                               }
-                       } else {
-                               return new OnCommand($user);
-                       }
-                case 'off':
-                       if ($arg) {
-                               list($other, $extra) = explode(' ', $arg, 2);
-                               if ($extra) {
-                                       return NULL;
-                               } else {
-                                       return new OffCommand($user, $other);
-                               }
-                       } else {
-                               return new OffCommand($user);
-                       }
-                case 'stop':
-                case 'quit':
-                       if ($arg) {
-                               return NULL;
-                       } else {
-                               return new OffCommand($user);
-                       }
-                case 'follow':
-                case 'sub':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else {
-                               return new SubCommand($user, $other);
-                       }
-                case 'leave':
-                case 'unsub':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else {
-                               return new UnsubCommand($user, $other);
-                       }
-                case 'get':
-                case 'last':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else {
-                               return new GetCommand($user, $other);
-                       }
-                case 'd':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if (!$extra) {
-                               return NULL;
-                       } else {
-                               return new MessageCommand($user, $other, $extra);
-                       }
-                case 'whois':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else {
-                               return new WhoisCommand($user, $other);
-                       }
-                case 'fav':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else {
-                               return new FavCommand($user, $other);
-                       }
-                case 'nudge':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else {
-                               return new NudgeCommand($user, $other);
-                       }
-                case 'stats':
-                       if ($arg) {
-                               return NULL;
-                       }
-                       return new StatsCommand($user);
-                case 'invite':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($other, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else {
-                               return new InviteCommand($user, $other);
-                       }
-                case 'track':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($word, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else if ($word == 'off') {
-                               return new TrackOffCommand($user);
-                       } else {
-                               return new TrackCommand($user, $word);
-                       }
-                case 'untrack':
-                       if (!$arg) {
-                               return NULL;
-                       }
-                       list($word, $extra) = explode(' ', $arg, 2);
-                       if ($extra) {
-                               return NULL;
-                       } else if ($word == 'all') {
-                               return new TrackOffCommand($user);
-                       } else {
-                               return new UntrackCommand($user, $word);
-                       }
-                case 'tracks':
-                case 'tracking':
-                       if ($arg) {
-                               return NULL;
-                       }
-                       return new TrackingCommand($user);
-                default:
-                       return false;
-               }
-       }
+        # We try to support all the same commands as Twitter, see
+        # http://getsatisfaction.com/twitter/topics/what_are_the_twitter_commands
+        # There are a few compatibility commands from earlier versions of 
+        # Laconica
+        
+        switch(strtolower($cmd)) {
+         case 'help':
+            if ($arg) {
+                return NULL;
+            }
+            return new HelpCommand($user);
+         case 'on':
+            if ($arg) {
+                list($other, $extra) = explode(' ', $arg, 2);
+                if ($extra) {
+                    return NULL;
+                } else {
+                    return new OnCommand($user, $other);
+                }
+            } else {
+                return new OnCommand($user);
+            }
+         case 'off':
+            if ($arg) {
+                list($other, $extra) = explode(' ', $arg, 2);
+                if ($extra) {
+                    return NULL;
+                } else {
+                    return new OffCommand($user, $other);
+                }
+            } else {
+                return new OffCommand($user);
+            }
+         case 'stop':
+         case 'quit':
+            if ($arg) {
+                return NULL;
+            } else {
+                return new OffCommand($user);
+            }
+         case 'follow':
+         case 'sub':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else {
+                return new SubCommand($user, $other);
+            }
+         case 'leave':
+         case 'unsub':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else {
+                return new UnsubCommand($user, $other);
+            }
+         case 'get':
+         case 'last':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else {
+                return new GetCommand($user, $other);
+            }
+         case 'd':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if (!$extra) {
+                return NULL;
+            } else {
+                return new MessageCommand($user, $other, $extra);
+            }
+         case 'whois':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else {
+                return new WhoisCommand($user, $other);
+            }
+         case 'fav':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else {
+                return new FavCommand($user, $other);
+            }
+         case 'nudge':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else {
+                return new NudgeCommand($user, $other);
+            }
+         case 'stats':
+            if ($arg) {
+                return NULL;
+            }
+            return new StatsCommand($user);
+         case 'invite':
+            if (!$arg) {
+                return NULL;
+            }
+            list($other, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else {
+                return new InviteCommand($user, $other);
+            }
+         case 'track':
+            if (!$arg) {
+                return NULL;
+            }
+            list($word, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else if ($word == 'off') {
+                return new TrackOffCommand($user);
+            } else {
+                return new TrackCommand($user, $word);
+            }
+         case 'untrack':
+            if (!$arg) {
+                return NULL;
+            }
+            list($word, $extra) = explode(' ', $arg, 2);
+            if ($extra) {
+                return NULL;
+            } else if ($word == 'all') {
+                return new TrackOffCommand($user);
+            } else {
+                return new UntrackCommand($user, $word);
+            }
+         case 'tracks':
+         case 'tracking':
+            if ($arg) {
+                return NULL;
+            }
+            return new TrackingCommand($user);
+         default:
+            return false;
+        }
+    }
 }
 
index 7cc3f585e70899ddaac787ef1cfbc5b5008223cb..b70a8a897c7014d45444babe7ec0565d86130355 100644 (file)
@@ -20,18 +20,18 @@ class Fave extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-       static function addNew($user, $notice) {
-               $fave = new Fave();
-               $fave->user_id = $user->id;
-               $fave->notice_id = $notice->id;
-               if (!$fave->insert()) {
-                       common_log_db_error($fave, 'INSERT', __FILE__);
-                       return false;
-               }
-               return $fave;
-       }
-       
-       function &pkeyGet($kv) {
-               return Memcached_DataObject::pkeyGet('Fave', $kv);
-       }
+    static function addNew($user, $notice) {
+        $fave = new Fave();
+        $fave->user_id = $user->id;
+        $fave->notice_id = $notice->id;
+        if (!$fave->insert()) {
+            common_log_db_error($fave, 'INSERT', __FILE__);
+            return false;
+        }
+        return $fave;
+    }
+    
+    function &pkeyGet($kv) {
+        return Memcached_DataObject::pkeyGet('Fave', $kv);
+    }
 }
index 7a625a209295039210b3b8f1a84405b97b05d002..7ce0df833685c4568fb8e0de897aa13b642bc127 100644 (file)
@@ -26,51 +26,51 @@ class Foreign_link extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-       // XXX:  This only returns a 1->1 single obj mapping.  Change?  Or make
-       // a getForeignUsers() that returns more than one? --Zach
-       static function getByUserID($user_id, $service) {
-               $flink = new Foreign_link();
-               $flink->service = $service;
-               $flink->user_id = $user_id;
-               $flink->limit(1);
+    // XXX:  This only returns a 1->1 single obj mapping.  Change?  Or make
+    // a getForeignUsers() that returns more than one? --Zach
+    static function getByUserID($user_id, $service) {
+        $flink = new Foreign_link();
+        $flink->service = $service;
+        $flink->user_id = $user_id;
+        $flink->limit(1);
 
-               if ($flink->find(TRUE)) {
-                       return $flink;
-               }
+        if ($flink->find(TRUE)) {
+            return $flink;
+        }
 
-               return NULL;            
-       }
-       
-       static function getByForeignID($foreign_id, $service) {
-               $flink = new Foreign_link();
-               $flink->service = $service;
-               $flink->foreign_id = $foreign_id;
-               $flink->limit(1);
+        return NULL;        
+    }
+    
+    static function getByForeignID($foreign_id, $service) {
+        $flink = new Foreign_link();
+        $flink->service = $service;
+        $flink->foreign_id = $foreign_id;
+        $flink->limit(1);
 
-               if ($flink->find(TRUE)) {
-                       return $flink;
-               }
+        if ($flink->find(TRUE)) {
+            return $flink;
+        }
 
-               return NULL;            
-       }
-               
-       # Convenience methods
-       function getForeignUser() {             
-               $fuser = new Foreign_user();
-               $fuser->service = $this->service;
-               $fuser->id = $this->foreign_id;
-               
-               $fuser->limit(1);
-               
-               if ($fuser->find(TRUE)) {
-                       return $fuser;
-               }
-               
-               return NULL;            
-       }
-       
-       function getUser() {
-               return User::staticGet($this->user_id);
-       }
-               
+        return NULL;        
+    }
+        
+    # Convenience methods
+    function getForeignUser() {        
+        $fuser = new Foreign_user();
+        $fuser->service = $this->service;
+        $fuser->id = $this->foreign_id;
+        
+        $fuser->limit(1);
+        
+        if ($fuser->find(TRUE)) {
+            return $fuser;
+        }
+        
+        return NULL;        
+    }
+    
+    function getUser() {
+        return User::staticGet($this->user_id);
+    }
+        
 }
index 027fae69d16e2839732468b2be6e6a28931700ef..396680128a71568e069457f10ecb63df26ab2fd8 100644 (file)
@@ -22,49 +22,49 @@ class Foreign_user extends Memcached_DataObject
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
-       
-       // XXX:  This only returns a 1->1 single obj mapping.  Change?  Or make
-       // a getForeignUsers() that returns more than one? --Zach
-       static function getForeignUser($id, $service) {         
-               $fuser = new Foreign_user();
-               $fuser->whereAdd("service = $service");
-               $fuser->whereAdd("id = $id");
-               $fuser->limit(1);
-               
-               if ($fuser->find()) {
-                       $fuser->fetch();
-                       return $fuser;
-               }
-               
-               return NULL;            
-       }
-       
-       function updateKeys(&$orig) {
-               $parts = array();
-               foreach (array('id', 'service', 'uri', 'nickname') as $k) {
-                       if (strcmp($this->$k, $orig->$k) != 0) {
-                               $parts[] = $k . ' = ' . $this->_quote($this->$k);
-                       }
-               }
-               if (count($parts) == 0) {
-                       # No changes
-                       return true;
-               }
-               $toupdate = implode(', ', $parts);
+    
+    // XXX:  This only returns a 1->1 single obj mapping.  Change?  Or make
+    // a getForeignUsers() that returns more than one? --Zach
+    static function getForeignUser($id, $service) {        
+        $fuser = new Foreign_user();
+        $fuser->whereAdd("service = $service");
+        $fuser->whereAdd("id = $id");
+        $fuser->limit(1);
+        
+        if ($fuser->find()) {
+            $fuser->fetch();
+            return $fuser;
+        }
+        
+        return NULL;        
+    }
+    
+    function updateKeys(&$orig) {
+        $parts = array();
+        foreach (array('id', 'service', 'uri', 'nickname') as $k) {
+            if (strcmp($this->$k, $orig->$k) != 0) {
+                $parts[] = $k . ' = ' . $this->_quote($this->$k);
+            }
+        }
+        if (count($parts) == 0) {
+            # No changes
+            return true;
+        }
+        $toupdate = implode(', ', $parts);
 
-               $table = $this->tableName();
-               if(common_config('db','quote_identifiers')) {
-                       $table = '"' . $table . '"';
-               }
-               $qry = 'UPDATE ' . $table . ' SET ' . $toupdate .
-                 ' WHERE id = ' . $this->id;
-               $orig->decache();
-               $result = $this->query($qry);
-               if ($result) {
-                       $this->encache();
-               }
-               return $result;
-       }
+        $table = $this->tableName();
+        if(common_config('db','quote_identifiers')) {
+            $table = '"' . $table . '"';
+        }
+        $qry = 'UPDATE ' . $table . ' SET ' . $toupdate .
+          ' WHERE id = ' . $this->id;
+        $orig->decache();
+        $result = $this->query($qry);
+        if ($result) {
+            $this->encache();
+        }
+        return $result;
+    }
 
-       
+    
 }
index 7a33e158dd1e2dffa9ee0f4300b11bf5704a7237..7699e1b38044d492f52e2f2ef14b6d10d91473d0 100644 (file)
@@ -24,151 +24,151 @@ require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
 class Memcached_DataObject extends DB_DataObject 
 {
     function &staticGet($cls, $k, $v=NULL) {
-               if (is_null($v)) {
-                       $v = $k;
-                       # XXX: HACK!
-                       $i = new $cls;
-                       $keys = $i->keys();
-                       $k = $keys[0];
-                       unset($i);
-               }
-               $i = Memcached_DataObject::getcached($cls, $k, $v);
-               if ($i) {
-                       return $i;
-               } else {
-                       $i = DB_DataObject::staticGet($cls, $k, $v);
-                       if ($i) {
-                               $i->encache();
-                       }
-                       return $i;
-               }
-       }
+        if (is_null($v)) {
+            $v = $k;
+            # XXX: HACK!
+            $i = new $cls;
+            $keys = $i->keys();
+            $k = $keys[0];
+            unset($i);
+        }
+        $i = Memcached_DataObject::getcached($cls, $k, $v);
+        if ($i) {
+            return $i;
+        } else {
+            $i = DB_DataObject::staticGet($cls, $k, $v);
+            if ($i) {
+                $i->encache();
+            }
+            return $i;
+        }
+    }
 
-       function &pkeyGet($cls, $kv) {
-               $i = Memcached_DataObject::multicache($cls, $kv);
-               if ($i) {
-                       return $i;
-               } else {
-                       $i = new $cls();
-                       foreach ($kv as $k => $v) {
-                               $i->$k = $v;
-                       }
-                       if ($i->find(true)) {
-                               $i->encache();
-                       } else {
-                               $i = NULL;
-                       }
+    function &pkeyGet($cls, $kv) {
+        $i = Memcached_DataObject::multicache($cls, $kv);
+        if ($i) {
+            return $i;
+        } else {
+            $i = new $cls();
+            foreach ($kv as $k => $v) {
+                $i->$k = $v;
+            }
+            if ($i->find(true)) {
+                $i->encache();
+            } else {
+                $i = NULL;
+            }
             return $i;
-               }
-       }
+        }
+    }
 
-       function insert() {
-               $result = parent::insert();
-               return $result;
-       }
-       
-       function update($orig=NULL) {
-               if (is_object($orig) && $orig instanceof Memcached_DataObject) {
-                       $orig->decache(); # might be different keys
-               }
-               $result = parent::update($orig);
-               if ($result) {
-                       $this->encache();
-               }
-               return $result;
-       }
-       
-       function delete() {
-               $this->decache(); # while we still have the values!
-               return parent::delete();
-       }
-       
-       static function memcache() {
-               return common_memcache();
-       }
-       
-       static function cacheKey($cls, $k, $v) {
-               return common_cache_key(strtolower($cls).':'.$k.':'.$v);
-       }
-       
-       static function getcached($cls, $k, $v) {
-               $c = Memcached_DataObject::memcache();
-               if (!$c) {
-                       return false;
-               } else {
-                       return $c->get(Memcached_DataObject::cacheKey($cls, $k, $v));
-               }
-       }
+    function insert() {
+        $result = parent::insert();
+        return $result;
+    }
+    
+    function update($orig=NULL) {
+        if (is_object($orig) && $orig instanceof Memcached_DataObject) {
+            $orig->decache(); # might be different keys
+        }
+        $result = parent::update($orig);
+        if ($result) {
+            $this->encache();
+        }
+        return $result;
+    }
+    
+    function delete() {
+        $this->decache(); # while we still have the values!
+        return parent::delete();
+    }
+    
+    static function memcache() {
+        return common_memcache();
+    }
+    
+    static function cacheKey($cls, $k, $v) {
+        return common_cache_key(strtolower($cls).':'.$k.':'.$v);
+    }
+    
+    static function getcached($cls, $k, $v) {
+        $c = Memcached_DataObject::memcache();
+        if (!$c) {
+            return false;
+        } else {
+            return $c->get(Memcached_DataObject::cacheKey($cls, $k, $v));
+        }
+    }
 
-       function keyTypes() {
-               global $_DB_DATAOBJECT;
+    function keyTypes() {
+        global $_DB_DATAOBJECT;
         if (!isset($_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"])) {
-                       $this->databaseStructure();
+            $this->databaseStructure();
 
         }
-               return $_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"];
-       }
-       
-       function encache() {
-               $c = $this->memcache();
-               if (!$c) {
-                       return false;
-               } else {
-                       $pkey = array();
-                       $pval = array();                        
-                       $types = $this->keyTypes();
-                       ksort($types);
-                       foreach ($types as $key => $type) {
-                               if ($type == 'K') {
-                                       $pkey[] = $key;
-                                       $pval[] = $this->$key;
-                               } else {
-                                       $c->set($this->cacheKey($this->tableName(), $key, $this->$key), $this);
-                               }
-                       }
-                       # XXX: should work for both compound and scalar pkeys
-                       $pvals = implode(',', $pval);
-                       $pkeys = implode(',', $pkey);
-                       $c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this);
-               }
-       }
-       
-       function decache() {
-               $c = $this->memcache();
-               if (!$c) {
-                       return false;
-               } else {
-                       $pkey = array();
-                       $pval = array();                        
-                       $types = $this->keyTypes();
-                       ksort($types);
-                       foreach ($types as $key => $type) {
-                               if ($type == 'K') {
-                                       $pkey[] = $key;
-                                       $pval[] = $this->$key;
-                               } else {
-                                       $c->delete($this->cacheKey($this->tableName(), $key, $this->$key));
-                               }
-                       }
-                       # should work for both compound and scalar pkeys
-                       # XXX: comma works for now but may not be safe separator for future keys
-                       $pvals = implode(',', $pval);
-                       $pkeys = implode(',', $pkey);
-                       $c->delete($this->cacheKey($this->tableName(), $pkeys, $pvals));
-               }
-       }
+        return $_DB_DATAOBJECT['INI'][$this->_database][$this->__table."__keys"];
+    }
+    
+    function encache() {
+        $c = $this->memcache();
+        if (!$c) {
+            return false;
+        } else {
+            $pkey = array();
+            $pval = array();            
+            $types = $this->keyTypes();
+            ksort($types);
+            foreach ($types as $key => $type) {
+                if ($type == 'K') {
+                    $pkey[] = $key;
+                    $pval[] = $this->$key;
+                } else {
+                    $c->set($this->cacheKey($this->tableName(), $key, $this->$key), $this);
+                }
+            }
+            # XXX: should work for both compound and scalar pkeys
+            $pvals = implode(',', $pval);
+            $pkeys = implode(',', $pkey);
+            $c->set($this->cacheKey($this->tableName(), $pkeys, $pvals), $this);
+        }
+    }
+    
+    function decache() {
+        $c = $this->memcache();
+        if (!$c) {
+            return false;
+        } else {
+            $pkey = array();
+            $pval = array();            
+            $types = $this->keyTypes();
+            ksort($types);
+            foreach ($types as $key => $type) {
+                if ($type == 'K') {
+                    $pkey[] = $key;
+                    $pval[] = $this->$key;
+                } else {
+                    $c->delete($this->cacheKey($this->tableName(), $key, $this->$key));
+                }
+            }
+            # should work for both compound and scalar pkeys
+            # XXX: comma works for now but may not be safe separator for future keys
+            $pvals = implode(',', $pval);
+            $pkeys = implode(',', $pkey);
+            $c->delete($this->cacheKey($this->tableName(), $pkeys, $pvals));
+        }
+    }
 
-       function multicache($cls, $kv) {
-               ksort($kv);
-               $c = Memcached_DataObject::memcache();
-               if (!$c) {
-                       return false;
-               } else {
-                       $pkeys = implode(',', array_keys($kv));
-                       $pvals = implode(',', array_values($kv));
-                       return $c->get(Memcached_DataObject::cacheKey($cls, $pkeys, $pvals));
-               }
-       }
+    function multicache($cls, $kv) {
+        ksort($kv);
+        $c = Memcached_DataObject::memcache();
+        if (!$c) {
+            return false;
+        } else {
+            $pkeys = implode(',', array_keys($kv));
+            $pvals = implode(',', array_values($kv));
+            return $c->get(Memcached_DataObject::cacheKey($cls, $pkeys, $pvals));
+        }
+    }
 
     function getSearchEngine($table) {
         require_once INSTALLDIR.'/lib/search_engines.php';
index ef4bd03161cf2978c866acd4ed45f4af8043fb4c..dc527fcb13774ebb0c52cd60844499ea728c5711 100644 (file)
@@ -26,43 +26,43 @@ class Message extends Memcached_DataObject
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
-       
-       function getFrom() {
-               return Profile::staticGet('id', $this->from_profile);
-       }
-       
-       function getTo() {
-               return Profile::staticGet('id', $this->to_profile);
-       }
-       
-       static function saveNew($from, $to, $content, $source) {
-               
-               $msg = new Message();
-               
-               $msg->from_profile = $from;
-               $msg->to_profile = $to;
-               $msg->content = common_shorten_links($content);
-               $msg->rendered = common_render_text($content);
-               $msg->created = common_sql_now();
-               $msg->source = $source;
-               
-               $result = $msg->insert();
-               
-               if (!$result) {
-                       common_log_db_error($msg, 'INSERT', __FILE__);
-                       return _('Could not insert message.');
-               }
-               
-               $orig = clone($msg);
-               $msg->uri = common_local_url('showmessage', array('message' => $msg->id));
-               
-               $result = $msg->update($orig);
-               
-               if (!$result) {
-                       common_log_db_error($msg, 'UPDATE', __FILE__);
-                       return _('Could not update message with new URI.');
-               }
-               
-               return $msg;
-       }
+    
+    function getFrom() {
+        return Profile::staticGet('id', $this->from_profile);
+    }
+    
+    function getTo() {
+        return Profile::staticGet('id', $this->to_profile);
+    }
+    
+    static function saveNew($from, $to, $content, $source) {
+        
+        $msg = new Message();
+        
+        $msg->from_profile = $from;
+        $msg->to_profile = $to;
+        $msg->content = common_shorten_links($content);
+        $msg->rendered = common_render_text($content);
+        $msg->created = common_sql_now();
+        $msg->source = $source;
+        
+        $result = $msg->insert();
+        
+        if (!$result) {
+            common_log_db_error($msg, 'INSERT', __FILE__);
+            return _('Could not insert message.');
+        }
+        
+        $orig = clone($msg);
+        $msg->uri = common_local_url('showmessage', array('message' => $msg->id));
+        
+        $result = $msg->update($orig);
+        
+        if (!$result) {
+            common_log_db_error($msg, 'UPDATE', __FILE__);
+            return _('Could not update message with new URI.');
+        }
+        
+        return $msg;
+    }
 }
index ca8283bcef35221d2a952dd6d284d565d43ca804..35e03e342d81c6b8c1aae0a948c6a77882f5d3fd 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -31,69 +31,69 @@ define('NOTICE_CACHE_WINDOW', 61);
 
 class Notice extends Memcached_DataObject
 {
-       ###START_AUTOCODE
-       /* the code below is auto generated do not remove the above tag */
-
-       public $__table = 'notice';                                                      // table name
-       public $id;                                                              // int(4)      primary_key not_null
-       public $profile_id;                                              // int(4)       not_null
-       public $uri;                                                     // varchar(255)  unique_key
-       public $content;                                                 // varchar(140)
-       public $rendered;                                                // text()
-       public $url;                                                     // varchar(255)
-       public $created;                                                 // datetime()   not_null
-       public $modified;                                                // timestamp()   not_null default_CURRENT_TIMESTAMP
-       public $reply_to;                                                // int(4)
-       public $is_local;                                                // tinyint(1)
-       public $source;                                                  // varchar(32)
-
-       /* Static get */
-       function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Notice',$k,$v); }
-
-       /* the code above is auto generated do not remove the tag below */
-       ###END_AUTOCODE
-
-       function getProfile() {
-               return Profile::staticGet('id', $this->profile_id);
-       }
-
-       function delete() {
-               $this->blowCaches(true);
-               $this->blowFavesCache(true);
-               $this->blowInboxes();
-               return parent::delete();
-       }
-
-       function saveTags() {
-               /* extract all #hastags */
-               $count = preg_match_all('/(?:^|\s)#([A-Za-z0-9_\-\.]{1,64})/', strtolower($this->content), $match);
-               if (!$count) {
-                       return true;
-               }
-
-               /* elide characters we don't want in the tag */
-               $match[1] = str_replace(array('-', '_', '.'), '', $match[1]);
-
-               /* Add them to the database */
-               foreach(array_unique($match[1]) as $hashtag) {
-                       $tag = DB_DataObject::factory('Notice_tag');
-                       $tag->notice_id = $this->id;
-                       $tag->tag = $hashtag;
-                       $tag->created = $this->created;
-                       $id = $tag->insert();
-                       if (!$id) {
-                               $last_error = PEAR::getStaticProperty('DB_DataObject','lastError');
-                               common_log(LOG_ERR, 'DB error inserting hashtag: ' . $last_error->message);
-                               common_server_error(sprintf(_('DB error inserting hashtag: %s'), $last_error->message));
-                               return;
-                       }
-               }
-               return true;
-       }
-
-       static function saveNew($profile_id, $content, $source=NULL, $is_local=1, $reply_to=NULL, $uri=NULL) {
-
-               $profile = Profile::staticGet($profile_id);
+    ###START_AUTOCODE
+    /* the code below is auto generated do not remove the above tag */
+
+    public $__table = 'notice';                             // table name
+    public $id;                                 // int(4)    primary_key not_null
+    public $profile_id;                         // int(4)     not_null
+    public $uri;                             // varchar(255)  unique_key
+    public $content;                         // varchar(140)
+    public $rendered;                         // text()
+    public $url;                             // varchar(255)
+    public $created;                         // datetime()     not_null
+    public $modified;                         // timestamp()      not_null default_CURRENT_TIMESTAMP
+    public $reply_to;                         // int(4)
+    public $is_local;                         // tinyint(1)
+    public $source;                             // varchar(32)
+
+    /* Static get */
+    function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Notice',$k,$v); }
+
+    /* the code above is auto generated do not remove the tag below */
+    ###END_AUTOCODE
+
+    function getProfile() {
+        return Profile::staticGet('id', $this->profile_id);
+    }
+
+    function delete() {
+        $this->blowCaches(true);
+        $this->blowFavesCache(true);
+        $this->blowInboxes();
+        return parent::delete();
+    }
+
+    function saveTags() {
+        /* extract all #hastags */
+        $count = preg_match_all('/(?:^|\s)#([A-Za-z0-9_\-\.]{1,64})/', strtolower($this->content), $match);
+        if (!$count) {
+            return true;
+        }
+
+        /* elide characters we don't want in the tag */
+        $match[1] = str_replace(array('-', '_', '.'), '', $match[1]);
+
+        /* Add them to the database */
+        foreach(array_unique($match[1]) as $hashtag) {
+            $tag = DB_DataObject::factory('Notice_tag');
+            $tag->notice_id = $this->id;
+            $tag->tag = $hashtag;
+            $tag->created = $this->created;
+            $id = $tag->insert();
+            if (!$id) {
+                $last_error = PEAR::getStaticProperty('DB_DataObject','lastError');
+                common_log(LOG_ERR, 'DB error inserting hashtag: ' . $last_error->message);
+                common_server_error(sprintf(_('DB error inserting hashtag: %s'), $last_error->message));
+                return;
+            }
+        }
+        return true;
+    }
+
+    static function saveNew($profile_id, $content, $source=NULL, $is_local=1, $reply_to=NULL, $uri=NULL) {
+
+        $profile = Profile::staticGet($profile_id);
 
         if (!$profile) {
             common_log(LOG_ERR, 'Problem saving notice. Unknown user.');
@@ -102,69 +102,69 @@ class Notice extends Memcached_DataObject
 
         if (common_config('throttle', 'enabled') && !Notice::checkEditThrottle($profile_id)) {
             common_log(LOG_WARNING, 'Excessive posting by profile #' . $profile_id . '; throttled.');
-                       return _('Too many notices too fast; take a breather and post again in a few minutes.');
+            return _('Too many notices too fast; take a breather and post again in a few minutes.');
         }
 
-               $banned = common_config('profile', 'banned');
+        $banned = common_config('profile', 'banned');
 
-               if ( in_array($profile_id, $banned) || in_array($profile->nickname, $banned)) {
-                       common_log(LOG_WARNING, "Attempted post from banned user: $profile->nickname (user id = $profile_id).");
+        if ( in_array($profile_id, $banned) || in_array($profile->nickname, $banned)) {
+            common_log(LOG_WARNING, "Attempted post from banned user: $profile->nickname (user id = $profile_id).");
             return _('You are banned from posting notices on this site.');
-               }
+        }
 
-               $notice = new Notice();
-               $notice->profile_id = $profile_id;
+        $notice = new Notice();
+        $notice->profile_id = $profile_id;
 
-               $blacklist = common_config('public', 'blacklist');
+        $blacklist = common_config('public', 'blacklist');
 
-               # Blacklisted are non-false, but not 1, either
+        # Blacklisted are non-false, but not 1, either
 
-               if ($blacklist && in_array($profile_id, $blacklist)) {
-                       $notice->is_local = -1;
-               } else {
-                       $notice->is_local = $is_local;
-               }
+        if ($blacklist && in_array($profile_id, $blacklist)) {
+            $notice->is_local = -1;
+        } else {
+            $notice->is_local = $is_local;
+        }
 
-               $notice->reply_to = $reply_to;
-               $notice->created = common_sql_now();
-               $notice->content = common_shorten_links($content);
-               $notice->rendered = common_render_content($notice->content, $notice);
-               $notice->source = $source;
-               $notice->uri = $uri;
+        $notice->reply_to = $reply_to;
+        $notice->created = common_sql_now();
+        $notice->content = common_shorten_links($content);
+        $notice->rendered = common_render_content($notice->content, $notice);
+        $notice->source = $source;
+        $notice->uri = $uri;
 
-               $id = $notice->insert();
+        $id = $notice->insert();
 
-               if (!$id) {
-                       common_log_db_error($notice, 'INSERT', __FILE__);
-                       return _('Problem saving notice.');
-               }
+        if (!$id) {
+            common_log_db_error($notice, 'INSERT', __FILE__);
+            return _('Problem saving notice.');
+        }
 
-               # Update the URI after the notice is in the database
-               if (!$uri) {
-                       $orig = clone($notice);
-                       $notice->uri = common_notice_uri($notice);
+        # Update the URI after the notice is in the database
+        if (!$uri) {
+            $orig = clone($notice);
+            $notice->uri = common_notice_uri($notice);
 
-                       if (!$notice->update($orig)) {
-                               common_log_db_error($notice, 'UPDATE', __FILE__);
-                               return _('Problem saving notice.');
-                       }
-               }
+            if (!$notice->update($orig)) {
+                common_log_db_error($notice, 'UPDATE', __FILE__);
+                return _('Problem saving notice.');
+            }
+        }
 
-               # XXX: do we need to change this for remote users?
+        # XXX: do we need to change this for remote users?
 
-               common_save_replies($notice);
-               $notice->saveTags();
+        common_save_replies($notice);
+        $notice->saveTags();
 
-               # Clear the cache for subscribed users, so they'll update at next request
-               # XXX: someone clever could prepend instead of clearing the cache
+        # Clear the cache for subscribed users, so they'll update at next request
+        # XXX: someone clever could prepend instead of clearing the cache
 
-               if (common_config('memcached', 'enabled')) {
-                       $notice->blowCaches();
-               }
+        if (common_config('memcached', 'enabled')) {
+            $notice->blowCaches();
+        }
 
-               $notice->addToInboxes();
-               return $notice;
-       }
+        $notice->addToInboxes();
+        return $notice;
+    }
 
     static function checkEditThrottle($profile_id) {
         $profile = Profile::staticGet($profile_id);
@@ -184,356 +184,356 @@ class Notice extends Memcached_DataObject
         return true;
     }
 
-       function blowCaches($blowLast=false) {
-               $this->blowSubsCache($blowLast);
-               $this->blowNoticeCache($blowLast);
-               $this->blowRepliesCache($blowLast);
-               $this->blowPublicCache($blowLast);
-               $this->blowTagCache($blowLast);
-       }
-
-       function blowTagCache($blowLast=false) {
-               $cache = common_memcache();
-               if ($cache) {
-                       $tag = new Notice_tag();
-                       $tag->notice_id = $this->id;
-                       if ($tag->find()) {
-                               while ($tag->fetch()) {
-                                       $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag));
-                                       if ($blowLast) {
-                                               $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag . ';last'));
-                                       }
-                               }
-                       }
-                       $tag->free();
-                       unset($tag);
-               }
-       }
-
-       function blowSubsCache($blowLast=false) {
-               $cache = common_memcache();
-               if ($cache) {
-                       $user = new User();
-
-                       $user->query('SELECT id ' .
-                                                'FROM user JOIN subscription ON user.id = subscription.subscriber ' .
-                                                'WHERE subscription.subscribed = ' . $this->profile_id);
-
-                       while ($user->fetch()) {
-                               $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
-                               if ($blowLast) {
-                                       $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id . ';last'));
-                               }
-                       }
-                       $user->free();
-                       unset($user);
-               }
-       }
-
-       function blowNoticeCache($blowLast=false) {
-               if ($this->is_local) {
-                       $cache = common_memcache();
-                       if ($cache) {
-                               $cache->delete(common_cache_key('profile:notices:'.$this->profile_id));
-                               if ($blowLast) {
-                                       $cache->delete(common_cache_key('profile:notices:'.$this->profile_id.';last'));
-                               }
-                       }
-               }
-       }
-
-       function blowRepliesCache($blowLast=false) {
-               $cache = common_memcache();
-               if ($cache) {
-                       $reply = new Reply();
-                       $reply->notice_id = $this->id;
-                       if ($reply->find()) {
-                               while ($reply->fetch()) {
-                                       $cache->delete(common_cache_key('user:replies:'.$reply->profile_id));
-                                       if ($blowLast) {
-                                               $cache->delete(common_cache_key('user:replies:'.$reply->profile_id.';last'));
-                                       }
-                               }
-                       }
-                       $reply->free();
-                       unset($reply);
-               }
-       }
-
-       function blowPublicCache($blowLast=false) {
-               if ($this->is_local == 1) {
-                       $cache = common_memcache();
-                       if ($cache) {
-                               $cache->delete(common_cache_key('public'));
-                               if ($blowLast) {
-                                       $cache->delete(common_cache_key('public').';last');
-                               }
-                       }
-               }
-       }
-
-       function blowFavesCache($blowLast=false) {
-               $cache = common_memcache();
-               if ($cache) {
-                       $fave = new Fave();
-                       $fave->notice_id = $this->id;
-                       if ($fave->find()) {
-                               while ($fave->fetch()) {
-                                       $cache->delete(common_cache_key('user:faves:'.$fave->user_id));
-                                       if ($blowLast) {
-                                               $cache->delete(common_cache_key('user:faves:'.$fave->user_id.';last'));
-                                       }
-                               }
-                       }
-                       $fave->free();
-                       unset($fave);
-               }
-       }
-
-       # XXX: too many args; we need to move to named params or even a separate
-       # class for notice streams
-
-       static function getStream($qry, $cachekey, $offset=0, $limit=20, $since_id=0, $before_id=0, $order=NULL, $since=NULL) {
-
-               if (common_config('memcached', 'enabled')) {
-
-                       # Skip the cache if this is a since, since_id or before_id qry
-                       if ($since_id > 0 || $before_id > 0 || $since) {
-                               return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
-                       } else {
-                               return Notice::getCachedStream($qry, $cachekey, $offset, $limit, $order);
-                       }
-               }
-
-               return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
-       }
-
-       static function getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since) {
-
-               $needAnd = FALSE;
-               $needWhere = TRUE;
-
-               if (preg_match('/\bWHERE\b/i', $qry)) {
-                       $needWhere = FALSE;
-                       $needAnd = TRUE;
-               }
-
-               if ($since_id > 0) {
-
-                       if ($needWhere) {
-                               $qry .= ' WHERE ';
-                               $needWhere = FALSE;
-                       } else {
-                               $qry .= ' AND ';
-                       }
-
-                       $qry .= ' notice.id > ' . $since_id;
-               }
-
-               if ($before_id > 0) {
-
-                       if ($needWhere) {
-                               $qry .= ' WHERE ';
-                               $needWhere = FALSE;
-                       } else {
-                               $qry .= ' AND ';
-                       }
-
-                       $qry .= ' notice.id < ' . $before_id;
-               }
+    function blowCaches($blowLast=false) {
+        $this->blowSubsCache($blowLast);
+        $this->blowNoticeCache($blowLast);
+        $this->blowRepliesCache($blowLast);
+        $this->blowPublicCache($blowLast);
+        $this->blowTagCache($blowLast);
+    }
+
+    function blowTagCache($blowLast=false) {
+        $cache = common_memcache();
+        if ($cache) {
+            $tag = new Notice_tag();
+            $tag->notice_id = $this->id;
+            if ($tag->find()) {
+                while ($tag->fetch()) {
+                    $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag));
+                    if ($blowLast) {
+                        $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag . ';last'));
+                    }
+                }
+            }
+            $tag->free();
+            unset($tag);
+        }
+    }
+
+    function blowSubsCache($blowLast=false) {
+        $cache = common_memcache();
+        if ($cache) {
+            $user = new User();
+
+            $user->query('SELECT id ' .
+                         'FROM user JOIN subscription ON user.id = subscription.subscriber ' .
+                         'WHERE subscription.subscribed = ' . $this->profile_id);
+
+            while ($user->fetch()) {
+                $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+                if ($blowLast) {
+                    $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id . ';last'));
+                }
+            }
+            $user->free();
+            unset($user);
+        }
+    }
+
+    function blowNoticeCache($blowLast=false) {
+        if ($this->is_local) {
+            $cache = common_memcache();
+            if ($cache) {
+                $cache->delete(common_cache_key('profile:notices:'.$this->profile_id));
+                if ($blowLast) {
+                    $cache->delete(common_cache_key('profile:notices:'.$this->profile_id.';last'));
+                }
+            }
+        }
+    }
+
+    function blowRepliesCache($blowLast=false) {
+        $cache = common_memcache();
+        if ($cache) {
+            $reply = new Reply();
+            $reply->notice_id = $this->id;
+            if ($reply->find()) {
+                while ($reply->fetch()) {
+                    $cache->delete(common_cache_key('user:replies:'.$reply->profile_id));
+                    if ($blowLast) {
+                        $cache->delete(common_cache_key('user:replies:'.$reply->profile_id.';last'));
+                    }
+                }
+            }
+            $reply->free();
+            unset($reply);
+        }
+    }
+
+    function blowPublicCache($blowLast=false) {
+        if ($this->is_local == 1) {
+            $cache = common_memcache();
+            if ($cache) {
+                $cache->delete(common_cache_key('public'));
+                if ($blowLast) {
+                    $cache->delete(common_cache_key('public').';last');
+                }
+            }
+        }
+    }
+
+    function blowFavesCache($blowLast=false) {
+        $cache = common_memcache();
+        if ($cache) {
+            $fave = new Fave();
+            $fave->notice_id = $this->id;
+            if ($fave->find()) {
+                while ($fave->fetch()) {
+                    $cache->delete(common_cache_key('user:faves:'.$fave->user_id));
+                    if ($blowLast) {
+                        $cache->delete(common_cache_key('user:faves:'.$fave->user_id.';last'));
+                    }
+                }
+            }
+            $fave->free();
+            unset($fave);
+        }
+    }
+
+    # XXX: too many args; we need to move to named params or even a separate
+    # class for notice streams
 
-               if ($since) {
-
-                       if ($needWhere) {
-                               $qry .= ' WHERE ';
-                               $needWhere = FALSE;
-                       } else {
-                               $qry .= ' AND ';
-                       }
+    static function getStream($qry, $cachekey, $offset=0, $limit=20, $since_id=0, $before_id=0, $order=NULL, $since=NULL) {
 
-                       $qry .= ' notice.created > \'' . date('Y-m-d H:i:s', $since) . '\'';
-               }
+        if (common_config('memcached', 'enabled')) {
 
-               # Allow ORDER override
+            # Skip the cache if this is a since, since_id or before_id qry
+            if ($since_id > 0 || $before_id > 0 || $since) {
+                return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
+            } else {
+                return Notice::getCachedStream($qry, $cachekey, $offset, $limit, $order);
+            }
+        }
 
-               if ($order) {
-                       $qry .= $order;
-               } else {
-                       $qry .= ' ORDER BY notice.created DESC, notice.id DESC ';
-               }
+        return Notice::getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since);
+    }
 
-               if (common_config('db','type') == 'pgsql') {
-                       $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
-               } else {
-                       $qry .= ' LIMIT ' . $offset . ', ' . $limit;
-               }
+    static function getStreamDirect($qry, $offset, $limit, $since_id, $before_id, $order, $since) {
 
-               $notice = new Notice();
+        $needAnd = FALSE;
+        $needWhere = TRUE;
 
-               $notice->query($qry);
+        if (preg_match('/\bWHERE\b/i', $qry)) {
+            $needWhere = FALSE;
+            $needAnd = TRUE;
+        }
 
-               return $notice;
-       }
+        if ($since_id > 0) {
 
-       # XXX: this is pretty long and should probably be broken up into
-       # some helper functions
+            if ($needWhere) {
+                $qry .= ' WHERE ';
+                $needWhere = FALSE;
+            } else {
+                $qry .= ' AND ';
+            }
 
-       static function getCachedStream($qry, $cachekey, $offset, $limit, $order) {
+            $qry .= ' notice.id > ' . $since_id;
+        }
 
-               # If outside our cache window, just go to the DB
+        if ($before_id > 0) {
 
-               if ($offset + $limit > NOTICE_CACHE_WINDOW) {
-                       return Notice::getStreamDirect($qry, $offset, $limit, NULL, NULL, $order, NULL);
-               }
+            if ($needWhere) {
+                $qry .= ' WHERE ';
+                $needWhere = FALSE;
+            } else {
+                $qry .= ' AND ';
+            }
 
-               # Get the cache; if we can't, just go to the DB
+            $qry .= ' notice.id < ' . $before_id;
+        }
 
-               $cache = common_memcache();
+        if ($since) {
 
-               if (!$cache) {
-                       return Notice::getStreamDirect($qry, $offset, $limit, NULL, NULL, $order, NULL);
-               }
+            if ($needWhere) {
+                $qry .= ' WHERE ';
+                $needWhere = FALSE;
+            } else {
+                $qry .= ' AND ';
+            }
 
-               # Get the notices out of the cache
+            $qry .= ' notice.created > \'' . date('Y-m-d H:i:s', $since) . '\'';
+        }
 
-               $notices = $cache->get(common_cache_key($cachekey));
+        # Allow ORDER override
 
-               # On a cache hit, return a DB-object-like wrapper
+        if ($order) {
+            $qry .= $order;
+        } else {
+            $qry .= ' ORDER BY notice.created DESC, notice.id DESC ';
+        }
 
-               if ($notices !== FALSE) {
-                       $wrapper = new NoticeWrapper(array_slice($notices, $offset, $limit));
-                       return $wrapper;
-               }
+        if (common_config('db','type') == 'pgsql') {
+            $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset;
+        } else {
+            $qry .= ' LIMIT ' . $offset . ', ' . $limit;
+        }
 
-               # If the cache was invalidated because of new data being
-               # added, we can try and just get the new stuff. We keep an additional
-               # copy of the data at the key + ';last'
+        $notice = new Notice();
 
-               # No cache hit. Try to get the *last* cached version
+        $notice->query($qry);
 
-               $last_notices = $cache->get(common_cache_key($cachekey) . ';last');
+        return $notice;
+    }
 
-               if ($last_notices) {
+    # XXX: this is pretty long and should probably be broken up into
+    # some helper functions
 
-                       # Reverse-chron order, so last ID is last.
+    static function getCachedStream($qry, $cachekey, $offset, $limit, $order) {
 
-                       $last_id = $last_notices[0]->id;
+        # If outside our cache window, just go to the DB
 
-                       # XXX: this assumes monotonically increasing IDs; a fair
-                       # bet with our DB.
+        if ($offset + $limit > NOTICE_CACHE_WINDOW) {
+            return Notice::getStreamDirect($qry, $offset, $limit, NULL, NULL, $order, NULL);
+        }
 
-                       $new_notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW,
-                                                                                                 $last_id, NULL, $order, NULL);
+        # Get the cache; if we can't, just go to the DB
 
-                       if ($new_notice) {
-                               $new_notices = array();
-                               while ($new_notice->fetch()) {
-                                       $new_notices[] = clone($new_notice);
-                               }
-                               $new_notice->free();
-                               $notices = array_slice(array_merge($new_notices, $last_notices),
-                                                                          0, NOTICE_CACHE_WINDOW);
+        $cache = common_memcache();
 
-                               # Store the array in the cache for next time
+        if (!$cache) {
+            return Notice::getStreamDirect($qry, $offset, $limit, NULL, NULL, $order, NULL);
+        }
 
-                               $result = $cache->set(common_cache_key($cachekey), $notices);
-                               $result = $cache->set(common_cache_key($cachekey) . ';last', $notices);
+        # Get the notices out of the cache
 
-                               # return a wrapper of the array for use now
+        $notices = $cache->get(common_cache_key($cachekey));
 
-                               return new NoticeWrapper(array_slice($notices, $offset, $limit));
-                       }
-               }
+        # On a cache hit, return a DB-object-like wrapper
 
-               # Otherwise, get the full cache window out of the DB
+        if ($notices !== FALSE) {
+            $wrapper = new NoticeWrapper(array_slice($notices, $offset, $limit));
+            return $wrapper;
+        }
 
-               $notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW, NULL, NULL, $order, NULL);
+        # If the cache was invalidated because of new data being
+        # added, we can try and just get the new stuff. We keep an additional
+        # copy of the data at the key + ';last'
 
-               # If there are no hits, just return the value
+        # No cache hit. Try to get the *last* cached version
 
-               if (!$notice) {
-                       return $notice;
-               }
+        $last_notices = $cache->get(common_cache_key($cachekey) . ';last');
 
-               # Pack results into an array
+        if ($last_notices) {
 
-               $notices = array();
+            # Reverse-chron order, so last ID is last.
 
-               while ($notice->fetch()) {
-                       $notices[] = clone($notice);
-               }
+            $last_id = $last_notices[0]->id;
 
-               $notice->free();
+            # XXX: this assumes monotonically increasing IDs; a fair
+            # bet with our DB.
 
-               # Store the array in the cache for next time
+            $new_notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW,
+                                                  $last_id, NULL, $order, NULL);
 
-               $result = $cache->set(common_cache_key($cachekey), $notices);
-               $result = $cache->set(common_cache_key($cachekey) . ';last', $notices);
+            if ($new_notice) {
+                $new_notices = array();
+                while ($new_notice->fetch()) {
+                    $new_notices[] = clone($new_notice);
+                }
+                $new_notice->free();
+                $notices = array_slice(array_merge($new_notices, $last_notices),
+                                       0, NOTICE_CACHE_WINDOW);
 
-               # return a wrapper of the array for use now
+                # Store the array in the cache for next time
 
-               $wrapper = new NoticeWrapper(array_slice($notices, $offset, $limit));
+                $result = $cache->set(common_cache_key($cachekey), $notices);
+                $result = $cache->set(common_cache_key($cachekey) . ';last', $notices);
 
-               return $wrapper;
-       }
+                # return a wrapper of the array for use now
 
-       function publicStream($offset=0, $limit=20, $since_id=0, $before_id=0, $since=NULL) {
+                return new NoticeWrapper(array_slice($notices, $offset, $limit));
+            }
+        }
 
-               $parts = array();
+        # Otherwise, get the full cache window out of the DB
 
-               $qry = 'SELECT * FROM notice ';
+        $notice = Notice::getStreamDirect($qry, 0, NOTICE_CACHE_WINDOW, NULL, NULL, $order, NULL);
 
-               if (common_config('public', 'localonly')) {
-                       $parts[] = 'is_local = 1';
-               } else {
-                       # -1 == blacklisted
-                       $parts[] = 'is_local != -1';
-               }
+        # If there are no hits, just return the value
 
-               if ($parts) {
-                       $qry .= ' WHERE ' . implode(' AND ', $parts);
-               }
+        if (!$notice) {
+            return $notice;
+        }
 
-               return Notice::getStream($qry,
-                                                                'public',
-                                                                $offset, $limit, $since_id, $before_id, NULL, $since);
-       }
+        # Pack results into an array
 
-       function addToInboxes() {
-               $enabled = common_config('inboxes', 'enabled');
+        $notices = array();
 
-               if ($enabled === true || $enabled === 'transitional') {
-                       $inbox = new Notice_inbox();
-                       $qry = 'INSERT INTO notice_inbox (user_id, notice_id, created) ' .
-                         'SELECT user.id, ' . $this->id . ', "' . $this->created . '" ' .
-                         'FROM user JOIN subscription ON user.id = subscription.subscriber ' .
-                         'WHERE subscription.subscribed = ' . $this->profile_id . ' ' .
-                         'AND NOT EXISTS (SELECT user_id, notice_id ' .
-                         'FROM notice_inbox ' .
-                         'WHERE user_id = user.id ' .
-                         'AND notice_id = ' . $this->id . ' )';
-                       if ($enabled === 'transitional') {
-                               $qry .= ' AND user.inboxed = 1';
-                       }
-                       $inbox->query($qry);
-               }
-               return;
-       }
+        while ($notice->fetch()) {
+            $notices[] = clone($notice);
+        }
 
-       # Delete from inboxes if we're deleted.
+        $notice->free();
 
-       function blowInboxes() {
+        # Store the array in the cache for next time
 
-               $enabled = common_config('inboxes', 'enabled');
+        $result = $cache->set(common_cache_key($cachekey), $notices);
+        $result = $cache->set(common_cache_key($cachekey) . ';last', $notices);
 
-               if ($enabled === true || $enabled === 'transitional') {
-                       $inbox = new Notice_inbox();
-                       $inbox->notice_id = $this->id;
-                       $inbox->delete();
-               }
+        # return a wrapper of the array for use now
 
-               return;
-       }
+        $wrapper = new NoticeWrapper(array_slice($notices, $offset, $limit));
+
+        return $wrapper;
+    }
+
+    function publicStream($offset=0, $limit=20, $since_id=0, $before_id=0, $since=NULL) {
+
+        $parts = array();
+
+        $qry = 'SELECT * FROM notice ';
+
+        if (common_config('public', 'localonly')) {
+            $parts[] = 'is_local = 1';
+        } else {
+            # -1 == blacklisted
+            $parts[] = 'is_local != -1';
+        }
+
+        if ($parts) {
+            $qry .= ' WHERE ' . implode(' AND ', $parts);
+        }
+
+        return Notice::getStream($qry,
+                                 'public',
+                                 $offset, $limit, $since_id, $before_id, NULL, $since);
+    }
+
+    function addToInboxes() {
+        $enabled = common_config('inboxes', 'enabled');
+
+        if ($enabled === true || $enabled === 'transitional') {
+            $inbox = new Notice_inbox();
+            $qry = 'INSERT INTO notice_inbox (user_id, notice_id, created) ' .
+              'SELECT user.id, ' . $this->id . ', "' . $this->created . '" ' .
+              'FROM user JOIN subscription ON user.id = subscription.subscriber ' .
+              'WHERE subscription.subscribed = ' . $this->profile_id . ' ' .
+              'AND NOT EXISTS (SELECT user_id, notice_id ' .
+              'FROM notice_inbox ' .
+              'WHERE user_id = user.id ' .
+              'AND notice_id = ' . $this->id . ' )';
+            if ($enabled === 'transitional') {
+                $qry .= ' AND user.inboxed = 1';
+            }
+            $inbox->query($qry);
+        }
+        return;
+    }
+
+    # Delete from inboxes if we're deleted.
+
+    function blowInboxes() {
+
+        $enabled = common_config('inboxes', 'enabled');
+
+        if ($enabled === true || $enabled === 'transitional') {
+            $inbox = new Notice_inbox();
+            $inbox->notice_id = $this->id;
+            $inbox->delete();
+        }
+
+        return;
+    }
 
 }
 
index f8c0aa38199400ec926a4283fb7ab9b17d350536..edecb30922aa537846289ea61064183a9cf447b3 100644 (file)
@@ -35,25 +35,25 @@ class NoticeWrapper extends Notice {
     public $is_local;                        // tinyint(1)  
     public $source;                          // varchar(32)  
 
-       var $notices = NULL;
-       var $i = -1;
-       
-       function __construct($arr) {
-               $this->notices = $arr;
-       }
-       
-       function fetch() {
-               static $fields = array('id', 'profile_id', 'uri', 'content', 'rendered',
-                                                          'url', 'created', 'modified', 'reply_to', 'is_local', 'source');
-               $this->i++;
-               if ($this->i >= count($this->notices)) {
-                       return false;
-               } else {
-                       $n = $this->notices[$this->i];
-                       foreach ($fields as $f) {
-                               $this->$f = $n->$f;
-                       }
-                       return true;
-               }
-       }
+    var $notices = NULL;
+    var $i = -1;
+    
+    function __construct($arr) {
+        $this->notices = $arr;
+    }
+    
+    function fetch() {
+        static $fields = array('id', 'profile_id', 'uri', 'content', 'rendered',
+                               'url', 'created', 'modified', 'reply_to', 'is_local', 'source');
+        $this->i++;
+        if ($this->i >= count($this->notices)) {
+            return false;
+        } else {
+            $n = $this->notices[$this->i];
+            foreach ($fields as $f) {
+                $this->$f = $n->$f;
+            }
+            return true;
+        }
+    }
 }
\ No newline at end of file
index 5b75ff13feb05a22bf48596ac5d73fdaf69f1759..84c4a1020b5bf47bfcad4d504a8e387b2bf052cf 100644 (file)
@@ -34,22 +34,22 @@ class Notice_tag extends Memcached_DataObject
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
-       
-       static function getStream($tag, $offset=0, $limit=20) {
-               $qry = 
-                 'SELECT notice.* ' .
-                 'FROM notice JOIN notice_tag ON notice.id = notice_tag.notice_id ' .
-                 'WHERE notice_tag.tag = "%s" ';
+    
+    static function getStream($tag, $offset=0, $limit=20) {
+        $qry = 
+          'SELECT notice.* ' .
+          'FROM notice JOIN notice_tag ON notice.id = notice_tag.notice_id ' .
+          'WHERE notice_tag.tag = "%s" ';
 
-               return Notice::getStream(sprintf($qry, $tag),
-                                                                'notice_tag:notice_stream:' . common_keyize($tag),
-                                                                $offset, $limit);
-       }
-       
-       function blowCache() {
-               $cache = common_memcache();
-               if ($cache) {
-                       $cache->delete(common_cache_key('notice_tag:notice_stream:' . $this->tag));
-               }
-       }
+        return Notice::getStream(sprintf($qry, $tag),
+                                 'notice_tag:notice_stream:' . common_keyize($tag),
+                                 $offset, $limit);
+    }
+    
+    function blowCache() {
+        $cache = common_memcache();
+        if ($cache) {
+            $cache->delete(common_cache_key('notice_tag:notice_stream:' . $this->tag));
+        }
+    }
 }
index b57d7e38ddfd8913010415321df22ae5da584d98..1f4508bf158d13b8e4df94ff9a69fedc41857f73 100644 (file)
@@ -46,114 +46,114 @@ class Profile extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-       function getAvatar($width, $height=NULL) {
-               if (is_null($height)) {
-                       $height = $width;
-               }
-               return Avatar::pkeyGet(array('profile_id' => $this->id,
-                                                                        'width' => $width,
-                                                                        'height' => $height));
-       }
-
-       function getOriginalAvatar() {
-               $avatar = DB_DataObject::factory('avatar');
-               $avatar->profile_id = $this->id;
-               $avatar->original = true;
-               if ($avatar->find(true)) {
-                       return $avatar;
-               } else {
-                       return NULL;
-               }
-       }
-
-       function setOriginal($source) {
-
-               $info = @getimagesize($source);
-
-               if (!$info) {
-                       return NULL;
-               }
-
-               $filename = common_avatar_filename($this->id,
-                                                                                  image_type_to_extension($info[2]),
-                                                                                  NULL, common_timestamp());
-               $filepath = common_avatar_path($filename);
-
-               copy($source, $filepath);
-
-               $avatar = new Avatar();
-
-               $avatar->profile_id = $this->id;
-               $avatar->width = $info[0];
-               $avatar->height = $info[1];
-               $avatar->mediatype = image_type_to_mime_type($info[2]);
-               $avatar->filename = $filename;
-               $avatar->original = true;
-               $avatar->url = common_avatar_url($filename);
-               $avatar->created = DB_DataObject_Cast::dateTime(); # current time
-
-               # XXX: start a transaction here
-
-               if (!$this->delete_avatars()) {
-                       @unlink($filepath);
-                       return NULL;
-               }
-
-               if (!$avatar->insert()) {
-                       @unlink($filepath);
-                       return NULL;
-               }
-
-               foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
-                       # We don't do a scaled one if original is our scaled size
-                       if (!($avatar->width == $size && $avatar->height == $size)) {
-                               $s = $avatar->scale($size);
-                               if (!$s) {
-                                       return NULL;
-                               }
-                       }
-               }
-
-               return $avatar;
-       }
-
-       function delete_avatars() {
-               $avatar = new Avatar();
-               $avatar->profile_id = $this->id;
-               $avatar->find();
-               while ($avatar->fetch()) {
-                       $avatar->delete();
-               }
-               return true;
-       }
-
-       function getBestName() {
-               return ($this->fullname) ? $this->fullname : $this->nickname;
-       }
+    function getAvatar($width, $height=NULL) {
+        if (is_null($height)) {
+            $height = $width;
+        }
+        return Avatar::pkeyGet(array('profile_id' => $this->id,
+                                     'width' => $width,
+                                     'height' => $height));
+    }
+
+    function getOriginalAvatar() {
+        $avatar = DB_DataObject::factory('avatar');
+        $avatar->profile_id = $this->id;
+        $avatar->original = true;
+        if ($avatar->find(true)) {
+            return $avatar;
+        } else {
+            return NULL;
+        }
+    }
+
+    function setOriginal($source) {
+
+        $info = @getimagesize($source);
+
+        if (!$info) {
+            return NULL;
+        }
+
+        $filename = common_avatar_filename($this->id,
+                                           image_type_to_extension($info[2]),
+                                           NULL, common_timestamp());
+        $filepath = common_avatar_path($filename);
+
+        copy($source, $filepath);
+
+        $avatar = new Avatar();
+
+        $avatar->profile_id = $this->id;
+        $avatar->width = $info[0];
+        $avatar->height = $info[1];
+        $avatar->mediatype = image_type_to_mime_type($info[2]);
+        $avatar->filename = $filename;
+        $avatar->original = true;
+        $avatar->url = common_avatar_url($filename);
+        $avatar->created = DB_DataObject_Cast::dateTime(); # current time
+
+        # XXX: start a transaction here
+
+        if (!$this->delete_avatars()) {
+            @unlink($filepath);
+            return NULL;
+        }
+
+        if (!$avatar->insert()) {
+            @unlink($filepath);
+            return NULL;
+        }
+
+        foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
+            # We don't do a scaled one if original is our scaled size
+            if (!($avatar->width == $size && $avatar->height == $size)) {
+                $s = $avatar->scale($size);
+                if (!$s) {
+                    return NULL;
+                }
+            }
+        }
+
+        return $avatar;
+    }
+
+    function delete_avatars() {
+        $avatar = new Avatar();
+        $avatar->profile_id = $this->id;
+        $avatar->find();
+        while ($avatar->fetch()) {
+            $avatar->delete();
+        }
+        return true;
+    }
+
+    function getBestName() {
+        return ($this->fullname) ? $this->fullname : $this->nickname;
+    }
 
     # Get latest notice on or before date; default now
-       function getCurrentNotice($dt=NULL) {
-               $notice = new Notice();
-               $notice->profile_id = $this->id;
-               if ($dt) {
-                       $notice->whereAdd('created < "' . $dt . '"');
-               }
-               $notice->orderBy('created DESC, notice.id DESC');
-               $notice->limit(1);
-               if ($notice->find(true)) {
-                       return $notice;
-               }
-               return NULL;
-       }
-
-       function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
-               $qry =
-                 'SELECT * ' .
-                 'FROM notice ' .
-                 'WHERE profile_id = %d ';
-
-               return Notice::getStream(sprintf($qry, $this->id),
-                                                                'profile:notices:'.$this->id,
-                                                                $offset, $limit, $since_id, $before_id);
-       }
+    function getCurrentNotice($dt=NULL) {
+        $notice = new Notice();
+        $notice->profile_id = $this->id;
+        if ($dt) {
+            $notice->whereAdd('created < "' . $dt . '"');
+        }
+        $notice->orderBy('created DESC, notice.id DESC');
+        $notice->limit(1);
+        if ($notice->find(true)) {
+            return $notice;
+        }
+        return NULL;
+    }
+
+    function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
+        $qry =
+          'SELECT * ' .
+          'FROM notice ' .
+          'WHERE profile_id = %d ';
+
+        return Notice::getStream(sprintf($qry, $this->id),
+                                 'profile:notices:'.$this->id,
+                                 $offset, $limit, $since_id, $before_id);
+    }
 }
index dde19aea250a5e1dc724202cd50cefc802d15ce1..2daabf86710c2974ef0cec42b03d8e27b2f882e7 100644 (file)
@@ -21,81 +21,81 @@ class Profile_tag extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-       static function getTags($tagger, $tagged) {
-               
-               $tags = array();
+    static function getTags($tagger, $tagged) {
+        
+        $tags = array();
 
-               # XXX: store this in memcached
-               
-               $profile_tag = new Profile_tag();
-               $profile_tag->tagger = $tagger;
-               $profile_tag->tagged = $tagged;
-               
-               $profile_tag->find();
-               
-               while ($profile_tag->fetch()) {
-                       $tags[] = $profile_tag->tag;
-               }
-               
-               $profile_tag->free();
-               
-               return $tags;
-       }
-       
-       static function setTags($tagger, $tagged, $newtags) {
-               
-               $oldtags = Profile_tag::getTags($tagger, $tagged);
-               
-               # Delete stuff that's old that not in new
-               
-               $to_delete = array_diff($oldtags, $newtags);
-               
-               # Insert stuff that's in new and not in old
-               
-               $to_insert = array_diff($newtags, $oldtags);
-               
-               $profile_tag = new Profile_tag();
-               
-               $profile_tag->tagger = $tagger;
-               $profile_tag->tagged = $tagged;
-               
-               $profile_tag->query('BEGIN');
-               
-               foreach ($to_delete as $deltag) {
-                       $profile_tag->tag = $deltag;
-                       $result = $profile_tag->delete();
-                       if (!$result) {
-                               common_log_db_error($profile_tag, 'DELETE', __FILE__);
-                               return false;
-                       }
-               }
-               
-               foreach ($to_insert as $instag) {
-                       $profile_tag->tag = $instag;
-                       $result = $profile_tag->insert();
-                       if (!$result) {
-                               common_log_db_error($profile_tag, 'INSERT', __FILE__);
-                               return false;
-                       }
-               }
-               
-               $profile_tag->query('COMMIT');
-               
-               return true;
-       }
-       
-       # Return profiles with a given tag
-       static function getTagged($tagger, $tag) {
-               $profile = new Profile();
-               $profile->query('SELECT profile.* ' .
-                                               'FROM profile JOIN profile_tag ' .
-                                               'ON profile.id = profile_tag.tagged ' .
-                                               'WHERE profile_tag.tagger = ' . $tagger . ' ' .
-                                               'AND profile_tag.tag = "' . $tag . '" ');
-               $tagged = array();
-               while ($profile->fetch()) {
-                       $tagged[] = clone($profile);
-               }
-               return $tagged;
-       }
+        # XXX: store this in memcached
+        
+        $profile_tag = new Profile_tag();
+        $profile_tag->tagger = $tagger;
+        $profile_tag->tagged = $tagged;
+        
+        $profile_tag->find();
+        
+        while ($profile_tag->fetch()) {
+            $tags[] = $profile_tag->tag;
+        }
+        
+        $profile_tag->free();
+        
+        return $tags;
+    }
+    
+    static function setTags($tagger, $tagged, $newtags) {
+        
+        $oldtags = Profile_tag::getTags($tagger, $tagged);
+        
+        # Delete stuff that's old that not in new
+        
+        $to_delete = array_diff($oldtags, $newtags);
+        
+        # Insert stuff that's in new and not in old
+        
+        $to_insert = array_diff($newtags, $oldtags);
+        
+        $profile_tag = new Profile_tag();
+        
+        $profile_tag->tagger = $tagger;
+        $profile_tag->tagged = $tagged;
+        
+        $profile_tag->query('BEGIN');
+        
+        foreach ($to_delete as $deltag) {
+            $profile_tag->tag = $deltag;
+            $result = $profile_tag->delete();
+            if (!$result) {
+                common_log_db_error($profile_tag, 'DELETE', __FILE__);
+                return false;
+            }
+        }
+        
+        foreach ($to_insert as $instag) {
+            $profile_tag->tag = $instag;
+            $result = $profile_tag->insert();
+            if (!$result) {
+                common_log_db_error($profile_tag, 'INSERT', __FILE__);
+                return false;
+            }
+        }
+        
+        $profile_tag->query('COMMIT');
+        
+        return true;
+    }
+    
+    # Return profiles with a given tag
+    static function getTagged($tagger, $tag) {
+        $profile = new Profile();
+        $profile->query('SELECT profile.* ' .
+                        'FROM profile JOIN profile_tag ' .
+                        'ON profile.id = profile_tag.tagged ' .
+                        'WHERE profile_tag.tagger = ' . $tagger . ' ' .
+                        'AND profile_tag.tag = "' . $tag . '" ');
+        $tagged = array();
+        while ($profile->fetch()) {
+            $tagged[] = clone($profile);
+        }
+        return $tagged;
+    }
 }
index 8ba3281de39cf30846b57eb61d4403f9099cb22b..e54b4976bdb5b5a5de4e1158c02e5837f64c7933 100644 (file)
@@ -22,34 +22,34 @@ class Queue_item extends Memcached_DataObject
     ###END_AUTOCODE
 
     function sequenceKey() { return array(false, false); }
-       
-       static function top($transport) {
-
-               $qi = new Queue_item();
-               $qi->transport = $transport;
-               $qi->orderBy('created');
-               $qi->whereAdd('claimed is NULL');
-
-               $qi->limit(1);
-
-               $cnt = $qi->find(TRUE);
-
-               if ($cnt) {
-                       # XXX: potential race condition
-                       # can we force it to only update if claimed is still NULL
-                       # (or old)?
-                       common_log(LOG_INFO, 'claiming queue item = ' . $qi->notice_id . ' for transport ' . $transport);
-                       $orig = clone($qi);
-                       $qi->claimed = common_sql_now();
-                       $result = $qi->update($orig);
-                       if ($result) {
-                               common_log(LOG_INFO, 'claim succeeded.');
-                               return $qi;
-                       } else {
-                               common_log(LOG_INFO, 'claim failed.');
-                       }
-               }
-               $qi = NULL;
-               return NULL;
-       }
+    
+    static function top($transport) {
+
+        $qi = new Queue_item();
+        $qi->transport = $transport;
+        $qi->orderBy('created');
+        $qi->whereAdd('claimed is NULL');
+
+        $qi->limit(1);
+
+        $cnt = $qi->find(TRUE);
+
+        if ($cnt) {
+            # XXX: potential race condition
+            # can we force it to only update if claimed is still NULL
+            # (or old)?
+            common_log(LOG_INFO, 'claiming queue item = ' . $qi->notice_id . ' for transport ' . $transport);
+            $orig = clone($qi);
+            $qi->claimed = common_sql_now();
+            $result = $qi->update($orig);
+            if ($result) {
+                common_log(LOG_INFO, 'claim succeeded.');
+                return $qi;
+            } else {
+                common_log(LOG_INFO, 'claim failed.');
+            }
+        }
+        $qi = NULL;
+        return NULL;
+    }
 }
index 6ecb5134684633e982eebcbe9c4493e56d6e88ca..f6e0791f997e2ec612711f98792337d06cd1cb2f 100644 (file)
@@ -21,8 +21,8 @@ class Sms_carrier extends Memcached_DataObject
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
-       
-       function toEmailAddress($sms) {
-               return sprintf($this->email_pattern, $sms);
-       }
+    
+    function toEmailAddress($sms) {
+        return sprintf($this->email_pattern, $sms);
+    }
 }
index cc174fccee3fce58e022825e893767f82ff8f3ed..a3b5e4b90d60721edc8670689bd96a5c31390d42 100644 (file)
@@ -44,8 +44,8 @@ class Subscription extends Memcached_DataObject
 
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
-       
-       function &pkeyGet($kv) {
-               return Memcached_DataObject::pkeyGet('Subscription', $kv);
-       }
+    
+    function &pkeyGet($kv) {
+        return Memcached_DataObject::pkeyGet('Subscription', $kv);
+    }
 }
index 32d5bedde1b72b6430637c1311aa6c1d84aa485d..c2c6ad57f115677cd077313be464e99769406f6f 100644 (file)
@@ -67,82 +67,82 @@ class User extends Memcached_DataObject
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-       function getProfile() {
-               return Profile::staticGet('id', $this->id);
-       }
-
-       function isSubscribed($other) {
-               assert(!is_null($other));
-               # XXX: cache results of this query
-               $sub = Subscription::pkeyGet(array('subscriber' => $this->id,
-                                                                                  'subscribed' => $other->id));
-               return (is_null($sub)) ? false : true;
-       }
-
-       # 'update' won't write key columns, so we have to do it ourselves.
-
-       function updateKeys(&$orig) {
-               $parts = array();
-               foreach (array('nickname', 'email', 'jabber', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) {
-                       if (strcmp($this->$k, $orig->$k) != 0) {
-                               $parts[] = $k . ' = ' . $this->_quote($this->$k);
-                       }
-               }
-               if (count($parts) == 0) {
-                       # No changes
-                       return true;
-               }
-               $toupdate = implode(', ', $parts);
-
-               $table = $this->tableName();
-               if(common_config('db','quote_identifiers')) {
-                       $table = '"' . $table . '"';
-               }
-               $qry = 'UPDATE ' . $table . ' SET ' . $toupdate .
-                 ' WHERE id = ' . $this->id;
-               $orig->decache();
-               $result = $this->query($qry);
-               if ($result) {
-                       $this->encache();
-               }
-               return $result;
-       }
-
-       function allowed_nickname($nickname) {
-               # XXX: should already be validated for size, content, etc.
-               static $blacklist = array('rss', 'xrds', 'doc', 'main',
-                                                                 'settings', 'notice', 'user',
-                                                                 'search', 'avatar', 'tag', 'tags',
-                                                                 'api', 'message');
-               $merged = array_merge($blacklist, common_config('nickname', 'blacklist'));
-               return !in_array($nickname, $merged);
-       }
-
-       function getCurrentNotice($dt=NULL) {
-               $profile = $this->getProfile();
-               if (!$profile) {
-                       return NULL;
-               }
-               return $profile->getCurrentNotice($dt);
-       }
-
-       function getCarrier() {
-               return Sms_carrier::staticGet('id', $this->carrier);
-       }
-
-       function subscribeTo($other) {
-               $sub = new Subscription();
-               $sub->subscriber = $this->id;
-               $sub->subscribed = $other->id;
-
-               $sub->created = common_sql_now(); # current time
-
-               if (!$sub->insert()) {
-                       return false;
-               }
-
-               return true;
-       }
+    function getProfile() {
+        return Profile::staticGet('id', $this->id);
+    }
+
+    function isSubscribed($other) {
+        assert(!is_null($other));
+        # XXX: cache results of this query
+        $sub = Subscription::pkeyGet(array('subscriber' => $this->id,
+                                           'subscribed' => $other->id));
+        return (is_null($sub)) ? false : true;
+    }
+
+    # 'update' won't write key columns, so we have to do it ourselves.
+
+    function updateKeys(&$orig) {
+        $parts = array();
+        foreach (array('nickname', 'email', 'jabber', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) {
+            if (strcmp($this->$k, $orig->$k) != 0) {
+                $parts[] = $k . ' = ' . $this->_quote($this->$k);
+            }
+        }
+        if (count($parts) == 0) {
+            # No changes
+            return true;
+        }
+        $toupdate = implode(', ', $parts);
+
+        $table = $this->tableName();
+        if(common_config('db','quote_identifiers')) {
+            $table = '"' . $table . '"';
+        }
+        $qry = 'UPDATE ' . $table . ' SET ' . $toupdate .
+          ' WHERE id = ' . $this->id;
+        $orig->decache();
+        $result = $this->query($qry);
+        if ($result) {
+            $this->encache();
+        }
+        return $result;
+    }
+
+    function allowed_nickname($nickname) {
+        # XXX: should already be validated for size, content, etc.
+        static $blacklist = array('rss', 'xrds', 'doc', 'main',
+                                  'settings', 'notice', 'user',
+                                  'search', 'avatar', 'tag', 'tags',
+                                  'api', 'message');
+        $merged = array_merge($blacklist, common_config('nickname', 'blacklist'));
+        return !in_array($nickname, $merged);
+    }
+
+    function getCurrentNotice($dt=NULL) {
+        $profile = $this->getProfile();
+        if (!$profile) {
+            return NULL;
+        }
+        return $profile->getCurrentNotice($dt);
+    }
+
+    function getCarrier() {
+        return Sms_carrier::staticGet('id', $this->carrier);
+    }
+
+    function subscribeTo($other) {
+        $sub = new Subscription();
+        $sub->subscriber = $this->id;
+        $sub->subscribed = $other->id;
+
+        $sub->created = common_sql_now(); # current time
+
+        if (!$sub->insert()) {
+            return false;
+        }
+
+        return true;
+    }
 
     function hasBlocked($other) {
 
@@ -158,193 +158,193 @@ class User extends Memcached_DataObject
         return $result;
     }
 
-       static function register($fields) {
+    static function register($fields) {
+
+        # MAGICALLY put fields into current scope
+
+        extract($fields);
+
+        $profile = new Profile();
+
+        $profile->query('BEGIN');
+
+        $profile->nickname = $nickname;
+        $profile->profileurl = common_profile_url($nickname);
+
+        if ($fullname) {
+            $profile->fullname = $fullname;
+        }
+        if ($homepage) {
+            $profile->homepage = $homepage;
+        }
+        if ($bio) {
+            $profile->bio = $bio;
+        }
+        if ($location) {
+            $profile->location = $location;
+        }
+
+        $profile->created = common_sql_now();
+
+        $id = $profile->insert();
+
+        if (!$id) {
+            common_log_db_error($profile, 'INSERT', __FILE__);
+            return FALSE;
+        }
+
+        $user = new User();
 
-               # MAGICALLY put fields into current scope
+        $user->id = $id;
+        $user->nickname = $nickname;
 
-               extract($fields);
+        if ($password) { # may not have a password for OpenID users
+            $user->password = common_munge_password($password, $id);
+        }
+
+        # Users who respond to invite email have proven their ownership of that address
+
+        if ($code) {
+            $invite = Invitation::staticGet($code);
+            if ($invite && $invite->address && $invite->address_type == 'email' && $invite->address == $email) {
+                $user->email = $invite->address;
+            }
+        }
+
+        $inboxes = common_config('inboxes', 'enabled');
 
-               $profile = new Profile();
+        if ($inboxes === true || $inboxes == 'transitional') {
+            $user->inboxed = 1;
+        }
+
+        $user->created = common_sql_now();
+        $user->uri = common_user_uri($user);
+
+        $result = $user->insert();
+
+        if (!$result) {
+            common_log_db_error($user, 'INSERT', __FILE__);
+            return FALSE;
+        }
 
-               $profile->query('BEGIN');
+        # Everyone is subscribed to themself
 
-               $profile->nickname = $nickname;
-               $profile->profileurl = common_profile_url($nickname);
+        $subscription = new Subscription();
+        $subscription->subscriber = $user->id;
+        $subscription->subscribed = $user->id;
+        $subscription->created = $user->created;
 
-               if ($fullname) {
-                       $profile->fullname = $fullname;
-               }
-               if ($homepage) {
-                       $profile->homepage = $homepage;
-               }
-               if ($bio) {
-                       $profile->bio = $bio;
-               }
-               if ($location) {
-                       $profile->location = $location;
-               }
+        $result = $subscription->insert();
+
+        if (!$result) {
+            common_log_db_error($subscription, 'INSERT', __FILE__);
+            return FALSE;
+        }
+
+        if ($email && !$user->email) {
+
+            $confirm = new Confirm_address();
+            $confirm->code = common_confirmation_code(128);
+            $confirm->user_id = $user->id;
+            $confirm->address = $email;
+            $confirm->address_type = 'email';
+
+            $result = $confirm->insert();
+            if (!$result) {
+                common_log_db_error($confirm, 'INSERT', __FILE__);
+                return FALSE;
+            }
+        }
+
+        if ($code && $user->email) {
+            $user->emailChanged();
+        }
 
-               $profile->created = common_sql_now();
+        $profile->query('COMMIT');
 
-               $id = $profile->insert();
+        if ($email && !$user->email) {
+            mail_confirm_address($user, $confirm->code, $profile->nickname, $email);
+        }
 
-               if (!$id) {
-                       common_log_db_error($profile, 'INSERT', __FILE__);
-                   return FALSE;
-               }
+        return $user;
+    }
 
-               $user = new User();
+    # Things we do when the email changes
 
-               $user->id = $id;
-               $user->nickname = $nickname;
+    function emailChanged() {
 
-               if ($password) { # may not have a password for OpenID users
-                       $user->password = common_munge_password($password, $id);
-               }
+        $invites = new Invitation();
+        $invites->address = $this->email;
+        $invites->address_type = 'email';
 
-               # Users who respond to invite email have proven their ownership of that address
+        if ($invites->find()) {
+            while ($invites->fetch()) {
+                $other = User::staticGet($invites->user_id);
+                subs_subscribe_to($other, $this);
+            }
+        }
+    }
 
-               if ($code) {
-                       $invite = Invitation::staticGet($code);
-                       if ($invite && $invite->address && $invite->address_type == 'email' && $invite->address == $email) {
-                               $user->email = $invite->address;
-                       }
-               }
-
-               $inboxes = common_config('inboxes', 'enabled');
-
-               if ($inboxes === true || $inboxes == 'transitional') {
-                       $user->inboxed = 1;
-               }
-
-               $user->created = common_sql_now();
-               $user->uri = common_user_uri($user);
-
-               $result = $user->insert();
-
-               if (!$result) {
-                       common_log_db_error($user, 'INSERT', __FILE__);
-                       return FALSE;
-               }
-
-               # Everyone is subscribed to themself
-
-               $subscription = new Subscription();
-               $subscription->subscriber = $user->id;
-               $subscription->subscribed = $user->id;
-               $subscription->created = $user->created;
-
-               $result = $subscription->insert();
-
-               if (!$result) {
-                       common_log_db_error($subscription, 'INSERT', __FILE__);
-                       return FALSE;
-               }
-
-               if ($email && !$user->email) {
-
-                       $confirm = new Confirm_address();
-                       $confirm->code = common_confirmation_code(128);
-                       $confirm->user_id = $user->id;
-                       $confirm->address = $email;
-                       $confirm->address_type = 'email';
-
-                       $result = $confirm->insert();
-                       if (!$result) {
-                               common_log_db_error($confirm, 'INSERT', __FILE__);
-                               return FALSE;
-                       }
-               }
-
-               if ($code && $user->email) {
-                       $user->emailChanged();
-               }
-
-               $profile->query('COMMIT');
-
-               if ($email && !$user->email) {
-                       mail_confirm_address($user, $confirm->code, $profile->nickname, $email);
-               }
-
-               return $user;
-       }
-
-       # Things we do when the email changes
-
-       function emailChanged() {
-
-               $invites = new Invitation();
-               $invites->address = $this->email;
-               $invites->address_type = 'email';
-
-               if ($invites->find()) {
-                       while ($invites->fetch()) {
-                               $other = User::staticGet($invites->user_id);
-                               subs_subscribe_to($other, $this);
-                       }
-               }
-       }
-
-       function hasFave($notice) {
-               $cache = common_memcache();
-
-               # XXX: Kind of a hack.
-               if ($cache) {
-                       # This is the stream of favorite notices, in rev chron
-                       # order. This forces it into cache.
-                       $faves = $this->favoriteNotices(0, NOTICE_CACHE_WINDOW);
-                       $cnt = 0;
-                       while ($faves->fetch()) {
-                               if ($faves->id < $notice->id) {
-                                       # If we passed it, it's not a fave
-                                       return false;
-                               } else if ($faves->id == $notice->id) {
-                                       # If it matches a cached notice, then it's a fave
-                                       return true;
-                               }
-                               $cnt++;
-                       }
-                       # If we're not past the end of the cache window,
-                       # then the cache has all available faves, so this one
-                       # is not a fave.
-                       if ($cnt < NOTICE_CACHE_WINDOW) {
-                               return false;
-                       }
-                       # Otherwise, cache doesn't have all faves;
-                       # fall through to the default
-               }
-               $fave = Fave::pkeyGet(array('user_id' => $this->id,
-                                                                       'notice_id' => $notice->id));
-               return ((is_null($fave)) ? false : true);
-       }
-       function mutuallySubscribed($other) {
-               return $this->isSubscribed($other) &&
-                 $other->isSubscribed($this);
-       }
+    function hasFave($notice) {
+        $cache = common_memcache();
+
+        # XXX: Kind of a hack.
+        if ($cache) {
+            # This is the stream of favorite notices, in rev chron
+            # order. This forces it into cache.
+            $faves = $this->favoriteNotices(0, NOTICE_CACHE_WINDOW);
+            $cnt = 0;
+            while ($faves->fetch()) {
+                if ($faves->id < $notice->id) {
+                    # If we passed it, it's not a fave
+                    return false;
+                } else if ($faves->id == $notice->id) {
+                    # If it matches a cached notice, then it's a fave
+                    return true;
+                }
+                $cnt++;
+            }
+            # If we're not past the end of the cache window,
+            # then the cache has all available faves, so this one
+            # is not a fave.
+            if ($cnt < NOTICE_CACHE_WINDOW) {
+                return false;
+            }
+            # Otherwise, cache doesn't have all faves;
+            # fall through to the default
+        }
+        $fave = Fave::pkeyGet(array('user_id' => $this->id,
+                                    'notice_id' => $notice->id));
+        return ((is_null($fave)) ? false : true);
+    }
+    function mutuallySubscribed($other) {
+        return $this->isSubscribed($other) &&
+          $other->isSubscribed($this);
+    }
 
         function mutuallySubscribedUsers() {
 
-               # 3-way join; probably should get cached
-               $qry = 'SELECT user.* ' .
-                 'FROM subscription sub1 JOIN user ON sub1.subscribed = user.id ' .
-                 'JOIN subscription sub2 ON user.id = sub2.subscriber ' .
-                 'WHERE sub1.subscriber = %d and sub2.subscribed = %d ' .
-                 'ORDER BY user.nickname';
-               $user = new User();
-               $user->query(sprintf($qry, $this->id, $this->id));
-
-               return $user;
-       }
-
-       function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) {
-               $qry =
-                 'SELECT notice.* ' .
-                 'FROM notice JOIN reply ON notice.id = reply.notice_id ' .
-                 'WHERE reply.profile_id = %d ';
-               return Notice::getStream(sprintf($qry, $this->id),
-                                                                'user:replies:'.$this->id,
-                                                                $offset, $limit, $since_id, $before_id, NULL, $since);
-       }
+        # 3-way join; probably should get cached
+        $qry = 'SELECT user.* ' .
+          'FROM subscription sub1 JOIN user ON sub1.subscribed = user.id ' .
+          'JOIN subscription sub2 ON user.id = sub2.subscriber ' .
+          'WHERE sub1.subscriber = %d and sub2.subscribed = %d ' .
+          'ORDER BY user.nickname';
+        $user = new User();
+        $user->query(sprintf($qry, $this->id, $this->id));
+
+        return $user;
+    }
+
+    function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) {
+        $qry =
+          'SELECT notice.* ' .
+          'FROM notice JOIN reply ON notice.id = reply.notice_id ' .
+          'WHERE reply.profile_id = %d ';
+        return Notice::getStream(sprintf($qry, $this->id),
+                                 'user:replies:'.$this->id,
+                                 $offset, $limit, $since_id, $before_id, NULL, $since);
+    }
 
         function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) {
         $profile = $this->getProfile();
@@ -353,64 +353,64 @@ class User extends Memcached_DataObject
         } else {
             return $profile->getNotices($offset, $limit, $since_id, $before_id);
         }
-       }
+    }
 
       function favoriteNotices($offset=0, $limit=NOTICES_PER_PAGE) {
-               $qry =
-                 'SELECT notice.* ' .
-                 'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
-                 'WHERE fave.user_id = %d ';
-               return Notice::getStream(sprintf($qry, $this->id),
-                                                                'user:faves:'.$this->id,
-                                                                $offset, $limit);
-       }
+        $qry =
+          'SELECT notice.* ' .
+          'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
+          'WHERE fave.user_id = %d ';
+        return Notice::getStream(sprintf($qry, $this->id),
+                                 'user:faves:'.$this->id,
+                                 $offset, $limit);
+    }
 
         function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=NULL) {
-               $enabled = common_config('inboxes', 'enabled');
-
-               # Complicated code, depending on whether we support inboxes yet
-               # XXX: make this go away when inboxes become mandatory
-
-               if ($enabled === false ||
-                       ($enabled == 'transitional' && $this->inboxed == 0)) {
-                       $qry =
-                         'SELECT notice.* ' .
-                         'FROM notice JOIN subscription ON notice.profile_id = subscription.subscribed ' .
-                         'WHERE subscription.subscriber = %d ';
-                       $order = NULL;
-               } else if ($enabled === true ||
-                          ($enabled == 'transitional' && $this->inboxed == 1)) {
-
-                       $qry =
-                         'SELECT notice.* ' .
-                         'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' .
-                         'WHERE notice_inbox.user_id = %d ';
-                       # NOTE: we override ORDER
-                       $order = 'ORDER BY notice_inbox.created DESC, notice_inbox.notice_id DESC ';
-               }
-               return Notice::getStream(sprintf($qry, $this->id),
-                                                                'user:notices_with_friends:' . $this->id,
-                                                                $offset, $limit, $since_id, $before_id,
-                                                                $order, $since);
-       }
+        $enabled = common_config('inboxes', 'enabled');
+
+        # Complicated code, depending on whether we support inboxes yet
+        # XXX: make this go away when inboxes become mandatory
+
+        if ($enabled === false ||
+            ($enabled == 'transitional' && $this->inboxed == 0)) {
+            $qry =
+              'SELECT notice.* ' .
+              'FROM notice JOIN subscription ON notice.profile_id = subscription.subscribed ' .
+              'WHERE subscription.subscriber = %d ';
+            $order = NULL;
+        } else if ($enabled === true ||
+               ($enabled == 'transitional' && $this->inboxed == 1)) {
+
+            $qry =
+              'SELECT notice.* ' .
+              'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' .
+              'WHERE notice_inbox.user_id = %d ';
+            # NOTE: we override ORDER
+            $order = 'ORDER BY notice_inbox.created DESC, notice_inbox.notice_id DESC ';
+        }
+        return Notice::getStream(sprintf($qry, $this->id),
+                                 'user:notices_with_friends:' . $this->id,
+                                 $offset, $limit, $since_id, $before_id,
+                                 $order, $since);
+    }
 
         function blowFavesCache() {
-               $cache = common_memcache();
-               if ($cache) {
-                       # Faves don't happen chronologically, so we need to blow
-                       # ;last cache, too
-                       $cache->delete(common_cache_key('user:faves:'.$this->id));
-                       $cache->delete(common_cache_key('user:faves:'.$this->id).';last');
-               }
-       }
+        $cache = common_memcache();
+        if ($cache) {
+            # Faves don't happen chronologically, so we need to blow
+            # ;last cache, too
+            $cache->delete(common_cache_key('user:faves:'.$this->id));
+            $cache->delete(common_cache_key('user:faves:'.$this->id).';last');
+        }
+    }
 
         function getSelfTags() {
-               return Profile_tag::getTags($this->id, $this->id);
-       }
+        return Profile_tag::getTags($this->id, $this->id);
+    }
 
         function setSelfTags($newtags) {
-               return Profile_tag::setTags($this->id, $this->id, $newtags);
-       }
+        return Profile_tag::setTags($this->id, $this->id, $newtags);
+    }
 
     function block($other) {
 
@@ -434,8 +434,8 @@ class User extends Memcached_DataObject
 
         # Cancel their subscription, if it exists
 
-               $sub = Subscription::pkeyGet(array('subscriber' => $other->id,
-                                                                                  'subscribed' => $this->id));
+        $sub = Subscription::pkeyGet(array('subscriber' => $other->id,
+                                           'subscribed' => $this->id));
 
         if ($sub) {
             $result = $sub->delete();
index 5a28c309133a54648024a246b85cb2689b65f9ea..95ba64d0fee5f63c646e38dc0211b185d62d3a68 100644 (file)
@@ -54,100 +54,100 @@ require_once(INSTALLDIR.'/lib/language.php');
 
 $config =
   array('site' =>
-               array('name' => 'Just another Laconica microblog',
-                         'server' => 'localhost',
-                         'theme' => 'default',
-                         'path' => '/',
-                         'logfile' => NULL,
-                         'fancy' => false,
-                         'locale_path' => INSTALLDIR.'/locale',
-                         'language' => 'en_US',
-                         'languages' => get_all_languages(),
-                     'email' =>
-                     array_key_exists('SERVER_ADMIN', $_SERVER) ? $_SERVER['SERVER_ADMIN'] : NULL,
-                         'broughtby' => NULL,
-                         'timezone' => 'UTC',
-                         'broughtbyurl' => NULL,
-                         'closed' => false,
-                         'inviteonly' => false,
+        array('name' => 'Just another Laconica microblog',
+              'server' => 'localhost',
+              'theme' => 'default',
+              'path' => '/',
+              'logfile' => NULL,
+              'fancy' => false,
+              'locale_path' => INSTALLDIR.'/locale',
+              'language' => 'en_US',
+              'languages' => get_all_languages(),
+              'email' =>
+              array_key_exists('SERVER_ADMIN', $_SERVER) ? $_SERVER['SERVER_ADMIN'] : NULL,
+              'broughtby' => NULL,
+              'timezone' => 'UTC',
+              'broughtbyurl' => NULL,
+              'closed' => false,
+              'inviteonly' => false,
               'private' => false),
-               'syslog' =>
-               array('appname' => 'laconica', # for syslog
-                         'priority' => 'debug'), # XXX: currently ignored
-               'queue' =>
-               array('enabled' => false),
-               'license' =>
-               array('url' => 'http://creativecommons.org/licenses/by/3.0/',
-                         'title' => 'Creative Commons Attribution 3.0',
-                         'image' => 'http://i.creativecommons.org/l/by/3.0/88x31.png'),
-               'mail' =>
-               array('backend' => 'mail',
-                         'params' => NULL),
-               'nickname' =>
-               array('blacklist' => array(),
-                         'featured' => array()),
-               'profile' =>
-               array('banned' => array()),
-               'avatar' =>
-               array('server' => NULL),
-               'public' =>
-               array('localonly' => true,
-                         'blacklist' => array()),
-               'theme' =>
-               array('server' => NULL),
-               'throttle' =>
+        'syslog' =>
+        array('appname' => 'laconica', # for syslog
+              'priority' => 'debug'), # XXX: currently ignored
+        'queue' =>
+        array('enabled' => false),
+        'license' =>
+        array('url' => 'http://creativecommons.org/licenses/by/3.0/',
+              'title' => 'Creative Commons Attribution 3.0',
+              'image' => 'http://i.creativecommons.org/l/by/3.0/88x31.png'),
+        'mail' =>
+        array('backend' => 'mail',
+              'params' => NULL),
+        'nickname' =>
+        array('blacklist' => array(),
+              'featured' => array()),
+        'profile' =>
+        array('banned' => array()),
+        'avatar' =>
+        array('server' => NULL),
+        'public' =>
+        array('localonly' => true,
+              'blacklist' => array()),
+        'theme' =>
+        array('server' => NULL),
+        'throttle' =>
         array('enabled' => false, // whether to throttle edits; false by default
               'count' => 20, // number of allowed messages in timespan
               'timespan' => 600), // timespan for throttling
-               'xmpp' =>
-               array('enabled' => false,
-                         'server' => 'INVALID SERVER',
-                         'port' => 5222,
-                         'user' => 'update',
-                         'encryption' => true,
-                         'resource' => 'uniquename',
-                         'password' => 'blahblahblah',
-                         'host' => NULL, # only set if != server
-                         'debug' => false, # print extra debug info
-                         'public' => array()), # JIDs of users who want to receive the public stream
+        'xmpp' =>
+        array('enabled' => false,
+              'server' => 'INVALID SERVER',
+              'port' => 5222,
+              'user' => 'update',
+              'encryption' => true,
+              'resource' => 'uniquename',
+              'password' => 'blahblahblah',
+              'host' => NULL, # only set if != server
+              'debug' => false, # print extra debug info
+              'public' => array()), # JIDs of users who want to receive the public stream
         'sphinx' =>
         array('enabled' => false,
               'server' => 'localhost',
               'port' => 3312),
-               'tag' =>
-               array('dropoff' => 864000.0),
-               'popular' =>
-               array('dropoff' => 864000.0),
-               'daemon' =>
-               array('piddir' => '/var/run',
-                         'user' => false,
-                         'group' => false),
-               'integration' =>
-               array('source' => 'Laconica'), # source attribute for Twitter
-               'memcached' =>
-               array('enabled' => false,
-                         'server' => 'localhost',
-                         'port' => 11211),
-               'inboxes' =>
-               array('enabled' => true), # on by default for new sites
-               );
+        'tag' =>
+        array('dropoff' => 864000.0),
+        'popular' =>
+        array('dropoff' => 864000.0),
+        'daemon' =>
+        array('piddir' => '/var/run',
+              'user' => false,
+              'group' => false),
+        'integration' =>
+        array('source' => 'Laconica'), # source attribute for Twitter
+        'memcached' =>
+        array('enabled' => false,
+              'server' => 'localhost',
+              'port' => 11211),
+        'inboxes' =>
+        array('enabled' => true), # on by default for new sites
+        );
 
 $config['db'] = &PEAR::getStaticProperty('DB_DataObject','options');
 
 $config['db'] =
   array('database' => 'YOU HAVE TO SET THIS IN config.php',
-           'schema_location' => INSTALLDIR . '/classes',
-               'class_location' => INSTALLDIR . '/classes',
-               'require_prefix' => 'classes/',
-               'class_prefix' => '',
-               'mirror' => NULL,
+        'schema_location' => INSTALLDIR . '/classes',
+        'class_location' => INSTALLDIR . '/classes',
+        'require_prefix' => 'classes/',
+        'class_prefix' => '',
+        'mirror' => NULL,
         'db_driver' => 'DB', # XXX: JanRain libs only work with DB
-               'quote_identifiers' => false,
-               'type' => 'mysql' );
+        'quote_identifiers' => false,
+        'type' => 'mysql' );
 
 if (function_exists('date_default_timezone_set')) {
-       /* Work internally in UTC */
-       date_default_timezone_set('UTC');
+    /* Work internally in UTC */
+    date_default_timezone_set('UTC');
 }
 
 require_once(INSTALLDIR.'/config.php');
@@ -164,9 +164,9 @@ require_once(INSTALLDIR.'/lib/Shorturl_api.php');
 require_once(INSTALLDIR.'/lib/twitter.php');
 
 function __autoload($class) {
-       if ($class == 'OAuthRequest') {
-               require_once('OAuth.php');
-       } else if (file_exists(INSTALLDIR.'/classes/' . $class . '.php')) {
+    if ($class == 'OAuthRequest') {
+        require_once('OAuth.php');
+    } else if (file_exists(INSTALLDIR.'/classes/' . $class . '.php')) {
         require_once(INSTALLDIR.'/classes/' . $class . '.php');
     }
 }
index 5ba0e7e44283d3705dac1dddae4e73df69a1fcfc..335070cc4dcf815fe44af0f1f09329b9e20bcef2 100644 (file)
@@ -21,41 +21,41 @@ if (!defined('LACONICA')) { exit(1); }
 
 class DeleteAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-               $user = common_current_user();
-               $notice_id = $this->trimmed('notice');
-               $notice = Notice::staticGet($notice_id);
-               if (!$notice) {
-                       common_user_error(_('No such notice.'));
-                       exit;
-               }
-
-               $profile = $notice->getProfile();
-               $user_profile = $user->getProfile();
-
-               if (!common_logged_in()) {
-                       common_user_error(_('Not logged in.'));
-                       exit;
-               } else if ($notice->profile_id != $user_profile->id) {
-                       common_user_error(_('Can\'t delete this notice.'));
-                       exit;
-               }
-       }
-
-       function show_top($arr=NULL) {
-               $instr = $this->get_instructions();
-               $output = common_markup_to_html($instr);
-               common_element_start('div', 'instructions');
-               common_raw($output);
-               common_element_end('div');
-       }
-
-       function get_title() {
-               return NULL;
-       }
-
-       function show_header() {
-               return;
-       }
+    function handle($args) {
+        parent::handle($args);
+        $user = common_current_user();
+        $notice_id = $this->trimmed('notice');
+        $notice = Notice::staticGet($notice_id);
+        if (!$notice) {
+            common_user_error(_('No such notice.'));
+            exit;
+        }
+
+        $profile = $notice->getProfile();
+        $user_profile = $user->getProfile();
+
+        if (!common_logged_in()) {
+            common_user_error(_('Not logged in.'));
+            exit;
+        } else if ($notice->profile_id != $user_profile->id) {
+            common_user_error(_('Can\'t delete this notice.'));
+            exit;
+        }
+    }
+
+    function show_top($arr=NULL) {
+        $instr = $this->get_instructions();
+        $output = common_markup_to_html($instr);
+        common_element_start('div', 'instructions');
+        common_raw($output);
+        common_element_end('div');
+    }
+
+    function get_title() {
+        return NULL;
+    }
+
+    function show_header() {
+        return;
+    }
 }
index 87a82ba01e59e9dba31db4dbcb6625a69bd5c548..67595861f07c3343c4a0bf7ae9811c79920c923d 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -23,261 +23,261 @@ require_once(INSTALLDIR.'/extlib/facebook/facebook.php');
 
 class FacebookAction extends Action {
 
-       function handle($args) {
-               parent::handle($args);
-       }
-
-       function get_facebook() {
-               $apikey = common_config('facebook', 'apikey');
-               $secret = common_config('facebook', 'secret');
-               return new Facebook($apikey, $secret);
-       }
-
-       function update_profile_box($facebook, $fbuid, $user) {
-
-               $notice = $user->getCurrentNotice();
-
-               # Need to include inline CSS for styling the Profile box
-
-               $style = '<style>
-               #notices {
-               clear: both;
-               margin: 0 auto;
-               padding: 0;
-               list-style-type: none;
-               width: 600px;
-               border-top: 1px solid #dec5b5;
-               }
-               #notices a:hover {
-               text-decoration: underline;
-               }
-               .notice_single {
-               clear: both;
-               display: block;
-               margin: 0;
-               padding: 5px 5px 5px 0;
-               min-height: 48px;
-               font-family: Georgia, "Times New Roman", Times, serif;
-               font-size: 13px;
-               line-height: 16px;
-               border-bottom: 1px solid #dec5b5;
-               background-color:#FCFFF5;
-               opacity:1;
-               }
-               .notice_single:hover {
-               background-color: #f7ebcc;
-               }
-               .notice_single p {
-               display: inline;
-               margin: 0;
-               padding: 0;
-               }
-               </style>';
-
-               $html = $this->render_notice($notice);
-
-               $fbml = "<fb:wide>$content $html</fb:wide>";
-               $fbml .= "<fb:narrow>$content $html</fb:narrow>";
-
-               $fbml_main = "<fb:narrow>$content $html</fb:narrow>";
-
-               $facebook->api_client->profile_setFBML(NULL, $fbuid, $fbml, NULL, NULL, $fbml_main);
-       }
-
-       # Display methods
-
-       function show_header($selected ='Home') {
-
-               # Add a timestamp to the CSS file so Facebook cache wont ignore our changes
-               $ts = filemtime(theme_file('facebookapp.css'));
-               $cssurl = theme_path('facebookapp.css') . "?ts=$ts";
-
-               $header = '<link rel="stylesheet" type="text/css" href="'. $cssurl . '" />';
-               # $header .='<script src="" ></script>';
-               $header .= '<fb:dashboard/>';
-
-               $header .=
-                       '<fb:tabs>'
-                       .'<fb:tab-item title="Home" href="index.php" selected="' . ($selected == 'Home') .'" />'
-                       .'<fb:tab-item title="Invite Friends"  href="invite.php" selected="' . ($selected == 'Invite') . '" />'
-                       .'<fb:tab-item title="Settings"  href="settings.php" selected="' . ($selected == 'Settings') . '" />'
-                       .'</fb:tabs>';
-               $header .= '<div id="main_body">';
-
-         echo $header;
-
-       }
-
-       function show_footer() {
-         $footer = '</div>';
-         echo $footer;
-       }
-
-       function show_login_form() {
-
-               $loginform =
-                       ' <h2>To add the Identi.ca application, you need to log into your Identi.ca account.</h2>'
-                       .'<a href="http://identi.ca/">'
-                       .'      <img src="http://theme.identi.ca/identica/logo.png" alt="Identi.ca" id="logo"/>'
-                       .'</a>'
-                       .'<h1 class="pagetitle">Login</h1>'
-                       .'<div class="instructions">'
-                       .'      <p>Login with your username and password. Don\'t have a username yet?'
-                       .'        <a href="http://identi.ca/main/register">Register</a> a new account.'
-                       .'      </p>'
-                       .'</div>'
-                       .'<div id="content">'
-                       .'      <form method="post" id="login">'
-                       .'        <p>'
-                       .'              <label for="nickname">Nickname</label>'
-                       .'              <input name="nickname" type="text" class="input_text" id="nickname"/>'
-                       .'        </p>'
-                       .'        <p>'
-                       .'                <label for="password">Password</label>'
-                       .'              <input name="password" type="password" class="password" id="password"/>'
-                       .'        </p>'
-                       .'        <p>'
-                       .'              <input type="submit" id="submit" name="submit" class="submit" value="Login"/>'
-                       .'        </p>'
-                       .'      </form>'
-                       .'      <p>'
-                       .'        <a href="http://identi.ca/main/recoverpassword">Lost or forgotten password?</a>'
-                       .'      </p>'
-                       .'</div';
-
-                       echo $loginform;
-       }
-
-       function render_notice($notice) {
-
-               global $config;
-
-               $profile = $notice->getProfile();
-               $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
-
-               $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
-
-               # XXX: we need to figure this out better. Is this right?
-               if (strcmp($notice->uri, $noticeurl) != 0 && preg_match('/^http/', $notice->uri)) {
-                       $noticeurl = $notice->uri;
-               }
-
-               $html =
-               '<li class="notice_single" id="' . $notice->id . '">'
-               .'<a href="' . $profile->profileurl . '">'
-               .'<img src="';
-
-               if ($avatar) {
-                       $html .= common_avatar_display_url($avatar);
-               } else {
-                       $html .= common_default_avatar(AVATAR_STREAM_SIZE);
-               }
-
-               $html .=
-               '" class="avatar stream" width="'
-               . AVATAR_STREAM_SIZE . '" height="' . AVATAR_STREAM_SIZE .'"'
-               .' alt="';
-
-               if ($profile->fullname) {
-                       $html .= $profile->fullname;
-               } else {
-                       $html .= $profile->nickname;
-               }
-
-               $html .=
-               '"></a>'
-               .'<a href="' .  $profile->profileurl . '" class="nickname">' . $profile->nickname . '</a>'
-               .'<p class="content">' . $notice->rendered . '</p>'
-               .'<p class="time">'
-               .'<a class="permalink" href="' . $noticeurl . '" title="' . common_exact_date($notice->created) . '">' . common_date_string($notice->created) . '</a>';
-
-               if ($notice->source) {
-                       $html .= _(' from ');
-                       $html .= $this->source_link($notice->source);
-               }
-
-               if ($notice->reply_to) {
-                       $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to));
-                       $html .=
-                       ' (<a class="inreplyto" href="' . $replyurl . '">' . _('in reply to...') . ')';
-               }
-
-               $html .= '</p></li>';
-
-               return $html;
-       }
-
-       function source_link($source) {
-               $source_name = _($source);
-
-               $html = '<span class="noticesource">';
-
-               switch ($source) {
-                case 'web':
-                case 'xmpp':
-                case 'mail':
-                case 'omb':
-                case 'api':
-                       $html .= $source_name;
-                       break;
-                default:
-                       $ns = Notice_source::staticGet($source);
-                       if ($ns) {
-                               $html .= '<a href="' . $ns->url . '">' . $ns->name . '</a>';
-                       } else {
-                               $html .= $source_name;
-                       }
-                       break;
-               }
-
-               $html .= '</span>';
-
-               return $html;
-       }
-
-       function pagination($have_before, $have_after, $page, $fbaction, $args=NULL) {
-
-               $html = '';
-
-               if ($have_before || $have_after) {
-                       $html = '<div id="pagination">';
-                       $html .'<ul id="nav_pagination">';
-               }
-
-               if ($have_before) {
-                       $pargs = array('page' => $page-1);
-                       $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
-                       $html .= '<li class="before">';
-                       $html .'<a href="' . $this->pagination_url($fbaction, $newargs) . '">' . _('« After') . '</a>';
-                       $html .'</li>';
-               }
-
-               if ($have_after) {
-                       $pargs = array('page' => $page+1);
-                       $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
-                       $html .= '<li class="after">';
-                       $html .'<a href="' . $this->pagination_url($fbaction, $newargs) . '">' . _('Before Â»') . '</a>';
-                       $html .'</li>';
-               }
-
-               if ($have_before || $have_after) {
-                       $html .= '<ul>';
-                       $html .'<div>';
-               }
-       }
-
-       function pagination_url($fbaction, $args=NULL) {
-               global $config;
-
-               $extra = '';
-
-               if ($args) {
-                       foreach ($args as $key => $value) {
-                               $extra .= "&${key}=${value}";
-                       }
-               }
-
-               return "$fbaction?${extra}";
-       }
+    function handle($args) {
+        parent::handle($args);
+    }
+
+    function get_facebook() {
+        $apikey = common_config('facebook', 'apikey');
+        $secret = common_config('facebook', 'secret');
+        return new Facebook($apikey, $secret);
+    }
+
+    function update_profile_box($facebook, $fbuid, $user) {
+
+        $notice = $user->getCurrentNotice();
+
+        # Need to include inline CSS for styling the Profile box
+
+        $style = '<style>
+        #notices {
+        clear: both;
+        margin: 0 auto;
+        padding: 0;
+        list-style-type: none;
+        width: 600px;
+        border-top: 1px solid #dec5b5;
+        }
+        #notices a:hover {
+        text-decoration: underline;
+        }
+        .notice_single {
+        clear: both;
+        display: block;
+        margin: 0;
+        padding: 5px 5px 5px 0;
+        min-height: 48px;
+        font-family: Georgia, "Times New Roman", Times, serif;
+        font-size: 13px;
+        line-height: 16px;
+        border-bottom: 1px solid #dec5b5;
+        background-color:#FCFFF5;
+        opacity:1;
+        }
+        .notice_single:hover {
+        background-color: #f7ebcc;
+        }
+        .notice_single p {
+        display: inline;
+        margin: 0;
+        padding: 0;
+        }
+        </style>';
+
+        $html = $this->render_notice($notice);
+
+        $fbml = "<fb:wide>$content $html</fb:wide>";
+        $fbml .= "<fb:narrow>$content $html</fb:narrow>";
+
+        $fbml_main = "<fb:narrow>$content $html</fb:narrow>";
+
+        $facebook->api_client->profile_setFBML(NULL, $fbuid, $fbml, NULL, NULL, $fbml_main);
+    }
+
+    # Display methods
+
+    function show_header($selected ='Home') {
+
+        # Add a timestamp to the CSS file so Facebook cache wont ignore our changes
+        $ts = filemtime(theme_file('facebookapp.css'));
+        $cssurl = theme_path('facebookapp.css') . "?ts=$ts";
+
+         $header = '<link rel="stylesheet" type="text/css" href="'. $cssurl . '" />';
+         # $header .='<script src="" ></script>';
+          $header .= '<fb:dashboard/>';
+
+          $header .=
+            '<fb:tabs>'
+            .'<fb:tab-item title="Home" href="index.php" selected="' . ($selected == 'Home') .'" />'
+            .'<fb:tab-item title="Invite Friends"  href="invite.php" selected="' . ($selected == 'Invite') . '" />'
+            .'<fb:tab-item title="Settings"     href="settings.php" selected="' . ($selected == 'Settings') . '" />'
+            .'</fb:tabs>';
+          $header .= '<div id="main_body">';
+
+      echo $header;
+
+    }
+
+    function show_footer() {
+      $footer = '</div>';
+      echo $footer;
+    }
+
+    function show_login_form() {
+
+        $loginform =
+            ' <h2>To add the Identi.ca application, you need to log into your Identi.ca account.</h2>'
+            .'<a href="http://identi.ca/">'
+            .'    <img src="http://theme.identi.ca/identica/logo.png" alt="Identi.ca" id="logo"/>'
+            .'</a>'
+            .'<h1 class="pagetitle">Login</h1>'
+            .'<div class="instructions">'
+            .'    <p>Login with your username and password. Don\'t have a username yet?'
+            .'      <a href="http://identi.ca/main/register">Register</a> a new account.'
+            .'    </p>'
+            .'</div>'
+            .'<div id="content">'
+            .'    <form method="post" id="login">'
+            .'      <p>'
+            .'        <label for="nickname">Nickname</label>'
+            .'        <input name="nickname" type="text" class="input_text" id="nickname"/>'
+            .'      </p>'
+            .'      <p>'
+            .'          <label for="password">Password</label>'
+            .'        <input name="password" type="password" class="password" id="password"/>'
+            .'      </p>'
+            .'      <p>'
+            .'        <input type="submit" id="submit" name="submit" class="submit" value="Login"/>'
+            .'      </p>'
+            .'    </form>'
+            .'    <p>'
+            .'      <a href="http://identi.ca/main/recoverpassword">Lost or forgotten password?</a>'
+            .'    </p>'
+            .'</div';
+
+            echo $loginform;
+    }
+
+    function render_notice($notice) {
+
+        global $config;
+
+        $profile = $notice->getProfile();
+        $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
+
+        $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
+
+        # XXX: we need to figure this out better. Is this right?
+        if (strcmp($notice->uri, $noticeurl) != 0 && preg_match('/^http/', $notice->uri)) {
+            $noticeurl = $notice->uri;
+        }
+
+        $html =
+        '<li class="notice_single" id="' . $notice->id . '">'
+        .'<a href="' . $profile->profileurl . '">'
+        .'<img src="';
+
+        if ($avatar) {
+            $html .= common_avatar_display_url($avatar);
+        } else {
+            $html .= common_default_avatar(AVATAR_STREAM_SIZE);
+        }
+
+        $html .=
+        '" class="avatar stream" width="'
+        . AVATAR_STREAM_SIZE . '" height="' . AVATAR_STREAM_SIZE .'"'
+        .' alt="';
+
+        if ($profile->fullname) {
+            $html .= $profile->fullname;
+        } else {
+            $html .= $profile->nickname;
+        }
+
+        $html .=
+        '"></a>'
+        .'<a href="' .    $profile->profileurl . '" class="nickname">' . $profile->nickname . '</a>'
+        .'<p class="content">' . $notice->rendered . '</p>'
+        .'<p class="time">'
+        .'<a class="permalink" href="' . $noticeurl . '" title="' . common_exact_date($notice->created) . '">' . common_date_string($notice->created) . '</a>';
+
+        if ($notice->source) {
+            $html .= _(' from ');
+            $html .= $this->source_link($notice->source);
+        }
+
+        if ($notice->reply_to) {
+            $replyurl = common_local_url('shownotice', array('notice' => $notice->reply_to));
+            $html .=
+            ' (<a class="inreplyto" href="' . $replyurl . '">' . _('in reply to...') . ')';
+        }
+
+        $html .= '</p></li>';
+
+        return $html;
+    }
+
+    function source_link($source) {
+        $source_name = _($source);
+
+        $html = '<span class="noticesource">';
+
+        switch ($source) {
+         case 'web':
+         case 'xmpp':
+         case 'mail':
+         case 'omb':
+         case 'api':
+            $html .= $source_name;
+            break;
+         default:
+            $ns = Notice_source::staticGet($source);
+            if ($ns) {
+                $html .= '<a href="' . $ns->url . '">' . $ns->name . '</a>';
+            } else {
+                $html .= $source_name;
+            }
+            break;
+        }
+
+        $html .= '</span>';
+
+        return $html;
+    }
+
+    function pagination($have_before, $have_after, $page, $fbaction, $args=NULL) {
+
+        $html = '';
+
+        if ($have_before || $have_after) {
+            $html = '<div id="pagination">';
+            $html .'<ul id="nav_pagination">';
+        }
+
+        if ($have_before) {
+            $pargs = array('page' => $page-1);
+            $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
+            $html .= '<li class="before">';
+            $html .'<a href="' . $this->pagination_url($fbaction, $newargs) . '">' . _('« After') . '</a>';
+            $html .'</li>';
+        }
+
+        if ($have_after) {
+            $pargs = array('page' => $page+1);
+            $newargs = ($args) ? array_merge($args,$pargs) : $pargs;
+            $html .= '<li class="after">';
+            $html .'<a href="' . $this->pagination_url($fbaction, $newargs) . '">' . _('Before Â»') . '</a>';
+            $html .'</li>';
+        }
+
+        if ($have_before || $have_after) {
+            $html .= '<ul>';
+            $html .'<div>';
+        }
+    }
+
+    function pagination_url($fbaction, $args=NULL) {
+        global $config;
+
+        $extra = '';
+
+        if ($args) {
+            foreach ($args as $key => $value) {
+                $extra .= "&${key}=${value}";
+            }
+        }
+
+        return "$fbaction?${extra}";
+    }
 
 }
index d7f9c9ff1b91b9959aafa8365612ce09fb15e022..aa705be30dbf6558ad6af696e411f284e9cb6bec 100644 (file)
@@ -23,122 +23,122 @@ require_once(INSTALLDIR.'/lib/omb.php');
 
 class LaconicaOAuthDataStore extends OAuthDataStore {
 
-       # We keep a record of who's contacted us
+    # We keep a record of who's contacted us
 
-       function lookup_consumer($consumer_key) {
-               $con = Consumer::staticGet('consumer_key', $consumer_key);
-               if (!$con) {
-                       $con = new Consumer();
-                       $con->consumer_key = $consumer_key;
-                       $con->seed = common_good_rand(16);
-                       $con->created = DB_DataObject_Cast::dateTime();
-                       if (!$con->insert()) {
-                               return NULL;
-                       }
-               }
-               return new OAuthConsumer($con->consumer_key, '');
-       }
+    function lookup_consumer($consumer_key) {
+        $con = Consumer::staticGet('consumer_key', $consumer_key);
+        if (!$con) {
+            $con = new Consumer();
+            $con->consumer_key = $consumer_key;
+            $con->seed = common_good_rand(16);
+            $con->created = DB_DataObject_Cast::dateTime();
+            if (!$con->insert()) {
+                return NULL;
+            }
+        }
+        return new OAuthConsumer($con->consumer_key, '');
+    }
 
-       function lookup_token($consumer, $token_type, $token_key) {
-               $t = new Token();
-               $t->consumer_key = $consumer->key;
-               $t->tok = $token_key;
-               $t->type = ($token_type == 'access') ? 1 : 0;
-               if ($t->find(true)) {
-                       return new OAuthToken($t->tok, $t->secret);
-               } else {
-                       return NULL;
-               }
-       }
+    function lookup_token($consumer, $token_type, $token_key) {
+        $t = new Token();
+        $t->consumer_key = $consumer->key;
+        $t->tok = $token_key;
+        $t->type = ($token_type == 'access') ? 1 : 0;
+        if ($t->find(true)) {
+            return new OAuthToken($t->tok, $t->secret);
+        } else {
+            return NULL;
+        }
+    }
 
-       function lookup_nonce($consumer, $token, $nonce, $timestamp) {
-               $n = new Nonce();
-               $n->consumer_key = $consumer->key;
-               $n->tok = $token->key;
-               $n->nonce = $nonce;
-               if ($n->find(TRUE)) {
-                       return TRUE;
-               } else {
-                       $n->timestamp = $timestamp;
-                       $n->created = DB_DataObject_Cast::dateTime();
-                       $n->insert();
-                       return FALSE;
-               }
-       }
+    function lookup_nonce($consumer, $token, $nonce, $timestamp) {
+        $n = new Nonce();
+        $n->consumer_key = $consumer->key;
+        $n->tok = $token->key;
+        $n->nonce = $nonce;
+        if ($n->find(TRUE)) {
+            return TRUE;
+        } else {
+            $n->timestamp = $timestamp;
+            $n->created = DB_DataObject_Cast::dateTime();
+            $n->insert();
+            return FALSE;
+        }
+    }
 
-       function new_request_token($consumer) {
-               $t = new Token();
-               $t->consumer_key = $consumer->key;
-               $t->tok = common_good_rand(16);
-               $t->secret = common_good_rand(16);
-               $t->type = 0; # request
-               $t->state = 0; # unauthorized
-               $t->created = DB_DataObject_Cast::dateTime();
-               if (!$t->insert()) {
-                       return NULL;
-               } else {
-                       return new OAuthToken($t->tok, $t->secret);
-               }
-       }
+    function new_request_token($consumer) {
+        $t = new Token();
+        $t->consumer_key = $consumer->key;
+        $t->tok = common_good_rand(16);
+        $t->secret = common_good_rand(16);
+        $t->type = 0; # request
+        $t->state = 0; # unauthorized
+        $t->created = DB_DataObject_Cast::dateTime();
+        if (!$t->insert()) {
+            return NULL;
+        } else {
+            return new OAuthToken($t->tok, $t->secret);
+        }
+    }
 
-       # defined in OAuthDataStore, but not implemented anywhere
+    # defined in OAuthDataStore, but not implemented anywhere
 
-       function fetch_request_token($consumer) {
-               return $this->new_request_token($consumer);
-       }
+    function fetch_request_token($consumer) {
+        return $this->new_request_token($consumer);
+    }
 
-       function new_access_token($token, $consumer) {
-               common_debug('new_access_token("'.$token->key.'","'.$consumer->key.'")', __FILE__);
-               $rt = new Token();
-               $rt->consumer_key = $consumer->key;
-               $rt->tok = $token->key;
-               $rt->type = 0; # request
-               if ($rt->find(TRUE) && $rt->state == 1) { # authorized
-                       common_debug('request token found.', __FILE__);
-                       $at = new Token();
-                       $at->consumer_key = $consumer->key;
-                       $at->tok = common_good_rand(16);
-                       $at->secret = common_good_rand(16);
-                       $at->type = 1; # access
-                       $at->created = DB_DataObject_Cast::dateTime();
-                       if (!$at->insert()) {
-                               $e = $at->_lastError;
-                               common_debug('access token "'.$at->tok.'" not inserted: "'.$e->message.'"', __FILE__);
-                               return NULL;
-                       } else {
-                               common_debug('access token "'.$at->tok.'" inserted', __FILE__);
-                               # burn the old one
-                               $orig_rt = clone($rt);
-                               $rt->state = 2; # used
-                               if (!$rt->update($orig_rt)) {
-                                       return NULL;
-                               }
-                               common_debug('request token "'.$rt->tok.'" updated', __FILE__);
-                               # Update subscription
-                               # XXX: mixing levels here
-                               $sub = Subscription::staticGet('token', $rt->tok);
-                               if (!$sub) {
-                                       return NULL;
-                               }
-                               common_debug('subscription for request token found', __FILE__);
-                               $orig_sub = clone($sub);
-                               $sub->token = $at->tok;
-                               $sub->secret = $at->secret;
-                               if (!$sub->update($orig_sub)) {
-                                       return NULL;
-                               } else {
-                                       common_debug('subscription updated to use access token', __FILE__);
-                                       return new OAuthToken($at->tok, $at->secret);
-                               }
-                       }
-               } else {
-                       return NULL;
-               }
-       }
+    function new_access_token($token, $consumer) {
+        common_debug('new_access_token("'.$token->key.'","'.$consumer->key.'")', __FILE__);
+        $rt = new Token();
+        $rt->consumer_key = $consumer->key;
+        $rt->tok = $token->key;
+        $rt->type = 0; # request
+        if ($rt->find(TRUE) && $rt->state == 1) { # authorized
+            common_debug('request token found.', __FILE__);
+            $at = new Token();
+            $at->consumer_key = $consumer->key;
+            $at->tok = common_good_rand(16);
+            $at->secret = common_good_rand(16);
+            $at->type = 1; # access
+            $at->created = DB_DataObject_Cast::dateTime();
+            if (!$at->insert()) {
+                $e = $at->_lastError;
+                common_debug('access token "'.$at->tok.'" not inserted: "'.$e->message.'"', __FILE__);
+                return NULL;
+            } else {
+                common_debug('access token "'.$at->tok.'" inserted', __FILE__);
+                # burn the old one
+                $orig_rt = clone($rt);
+                $rt->state = 2; # used
+                if (!$rt->update($orig_rt)) {
+                    return NULL;
+                }
+                common_debug('request token "'.$rt->tok.'" updated', __FILE__);
+                # Update subscription
+                # XXX: mixing levels here
+                $sub = Subscription::staticGet('token', $rt->tok);
+                if (!$sub) {
+                    return NULL;
+                }
+                common_debug('subscription for request token found', __FILE__);
+                $orig_sub = clone($sub);
+                $sub->token = $at->tok;
+                $sub->secret = $at->secret;
+                if (!$sub->update($orig_sub)) {
+                    return NULL;
+                } else {
+                    common_debug('subscription updated to use access token', __FILE__);
+                    return new OAuthToken($at->tok, $at->secret);
+                }
+            }
+        } else {
+            return NULL;
+        }
+    }
 
-       # defined in OAuthDataStore, but not implemented anywhere
+    # defined in OAuthDataStore, but not implemented anywhere
 
-       function fetch_access_token($consumer) {
-               return $this->new_access_token($consumer);
-       }
+    function fetch_access_token($consumer) {
+        return $this->new_access_token($consumer);
+    }
 }
index 96736b4d47918bd11a25a3092cabfac838695864..94ccc2ecd2b1aceee4d8a5cf3ea3b5e59718bd33 100644 (file)
@@ -44,256 +44,256 @@ define('OAUTH_POST_BODY', OAUTH_NAMESPACE.'parameters/post-body');
 define('OAUTH_HMAC_SHA1', OAUTH_NAMESPACE.'signature/HMAC-SHA1');
 
 function omb_oauth_consumer() {
-       static $con = NULL;
-       if (!$con) {
-               $con = new OAuthConsumer(common_root_url(), '');
-       }
-       return $con;
+    static $con = NULL;
+    if (!$con) {
+        $con = new OAuthConsumer(common_root_url(), '');
+    }
+    return $con;
 }
 
 function omb_oauth_server() {
-       static $server = null;
-       if (!$server) {
-               $server = new OAuthServer(omb_oauth_datastore());
-               $server->add_signature_method(omb_hmac_sha1());
-       }
-       return $server;
+    static $server = null;
+    if (!$server) {
+        $server = new OAuthServer(omb_oauth_datastore());
+        $server->add_signature_method(omb_hmac_sha1());
+    }
+    return $server;
 }
 
 function omb_oauth_datastore() {
-       static $store = NULL;
-       if (!$store) {
-               $store = new LaconicaOAuthDataStore();
-       }
-       return $store;
+    static $store = NULL;
+    if (!$store) {
+        $store = new LaconicaOAuthDataStore();
+    }
+    return $store;
 }
 
 function omb_hmac_sha1() {
-       static $hmac_method = NULL;
-       if (!$hmac_method) {
-               $hmac_method = new OAuthSignatureMethod_HMAC_SHA1();
-       }
-       return $hmac_method;
+    static $hmac_method = NULL;
+    if (!$hmac_method) {
+        $hmac_method = new OAuthSignatureMethod_HMAC_SHA1();
+    }
+    return $hmac_method;
 }
 
 function omb_get_services($xrd, $type) {
-       return $xrd->services(array(omb_service_filter($type)));
+    return $xrd->services(array(omb_service_filter($type)));
 }
 
 function omb_service_filter($type) {
-       return create_function('$s',
-                                                  'return omb_match_service($s, \''.$type.'\');');
+    return create_function('$s',
+                           'return omb_match_service($s, \''.$type.'\');');
 }
 
 function omb_match_service($service, $type) {
-       return in_array($type, $service->getTypes());
+    return in_array($type, $service->getTypes());
 }
 
 function omb_service_uri($service) {
-       if (!$service) {
-               return NULL;
-       }
-       $uris = $service->getURIs();
-       if (!$uris) {
-               return NULL;
-       }
-       return $uris[0];
+    if (!$service) {
+        return NULL;
+    }
+    $uris = $service->getURIs();
+    if (!$uris) {
+        return NULL;
+    }
+    return $uris[0];
 }
 
 function omb_local_id($service) {
-       if (!$service) {
-               return NULL;
-       }
-       $els = $service->getElements('xrd:LocalID');
-       if (!$els) {
-               return NULL;
-       }
-       $el = $els[0];
-       return $service->parser->content($el);
+    if (!$service) {
+        return NULL;
+    }
+    $els = $service->getElements('xrd:LocalID');
+    if (!$els) {
+        return NULL;
+    }
+    $el = $els[0];
+    return $service->parser->content($el);
 }
 
 function omb_broadcast_remote_subscribers($notice) {
 
-       # First, get remote users subscribed to this profile
-       $rp = new Remote_profile();
+    # First, get remote users subscribed to this profile
+    $rp = new Remote_profile();
 
-       $rp->query('SELECT postnoticeurl, token, secret ' .
-                          'FROM subscription JOIN remote_profile ' .
-                          'ON subscription.subscriber = remote_profile.id ' .
-                          'WHERE subscription.subscribed = ' . $notice->profile_id . ' ');
+    $rp->query('SELECT postnoticeurl, token, secret ' .
+               'FROM subscription JOIN remote_profile ' .
+               'ON subscription.subscriber = remote_profile.id ' .
+               'WHERE subscription.subscribed = ' . $notice->profile_id . ' ');
 
-       $posted = array();
+    $posted = array();
 
-       while ($rp->fetch()) {
-               if (!$posted[$rp->postnoticeurl]) {
-                       common_log(LOG_DEBUG, 'Posting to ' . $rp->postnoticeurl);
-                       if (omb_post_notice_keys($notice, $rp->postnoticeurl, $rp->token, $rp->secret)) {
-                               common_log(LOG_DEBUG, 'Finished to ' . $rp->postnoticeurl);
-                               $posted[$rp->postnoticeurl] = TRUE;
-                       } else {
-                               common_log(LOG_DEBUG, 'Failed posting to ' . $rp->postnoticeurl);
-                       }
-               }
-       }
+    while ($rp->fetch()) {
+        if (!$posted[$rp->postnoticeurl]) {
+            common_log(LOG_DEBUG, 'Posting to ' . $rp->postnoticeurl);
+            if (omb_post_notice_keys($notice, $rp->postnoticeurl, $rp->token, $rp->secret)) {
+                common_log(LOG_DEBUG, 'Finished to ' . $rp->postnoticeurl);
+                $posted[$rp->postnoticeurl] = TRUE;
+            } else {
+                common_log(LOG_DEBUG, 'Failed posting to ' . $rp->postnoticeurl);
+            }
+        }
+    }
 
-       $rp->free();
-       unset($rp);
+    $rp->free();
+    unset($rp);
 
-       return true;
+    return true;
 }
 
 function omb_post_notice($notice, $remote_profile, $subscription) {
-       return omb_post_notice_keys($notice, $remote_profile->postnoticeurl, $subscription->token, $subscription->secret);
+    return omb_post_notice_keys($notice, $remote_profile->postnoticeurl, $subscription->token, $subscription->secret);
 }
 
 function omb_post_notice_keys($notice, $postnoticeurl, $tk, $secret) {
 
-       common_debug('Posting notice ' . $notice->id . ' to ' . $postnoticeurl, __FILE__);
+    common_debug('Posting notice ' . $notice->id . ' to ' . $postnoticeurl, __FILE__);
 
-       $user = User::staticGet('id', $notice->profile_id);
+    $user = User::staticGet('id', $notice->profile_id);
 
-       if (!$user) {
-               common_debug('Failed to get user for notice ' . $notice->id . ', profile = ' . $notice->profile_id, __FILE__);
-               return false;
-       }
+    if (!$user) {
+        common_debug('Failed to get user for notice ' . $notice->id . ', profile = ' . $notice->profile_id, __FILE__);
+        return false;
+    }
 
-       $con = omb_oauth_consumer();
+    $con = omb_oauth_consumer();
 
-       $token = new OAuthToken($tk, $secret);
+    $token = new OAuthToken($tk, $secret);
 
-       $url = $postnoticeurl;
-       $parsed = parse_url($url);
-       $params = array();
-       parse_str($parsed['query'], $params);
+    $url = $postnoticeurl;
+    $parsed = parse_url($url);
+    $params = array();
+    parse_str($parsed['query'], $params);
 
-       $req = OAuthRequest::from_consumer_and_token($con, $token,
-                                                                                                'POST', $url, $params);
+    $req = OAuthRequest::from_consumer_and_token($con, $token,
+                                                 'POST', $url, $params);
 
-       $req->set_parameter('omb_version', OMB_VERSION_01);
-       $req->set_parameter('omb_listenee', $user->uri);
-       $req->set_parameter('omb_notice', $notice->uri);
-       $req->set_parameter('omb_notice_content', $notice->content);
-       $req->set_parameter('omb_notice_url', common_local_url('shownotice',
-                                                                                                                  array('notice' =>
-                                                                                                                                $notice->id)));
-       $req->set_parameter('omb_notice_license', common_config('license', 'url'));
+    $req->set_parameter('omb_version', OMB_VERSION_01);
+    $req->set_parameter('omb_listenee', $user->uri);
+    $req->set_parameter('omb_notice', $notice->uri);
+    $req->set_parameter('omb_notice_content', $notice->content);
+    $req->set_parameter('omb_notice_url', common_local_url('shownotice',
+                                                           array('notice' =>
+                                                                 $notice->id)));
+    $req->set_parameter('omb_notice_license', common_config('license', 'url'));
 
-       $user->free();
-       unset($user);
+    $user->free();
+    unset($user);
 
-       $req->sign_request(omb_hmac_sha1(), $con, $token);
+    $req->sign_request(omb_hmac_sha1(), $con, $token);
 
-       # We re-use this tool's fetcher, since it's pretty good
+    # We re-use this tool's fetcher, since it's pretty good
 
-       $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+    $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
 
-       if (!$fetcher) {
-               common_log(LOG_WARNING, 'Failed to initialize Yadis fetcher.', __FILE__);
-               return false;
-       }
+    if (!$fetcher) {
+        common_log(LOG_WARNING, 'Failed to initialize Yadis fetcher.', __FILE__);
+        return false;
+    }
 
-       $result = $fetcher->post($req->get_normalized_http_url(),
-                                                        $req->to_postdata(),
+    $result = $fetcher->post($req->get_normalized_http_url(),
+                             $req->to_postdata(),
                              array('User-Agent' => 'Laconica/' . LACONICA_VERSION));
 
-       common_debug('Got HTTP result "'.print_r($result,TRUE).'"', __FILE__);
-
-       if ($result->status == 403) { # not authorized, don't send again
-               common_debug('403 result, deleting subscription', __FILE__);
-               # FIXME: figure out how to delete this
-               # $subscription->delete();
-               return false;
-       } else if ($result->status != 200) {
-               common_debug('Error status '.$result->status, __FILE__);
-               return false;
-       } else { # success!
-               parse_str($result->body, $return);
-               if ($return['omb_version'] == OMB_VERSION_01) {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
+    common_debug('Got HTTP result "'.print_r($result,TRUE).'"', __FILE__);
+
+    if ($result->status == 403) { # not authorized, don't send again
+        common_debug('403 result, deleting subscription', __FILE__);
+        # FIXME: figure out how to delete this
+        # $subscription->delete();
+        return false;
+    } else if ($result->status != 200) {
+        common_debug('Error status '.$result->status, __FILE__);
+        return false;
+    } else { # success!
+        parse_str($result->body, $return);
+        if ($return['omb_version'] == OMB_VERSION_01) {
+            return true;
+        } else {
+            return false;
+        }
+    }
 }
 
 function omb_broadcast_profile($profile) {
-       # First, get remote users subscribed to this profile
-       # XXX: use a join here rather than looping through results
-       $sub = new Subscription();
-       $sub->subscribed = $profile->id;
-       if ($sub->find()) {
-               $updated = array();
-               while ($sub->fetch()) {
-                       $rp = Remote_profile::staticGet('id', $sub->subscriber);
-                       if ($rp) {
-                               if (!$updated[$rp->updateprofileurl]) {
-                                       if (omb_update_profile($profile, $rp, $sub)) {
-                                               $updated[$rp->updateprofileurl] = TRUE;
-                                       }
-                               }
-                       }
-               }
-       }
+    # First, get remote users subscribed to this profile
+    # XXX: use a join here rather than looping through results
+    $sub = new Subscription();
+    $sub->subscribed = $profile->id;
+    if ($sub->find()) {
+        $updated = array();
+        while ($sub->fetch()) {
+            $rp = Remote_profile::staticGet('id', $sub->subscriber);
+            if ($rp) {
+                if (!$updated[$rp->updateprofileurl]) {
+                    if (omb_update_profile($profile, $rp, $sub)) {
+                        $updated[$rp->updateprofileurl] = TRUE;
+                    }
+                }
+            }
+        }
+    }
 }
 
 function omb_update_profile($profile, $remote_profile, $subscription) {
-       global $config; # for license URL
-       $user = User::staticGet($profile->id);
-       $con = omb_oauth_consumer();
-       $token = new OAuthToken($subscription->token, $subscription->secret);
-       $url = $remote_profile->updateprofileurl;
-       $parsed = parse_url($url);
-       $params = array();
-       parse_str($parsed['query'], $params);
-       $req = OAuthRequest::from_consumer_and_token($con, $token,
-                                                                                                "POST", $url, $params);
-       $req->set_parameter('omb_version', OMB_VERSION_01);
-       $req->set_parameter('omb_listenee', $user->uri);
-       $req->set_parameter('omb_listenee_profile', common_profile_url($profile->nickname));
-       $req->set_parameter('omb_listenee_nickname', $profile->nickname);
-
-       # We use blanks to force emptying any existing values in these optional fields
-
-       $req->set_parameter('omb_listenee_fullname',
-                                               ($profile->fullname) ? $profile->fullname : '');
-       $req->set_parameter('omb_listenee_homepage',
-                                               ($profile->homepage) ? $profile->homepage : '');
-       $req->set_parameter('omb_listenee_bio',
-                                               ($profile->bio) ? $profile->bio : '');
-       $req->set_parameter('omb_listenee_location',
-                                               ($profile->location) ? $profile->location : '');
-
-       $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
-       $req->set_parameter('omb_listenee_avatar',
-                                               ($avatar) ? $avatar->url : '');
-
-       $req->sign_request(omb_hmac_sha1(), $con, $token);
-
-       # We re-use this tool's fetcher, since it's pretty good
-
-       $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
-
-       common_debug('request URL = '.$req->get_normalized_http_url(), __FILE__);
-       common_debug('postdata = '.$req->to_postdata(), __FILE__);
-       $result = $fetcher->post($req->get_normalized_http_url(),
-                                                        $req->to_postdata(),
+    global $config; # for license URL
+    $user = User::staticGet($profile->id);
+    $con = omb_oauth_consumer();
+    $token = new OAuthToken($subscription->token, $subscription->secret);
+    $url = $remote_profile->updateprofileurl;
+    $parsed = parse_url($url);
+    $params = array();
+    parse_str($parsed['query'], $params);
+    $req = OAuthRequest::from_consumer_and_token($con, $token,
+                                                 "POST", $url, $params);
+    $req->set_parameter('omb_version', OMB_VERSION_01);
+    $req->set_parameter('omb_listenee', $user->uri);
+    $req->set_parameter('omb_listenee_profile', common_profile_url($profile->nickname));
+    $req->set_parameter('omb_listenee_nickname', $profile->nickname);
+
+    # We use blanks to force emptying any existing values in these optional fields
+
+    $req->set_parameter('omb_listenee_fullname',
+                        ($profile->fullname) ? $profile->fullname : '');
+    $req->set_parameter('omb_listenee_homepage',
+                        ($profile->homepage) ? $profile->homepage : '');
+    $req->set_parameter('omb_listenee_bio',
+                        ($profile->bio) ? $profile->bio : '');
+    $req->set_parameter('omb_listenee_location',
+                        ($profile->location) ? $profile->location : '');
+
+    $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+    $req->set_parameter('omb_listenee_avatar',
+                        ($avatar) ? $avatar->url : '');
+
+    $req->sign_request(omb_hmac_sha1(), $con, $token);
+
+    # We re-use this tool's fetcher, since it's pretty good
+
+    $fetcher = Auth_Yadis_Yadis::getHTTPFetcher();
+
+    common_debug('request URL = '.$req->get_normalized_http_url(), __FILE__);
+    common_debug('postdata = '.$req->to_postdata(), __FILE__);
+    $result = $fetcher->post($req->get_normalized_http_url(),
+                             $req->to_postdata(),
                              array('User-Agent' => 'Laconica/' . LACONICA_VERSION));
 
-       common_debug('Got HTTP result "'.print_r($result,TRUE).'"', __FILE__);
-
-       if ($result->status == 403) { # not authorized, don't send again
-               common_debug('403 result, deleting subscription', __FILE__);
-               $subscription->delete();
-               return false;
-       } else if ($result->status != 200) {
-               common_debug('Error status '.$result->status, __FILE__);
-               return false;
-       } else { # success!
-               parse_str($result->body, $return);
-               if ($return['omb_version'] == OMB_VERSION_01) {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
+    common_debug('Got HTTP result "'.print_r($result,TRUE).'"', __FILE__);
+
+    if ($result->status == 403) { # not authorized, don't send again
+        common_debug('403 result, deleting subscription', __FILE__);
+        $subscription->delete();
+        return false;
+    } else if ($result->status != 200) {
+        common_debug('Error status '.$result->status, __FILE__);
+        return false;
+    } else { # success!
+        parse_str($result->body, $return);
+        if ($return['omb_version'] == OMB_VERSION_01) {
+            return true;
+        } else {
+            return false;
+        }
+    }
 }
index 6e501c2b10727211cf64d4ee8a7eabb07c55772c..ebc5ed168dc70235f844ba053f312336bf98a905 100644 (file)
@@ -33,210 +33,210 @@ define('OPENID_COOKIE_KEY', 'lastusedopenid');
 
 function oid_store() {
     static $store = NULL;
-       if (!$store) {
-               # Can't be called statically
-               $user = new User();
-               $conn = $user->getDatabaseConnection();
-               $store = new Auth_OpenID_MySQLStore($conn);
-       }
-       return $store;
+    if (!$store) {
+        # Can't be called statically
+        $user = new User();
+        $conn = $user->getDatabaseConnection();
+        $store = new Auth_OpenID_MySQLStore($conn);
+    }
+    return $store;
 }
 
 function oid_consumer() {
-       $store = oid_store();
-       $consumer = new Auth_OpenID_Consumer($store);
-       return $consumer;
+    $store = oid_store();
+    $consumer = new Auth_OpenID_Consumer($store);
+    return $consumer;
 }
 
 function oid_clear_last() {
-       oid_set_last('');
+    oid_set_last('');
 }
 
 function oid_set_last($openid_url) {
-       common_set_cookie(OPENID_COOKIE_KEY,
-                                $openid_url,
-                                time() + OPENID_COOKIE_EXPIRY);
+    common_set_cookie(OPENID_COOKIE_KEY,
+                     $openid_url,
+                     time() + OPENID_COOKIE_EXPIRY);
 }
 
 function oid_get_last() {
-       $openid_url = $_COOKIE[OPENID_COOKIE_KEY];
-       if ($openid_url && strlen($openid_url) > 0) {
-               return $openid_url;
-       } else {
-               return NULL;
-       }
+    $openid_url = $_COOKIE[OPENID_COOKIE_KEY];
+    if ($openid_url && strlen($openid_url) > 0) {
+        return $openid_url;
+    } else {
+        return NULL;
+    }
 }
 
 function oid_link_user($id, $canonical, $display) {
 
-       $oid = new User_openid();
-       $oid->user_id = $id;
-       $oid->canonical = $canonical;
-       $oid->display = $display;
-       $oid->created = DB_DataObject_Cast::dateTime();
+    $oid = new User_openid();
+    $oid->user_id = $id;
+    $oid->canonical = $canonical;
+    $oid->display = $display;
+    $oid->created = DB_DataObject_Cast::dateTime();
 
-       if (!$oid->insert()) {
-               $err = PEAR::getStaticProperty('DB_DataObject','lastError');
-               common_debug('DB error ' . $err->code . ': ' . $err->message, __FILE__);
-               return false;
-       }
+    if (!$oid->insert()) {
+        $err = PEAR::getStaticProperty('DB_DataObject','lastError');
+        common_debug('DB error ' . $err->code . ': ' . $err->message, __FILE__);
+        return false;
+    }
 
-       return true;
+    return true;
 }
 
 function oid_get_user($openid_url) {
-       $user = NULL;
-       $oid = User_openid::staticGet('canonical', $openid_url);
-       if ($oid) {
-               $user = User::staticGet('id', $oid->user_id);
-       }
-       return $user;
+    $user = NULL;
+    $oid = User_openid::staticGet('canonical', $openid_url);
+    if ($oid) {
+        $user = User::staticGet('id', $oid->user_id);
+    }
+    return $user;
 }
 
 function oid_check_immediate($openid_url, $backto=NULL) {
-       if (!$backto) {
-               $action = $_REQUEST['action'];
-               $args = common_copy_args($_GET);
-               unset($args['action']);
-               $backto = common_local_url($action, $args);
-       }
-       common_debug('going back to "' . $backto . '"', __FILE__);
-
-       common_ensure_session();
-
-       $_SESSION['openid_immediate_backto'] = $backto;
-       common_debug('passed-in variable is "' . $backto . '"', __FILE__);
-       common_debug('session variable is "' . $_SESSION['openid_immediate_backto'] . '"', __FILE__);
-
-       oid_authenticate($openid_url,
-                                        'finishimmediate',
-                                        true);
+    if (!$backto) {
+        $action = $_REQUEST['action'];
+        $args = common_copy_args($_GET);
+        unset($args['action']);
+        $backto = common_local_url($action, $args);
+    }
+    common_debug('going back to "' . $backto . '"', __FILE__);
+
+    common_ensure_session();
+
+    $_SESSION['openid_immediate_backto'] = $backto;
+    common_debug('passed-in variable is "' . $backto . '"', __FILE__);
+    common_debug('session variable is "' . $_SESSION['openid_immediate_backto'] . '"', __FILE__);
+
+    oid_authenticate($openid_url,
+                     'finishimmediate',
+                     true);
 }
 
 function oid_authenticate($openid_url, $returnto, $immediate=false) {
 
-       $consumer = oid_consumer();
-
-       if (!$consumer) {
-               common_server_error(_('Cannot instantiate OpenID consumer object.'));
-               return false;
-       }
-
-       common_ensure_session();
-
-       $auth_request = $consumer->begin($openid_url);
-
-       // Handle failure status return values.
-       if (!$auth_request) {
-               return _('Not a valid OpenID.');
-       } else if (Auth_OpenID::isFailure($auth_request)) {
-               return sprintf(_('OpenID failure: %s'), $auth_request->message);
-       }
-
-       $sreg_request = Auth_OpenID_SRegRequest::build(// Required
-                                                                                                  array(),
-                                                                                                  // Optional
-                                                                                                  array('nickname',
-                                                                                                                'email',
-                                                                                                                'fullname',
-                                                                                                                'language',
-                                                                                                                'timezone',
-                                                                                                                'postcode',
-                                                                                                                'country'));
-
-       if ($sreg_request) {
-               $auth_request->addExtension($sreg_request);
-       }
-
-       $trust_root = common_local_url('public');
-       $process_url = common_local_url($returnto);
-
-       if ($auth_request->shouldSendRedirect()) {
-               $redirect_url = $auth_request->redirectURL($trust_root,
-                                                                                                  $process_url,
-                                                                                                  $immediate);
-               if (!$redirect_url) {
-               } else if (Auth_OpenID::isFailure($redirect_url)) {
-                       return sprintf(_('Could not redirect to server: %s'), $redirect_url->message);
-               } else {
-                       common_redirect($redirect_url);
-               }
-       } else {
-               // Generate form markup and render it.
-               $form_id = 'openid_message';
-               $form_html = $auth_request->formMarkup($trust_root, $process_url,
-                                                                                          $immediate, array('id' => $form_id));
-
-               # XXX: This is cheap, but things choke if we don't escape ampersands
-               # in the HTML attributes
-
-               $form_html = preg_replace('/&/', '&amp;', $form_html);
-
-               // Display an error if the form markup couldn't be generated;
-               // otherwise, render the HTML.
-               if (Auth_OpenID::isFailure($form_html)) {
-                       $this->show_form(sprintf(_('Could not create OpenID form: %s'), $form_html->message));
-               } else {
-                       common_show_header(_('OpenID Auto-Submit'), NULL, NULL, '_oid_print_instructions');
-                       common_raw($form_html);
-                       common_element('script', NULL,
-                                                  '$(document).ready(function() { ' .
-                                                  '    $("#'. $form_id .'").submit(); '.
-                                                  '});');
-                       common_show_footer();
-               }
-       }
+    $consumer = oid_consumer();
+
+    if (!$consumer) {
+        common_server_error(_('Cannot instantiate OpenID consumer object.'));
+        return false;
+    }
+
+    common_ensure_session();
+
+    $auth_request = $consumer->begin($openid_url);
+
+    // Handle failure status return values.
+    if (!$auth_request) {
+        return _('Not a valid OpenID.');
+    } else if (Auth_OpenID::isFailure($auth_request)) {
+        return sprintf(_('OpenID failure: %s'), $auth_request->message);
+    }
+
+    $sreg_request = Auth_OpenID_SRegRequest::build(// Required
+                                                   array(),
+                                                   // Optional
+                                                   array('nickname',
+                                                         'email',
+                                                         'fullname',
+                                                         'language',
+                                                         'timezone',
+                                                         'postcode',
+                                                         'country'));
+
+    if ($sreg_request) {
+        $auth_request->addExtension($sreg_request);
+    }
+
+    $trust_root = common_local_url('public');
+    $process_url = common_local_url($returnto);
+
+    if ($auth_request->shouldSendRedirect()) {
+        $redirect_url = $auth_request->redirectURL($trust_root,
+                                                   $process_url,
+                                                   $immediate);
+        if (!$redirect_url) {
+        } else if (Auth_OpenID::isFailure($redirect_url)) {
+            return sprintf(_('Could not redirect to server: %s'), $redirect_url->message);
+        } else {
+            common_redirect($redirect_url);
+        }
+    } else {
+        // Generate form markup and render it.
+        $form_id = 'openid_message';
+        $form_html = $auth_request->formMarkup($trust_root, $process_url,
+                                               $immediate, array('id' => $form_id));
+
+        # XXX: This is cheap, but things choke if we don't escape ampersands
+        # in the HTML attributes
+
+        $form_html = preg_replace('/&/', '&amp;', $form_html);
+
+        // Display an error if the form markup couldn't be generated;
+        // otherwise, render the HTML.
+        if (Auth_OpenID::isFailure($form_html)) {
+            $this->show_form(sprintf(_('Could not create OpenID form: %s'), $form_html->message));
+        } else {
+            common_show_header(_('OpenID Auto-Submit'), NULL, NULL, '_oid_print_instructions');
+            common_raw($form_html);
+            common_element('script', NULL,
+                           '$(document).ready(function() { ' .
+                           '    $("#'. $form_id .'").submit(); '.
+                           '});');
+            common_show_footer();
+        }
+    }
 }
 
 # Half-assed attempt at a module-private function
 
 function _oid_print_instructions() {
-       common_element('div', 'instructions',
-                                  _('This form should automatically submit itself. '.
-                                         'If not, click the submit button to go to your '.
-                                         'OpenID provider.'));
+    common_element('div', 'instructions',
+                   _('This form should automatically submit itself. '.
+                      'If not, click the submit button to go to your '.
+                      'OpenID provider.'));
 }
 
 # update a user from sreg parameters
 
 function oid_update_user(&$user, &$sreg) {
 
-       $profile = $user->getProfile();
+    $profile = $user->getProfile();
 
-       $orig_profile = clone($profile);
+    $orig_profile = clone($profile);
 
-       if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
-               $profile->fullname = $sreg['fullname'];
-       }
+    if ($sreg['fullname'] && strlen($sreg['fullname']) <= 255) {
+        $profile->fullname = $sreg['fullname'];
+    }
 
-       if ($sreg['country']) {
-               if ($sreg['postcode']) {
-                       # XXX: use postcode to get city and region
-                       # XXX: also, store postcode somewhere -- it's valuable!
-                       $profile->location = $sreg['postcode'] . ', ' . $sreg['country'];
-               } else {
-                       $profile->location = $sreg['country'];
-               }
-       }
+    if ($sreg['country']) {
+        if ($sreg['postcode']) {
+            # XXX: use postcode to get city and region
+            # XXX: also, store postcode somewhere -- it's valuable!
+            $profile->location = $sreg['postcode'] . ', ' . $sreg['country'];
+        } else {
+            $profile->location = $sreg['country'];
+        }
+    }
 
-       # XXX save language if it's passed
-       # XXX save timezone if it's passed
+    # XXX save language if it's passed
+    # XXX save timezone if it's passed
 
-       if (!$profile->update($orig_profile)) {
-               common_server_error(_('Error saving the profile.'));
-               return false;
-       }
+    if (!$profile->update($orig_profile)) {
+        common_server_error(_('Error saving the profile.'));
+        return false;
+    }
 
-       $orig_user = clone($user);
+    $orig_user = clone($user);
 
-       if ($sreg['email'] && Validate::email($sreg['email'], true)) {
-               $user->email = $sreg['email'];
-       }
+    if ($sreg['email'] && Validate::email($sreg['email'], true)) {
+        $user->email = $sreg['email'];
+    }
 
-       if (!$user->update($orig_user)) {
-               common_server_error(_('Error saving the user.'));
-               return false;
-       }
+    if (!$user->update($orig_user)) {
+        common_server_error(_('Error saving the user.'));
+        return false;
+    }
 
-       return true;
+    return true;
 }
index 86433b4867fea94ea4e77f539ea7d81fb2d034ec..1928349a3904013028109baffba068cc66293543 100644 (file)
 if (!defined('LACONICA')) { exit(1); }
 
 class PersonalAction extends Action {
-       
-       function is_readonly() {
-               return true;
-       }
-       
-       function handle($args) {
-               parent::handle($args);
-           common_set_returnto($this->self_url());
-       }
-
-       function views_menu() {
-
-               $user = NULL;
-               $action = $this->trimmed('action');
-               $nickname = $this->trimmed('nickname');
-
-               if ($nickname) {
-                       $user = User::staticGet('nickname', $nickname);
-                       $user_profile = $user->getProfile();
-               } else {
-                       $user_profile = false;
-               }
-
-               common_element_start('ul', array('id' => 'nav_views'));
-
-               common_menu_item(common_local_url('all', array('nickname' =>
-                                                                                                          $nickname)),
-                                                _('Personal'),
-                                                sprintf(_('%s and friends'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
-                                                $action == 'all');
-               common_menu_item(common_local_url('replies', array('nickname' =>
-                                                                                                                         $nickname)),
-                                                _('Replies'),
-                                                sprintf(_('Replies to %s'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
-                                                $action == 'replies');
-               common_menu_item(common_local_url('showstream', array('nickname' =>
-                                                                                                                         $nickname)),
-                                                _('Profile'),
-                                                ($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname,
-                                                $action == 'showstream');
-               common_menu_item(common_local_url('showfavorites', array('nickname' =>
-                                                                                                                         $nickname)),
-                                                _('Favorites'),
-                                                sprintf(_('%s\'s favorite notices'), ($user_profile) ? $user_profile->getBestName() : _('User')),
-                                                $action == 'showfavorites');
-               
-               $cur = common_current_user();
-               
-               if ($cur && $cur->id == $user->id) {
-                       
-                       common_menu_item(common_local_url('inbox', array('nickname' =>
-                                                                                                                                        $nickname)),
-                                                        _('Inbox'),
-                                                        _('Your incoming messages'),
-                                                        $action == 'inbox');
-                       common_menu_item(common_local_url('outbox', array('nickname' =>
-                                                                                                                                        $nickname)),
-                                                        _('Outbox'),
-                                                        _('Your sent messages'),
-                                                        $action == 'outbox');
-               }
-               
-               common_element_end('ul');
-       }
-
-       function show_feeds_list($feeds) {
-               common_element_start('div', array('class' => 'feeds'));
-               common_element('p', null, 'Feeds:');
-               common_element_start('ul', array('class' => 'xoxo'));
-
-               foreach ($feeds as $key => $value) {
-                       $this->common_feed_item($feeds[$key]);
-               }
-               common_element_end('ul');
-               common_element_end('div');
-       }
-
-       function common_feed_item($feed) {
-               $nickname = $this->trimmed('nickname');
-
-               switch($feed['item']) {
-                       case 'notices': default:
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "$nickname's ".$feed['version']." notice feed";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'allrss':
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = $feed['version']." feed for $nickname and friends";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'repliesrss':
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = $feed['version']." feed for replies to $nickname";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'publicrss':
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "Public timeline ".$feed['version']." feed";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'publicatom':
-                               $feed_classname = "atom";
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "Public timeline ".$feed['version']." feed";
-                               $feed['textContent'] = "Atom";
-                               break;
-
-                       case 'tagrss':
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = $feed['version']." feed for this tag";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'favoritedrss':
-                               $feed_classname = $feed['type'];
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "Favorited ".$feed['version']." feed";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'foaf':
-                               $feed_classname = "foaf";
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "$nickname's FOAF file";
-                               $feed['textContent'] = "FOAF";
-                               break;
-
-                       case 'favoritesrss':
-                               $feed_classname = "favorites";
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "Feed for favorites of $nickname";
-                               $feed['textContent'] = "RSS";
-                               break;
-
-                       case 'usertimeline':
-                               $feed_classname = "atom";
-                               $feed_mimetype = "application/".$feed['type']."+xml";
-                               $feed_title = "$nickname's ".$feed['version']." notice feed";
-                               $feed['textContent'] = "Atom";
-                               break;
-               }
-               common_element_start('li');
-               common_element('a', array('href' => $feed['href'],
-                                                                 'class' => $feed_classname,
-                                                                 'type' => $feed_mimetype,
-                                                                 'title' => $feed_title),
-                                                       $feed['textContent']);
-               common_element_end('li');
-       }
-
-       
-       function source_link($source) {
-               $source_name = _($source);
-               switch ($source) {
-                case 'web':
-                case 'xmpp':
-                case 'mail':
-                case 'omb':
-                case 'api':
-                       common_element('span', 'noticesource', $source_name);
-                       break;
-                default:
-                       $ns = Notice_source::staticGet($source);
-                       if ($ns) {
-                               common_element('a', array('href' => $ns->url),
-                                                          $ns->name);
-                       } else {
-                               common_element('span', 'noticesource', $source_name);
-                       }
-                       break;
-               }
-               return;
-       }
+    
+    function is_readonly() {
+        return true;
+    }
+    
+    function handle($args) {
+        parent::handle($args);
+        common_set_returnto($this->self_url());
+    }
+
+    function views_menu() {
+
+        $user = NULL;
+        $action = $this->trimmed('action');
+        $nickname = $this->trimmed('nickname');
+
+        if ($nickname) {
+            $user = User::staticGet('nickname', $nickname);
+            $user_profile = $user->getProfile();
+        } else {
+            $user_profile = false;
+        }
+
+        common_element_start('ul', array('id' => 'nav_views'));
+
+        common_menu_item(common_local_url('all', array('nickname' =>
+                                                       $nickname)),
+                         _('Personal'),
+                         sprintf(_('%s and friends'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
+                         $action == 'all');
+        common_menu_item(common_local_url('replies', array('nickname' =>
+                                                              $nickname)),
+                         _('Replies'),
+                         sprintf(_('Replies to %s'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
+                         $action == 'replies');
+        common_menu_item(common_local_url('showstream', array('nickname' =>
+                                                              $nickname)),
+                         _('Profile'),
+                         ($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname,
+                         $action == 'showstream');
+        common_menu_item(common_local_url('showfavorites', array('nickname' =>
+                                                              $nickname)),
+                         _('Favorites'),
+                         sprintf(_('%s\'s favorite notices'), ($user_profile) ? $user_profile->getBestName() : _('User')),
+                         $action == 'showfavorites');
+        
+        $cur = common_current_user();
+        
+        if ($cur && $cur->id == $user->id) {
+            
+            common_menu_item(common_local_url('inbox', array('nickname' =>
+                                                                     $nickname)),
+                             _('Inbox'),
+                             _('Your incoming messages'),
+                             $action == 'inbox');
+            common_menu_item(common_local_url('outbox', array('nickname' =>
+                                                                     $nickname)),
+                             _('Outbox'),
+                             _('Your sent messages'),
+                             $action == 'outbox');
+        }
+        
+        common_element_end('ul');
+    }
+
+    function show_feeds_list($feeds) {
+        common_element_start('div', array('class' => 'feeds'));
+        common_element('p', null, 'Feeds:');
+        common_element_start('ul', array('class' => 'xoxo'));
+
+        foreach ($feeds as $key => $value) {
+            $this->common_feed_item($feeds[$key]);
+        }
+        common_element_end('ul');
+        common_element_end('div');
+    }
+
+    function common_feed_item($feed) {
+        $nickname = $this->trimmed('nickname');
+
+        switch($feed['item']) {
+            case 'notices': default:
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "$nickname's ".$feed['version']." notice feed";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'allrss':
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = $feed['version']." feed for $nickname and friends";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'repliesrss':
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = $feed['version']." feed for replies to $nickname";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'publicrss':
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "Public timeline ".$feed['version']." feed";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'publicatom':
+                $feed_classname = "atom";
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "Public timeline ".$feed['version']." feed";
+                $feed['textContent'] = "Atom";
+                break;
+
+            case 'tagrss':
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = $feed['version']." feed for this tag";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'favoritedrss':
+                $feed_classname = $feed['type'];
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "Favorited ".$feed['version']." feed";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'foaf':
+                $feed_classname = "foaf";
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "$nickname's FOAF file";
+                $feed['textContent'] = "FOAF";
+                break;
+
+            case 'favoritesrss':
+                $feed_classname = "favorites";
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "Feed for favorites of $nickname";
+                $feed['textContent'] = "RSS";
+                break;
+
+            case 'usertimeline':
+                $feed_classname = "atom";
+                $feed_mimetype = "application/".$feed['type']."+xml";
+                $feed_title = "$nickname's ".$feed['version']." notice feed";
+                $feed['textContent'] = "Atom";
+                break;
+        }
+        common_element_start('li');
+        common_element('a', array('href' => $feed['href'],
+                                  'class' => $feed_classname,
+                                  'type' => $feed_mimetype,
+                                  'title' => $feed_title),
+                            $feed['textContent']);
+        common_element_end('li');
+    }
+
+    
+    function source_link($source) {
+        $source_name = _($source);
+        switch ($source) {
+         case 'web':
+         case 'xmpp':
+         case 'mail':
+         case 'omb':
+         case 'api':
+            common_element('span', 'noticesource', $source_name);
+            break;
+         default:
+            $ns = Notice_source::staticGet($source);
+            if ($ns) {
+                common_element('a', array('href' => $ns->url),
+                               $ns->name);
+            } else {
+                common_element('span', 'noticesource', $source_name);
+            }
+            break;
+        }
+        return;
+    }
 }
index 9079ea9d7c64c162d3794c3720b09c884e8c1939..e32c5c25498662d461db6ae5366cf44ea1b71f0b 100644 (file)
@@ -24,138 +24,138 @@ define('PROFILES_PER_PAGE', 20);
 
 class ProfileList {
 
-       var $profile = NULL;
-       var $owner = NULL;
-       var $action = NULL;
-
-       function __construct($profile, $owner=NULL, $action=NULL) {
-               $this->profile = $profile;
-               $this->owner = $owner;
-               $this->action = $action;
-       }
-
-       function show_list() {
-
-               common_element_start('ul', array('id' => 'profiles', 'class' => 'profile_list'));
-
-               $cnt = 0;
-
-               while ($this->profile->fetch()) {
-                       $cnt++;
-                       if($cnt > PROFILES_PER_PAGE) {
-                               break;
-                       }
-                       $this->show();
-               }
-
-               common_element_end('ul');
-
-               return $cnt;
-       }
-
-       function show() {
-
-               common_element_start('li', array('class' => 'profile_single',
-                                                                                'id' => 'profile-' . $this->profile->id));
-
-               $user = common_current_user();
-
-               if ($user && $user->id != $this->profile->id) {
-                       # XXX: special-case for user looking at own
-                       # subscriptions page
-                       if ($user->isSubscribed($this->profile)) {
-                               common_unsubscribe_form($this->profile);
-                       } else {
-                               common_subscribe_form($this->profile);
-                       }
-               }
-
-               $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
-               common_element_start('a', array('href' => $this->profile->profileurl));
-               common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
-                                                                       'class' => 'avatar stream',
-                                                                       'width' => AVATAR_STREAM_SIZE,
-                                                                       'height' => AVATAR_STREAM_SIZE,
-                                                                       'alt' =>
-                                                                       ($this->profile->fullname) ? $this->profile->fullname :
-                                                                       $this->profile->nickname));
-               common_element_end('a');
-               common_element_start('p');
-               common_element_start('a', array('href' => $this->profile->profileurl,
-                                                                               'class' => 'nickname'));
-               common_raw($this->highlight($this->profile->nickname));
-               common_element_end('a');
-               if ($this->profile->fullname) {
-                       common_text(' | ');
-                       common_element_start('span', 'fullname');
-                       common_raw($this->highlight($this->profile->fullname));
-                       common_element_end('span');
-               }
-               if ($this->profile->location) {
-                       common_text(' | ');
-                       common_element_start('span', 'location');
-                       common_raw($this->highlight($this->profile->location));
-                       common_element_end('span');
-               }
-               common_element_end('p');
-               if ($this->profile->homepage) {
-                       common_element_start('p', 'website');
-                       common_element_start('a', array('href' => $this->profile->homepage));
-                       common_raw($this->highlight($this->profile->homepage));
-                       common_element_end('a');
-                       common_element_end('p');
-               }
-               if ($this->profile->bio) {
-                       common_element_start('p', 'bio');
-                       common_raw($this->highlight($this->profile->bio));
-                       common_element_end('p');
-               }
-
-               # If we're on a list with an owner (subscriptions or subscribers)...
-
-               if ($this->owner) {
-                       # Get tags
-                       $tags = Profile_tag::getTags($this->owner->id, $this->profile->id);
-
-                       common_element_start('div', 'tags_user');
-                       common_element_start('dl');
-                       common_element_start('dt');
-                       if ($user->id == $this->owner->id) {
-                               common_element('a', array('href' => common_local_url('tagother',
-                                                                                                                                        array('id' => $this->profile->id))),
-                                                          _('Tags'));
-                       } else {
-                               common_text(_('Tags'));
-                       }
-                       common_text(":");
-                       common_element_end('dt');
-                       common_element_start('dd');
-                       if ($tags) {
-                               common_element_start('ul', 'tags xoxo');
-                               foreach ($tags as $tag) {
-                                       common_element_start('li');
-                                       common_element('a', array('rel' => 'tag',
-                                                                                         'href' => common_local_url($this->action,
-                                                                                                                                                array('nickname' => $this->owner->nickname,
-                                                                                                                                                          'tag' => $tag))),
-                                                                  $tag);
-                                       common_element_end('li');
-                               }
-                               common_element_end('ul');
-                       } else {
-                               common_text(_('(none)'));
-                       }
-                       common_element_end('dd');
-                       common_element_end('dl');
-                       common_element_end('div');
-               }
+    var $profile = NULL;
+    var $owner = NULL;
+    var $action = NULL;
+
+    function __construct($profile, $owner=NULL, $action=NULL) {
+        $this->profile = $profile;
+        $this->owner = $owner;
+        $this->action = $action;
+    }
+
+    function show_list() {
+
+        common_element_start('ul', array('id' => 'profiles', 'class' => 'profile_list'));
+
+        $cnt = 0;
+
+        while ($this->profile->fetch()) {
+            $cnt++;
+            if($cnt > PROFILES_PER_PAGE) {
+                break;
+            }
+            $this->show();
+        }
+
+        common_element_end('ul');
+
+        return $cnt;
+    }
+
+    function show() {
+
+        common_element_start('li', array('class' => 'profile_single',
+                                         'id' => 'profile-' . $this->profile->id));
+
+        $user = common_current_user();
+
+        if ($user && $user->id != $this->profile->id) {
+            # XXX: special-case for user looking at own
+            # subscriptions page
+            if ($user->isSubscribed($this->profile)) {
+                common_unsubscribe_form($this->profile);
+            } else {
+                common_subscribe_form($this->profile);
+            }
+        }
+
+        $avatar = $this->profile->getAvatar(AVATAR_STREAM_SIZE);
+        common_element_start('a', array('href' => $this->profile->profileurl));
+        common_element('img', array('src' => ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE),
+                                    'class' => 'avatar stream',
+                                    'width' => AVATAR_STREAM_SIZE,
+                                    'height' => AVATAR_STREAM_SIZE,
+                                    'alt' =>
+                                    ($this->profile->fullname) ? $this->profile->fullname :
+                                    $this->profile->nickname));
+        common_element_end('a');
+        common_element_start('p');
+        common_element_start('a', array('href' => $this->profile->profileurl,
+                                        'class' => 'nickname'));
+        common_raw($this->highlight($this->profile->nickname));
+        common_element_end('a');
+        if ($this->profile->fullname) {
+            common_text(' | ');
+            common_element_start('span', 'fullname');
+            common_raw($this->highlight($this->profile->fullname));
+            common_element_end('span');
+        }
+        if ($this->profile->location) {
+            common_text(' | ');
+            common_element_start('span', 'location');
+            common_raw($this->highlight($this->profile->location));
+            common_element_end('span');
+        }
+        common_element_end('p');
+        if ($this->profile->homepage) {
+            common_element_start('p', 'website');
+            common_element_start('a', array('href' => $this->profile->homepage));
+            common_raw($this->highlight($this->profile->homepage));
+            common_element_end('a');
+            common_element_end('p');
+        }
+        if ($this->profile->bio) {
+            common_element_start('p', 'bio');
+            common_raw($this->highlight($this->profile->bio));
+            common_element_end('p');
+        }
+
+        # If we're on a list with an owner (subscriptions or subscribers)...
+
+        if ($this->owner) {
+            # Get tags
+            $tags = Profile_tag::getTags($this->owner->id, $this->profile->id);
+
+            common_element_start('div', 'tags_user');
+            common_element_start('dl');
+            common_element_start('dt');
+            if ($user->id == $this->owner->id) {
+                common_element('a', array('href' => common_local_url('tagother',
+                                                                     array('id' => $this->profile->id))),
+                               _('Tags'));
+            } else {
+                common_text(_('Tags'));
+            }
+            common_text(":");
+            common_element_end('dt');
+            common_element_start('dd');
+            if ($tags) {
+                common_element_start('ul', 'tags xoxo');
+                foreach ($tags as $tag) {
+                    common_element_start('li');
+                    common_element('a', array('rel' => 'tag',
+                                              'href' => common_local_url($this->action,
+                                                                         array('nickname' => $this->owner->nickname,
+                                                                               'tag' => $tag))),
+                                   $tag);
+                    common_element_end('li');
+                }
+                common_element_end('ul');
+            } else {
+                common_text(_('(none)'));
+            }
+            common_element_end('dd');
+            common_element_end('dl');
+            common_element_end('div');
+        }
 
         if ($user && $user->id == $this->owner->id) {
             $this->show_owner_controls($this->profile);
         }
 
-               common_element_end('li');
-       }
+        common_element_end('li');
+    }
 
     /* Override this in subclasses. */
 
@@ -163,7 +163,7 @@ class ProfileList {
         return;
     }
 
-       function highlight($text) {
-               return htmlspecialchars($text);
-       }
+    function highlight($text) {
+        return htmlspecialchars($text);
+    }
 }
\ No newline at end of file
index 23f295c45296fb480e233e4add9e7bb3fcc15782..5e3905f591ce3d8a37ffacb11cdaeb7789e8c7da 100644 (file)
@@ -27,106 +27,106 @@ require_once(INSTALLDIR.'/classes/Notice.php');
 
 class QueueHandler extends Daemon {
 
-       var $_id = 'generic';
+    var $_id = 'generic';
 
-       function QueueHandler($id=NULL) {
-               if ($id) {
-                       $this->set_id($id);
-               }
-       }
-       
-       function class_name() {
-               return ucfirst($this->transport()) . 'Handler';
-       }
+    function QueueHandler($id=NULL) {
+        if ($id) {
+            $this->set_id($id);
+        }
+    }
+    
+    function class_name() {
+        return ucfirst($this->transport()) . 'Handler';
+    }
 
-       function name() {
-               return strtolower($this->class_name().'.'.$this->get_id());
-       }
-       
-       function get_id() {
-               return $this->_id;
-       }
+    function name() {
+        return strtolower($this->class_name().'.'.$this->get_id());
+    }
+    
+    function get_id() {
+        return $this->_id;
+    }
 
-       function set_id($id) {
-               $this->_id = $id;
-       }
-       
-       function transport() {
-               return NULL;
-       }
-       
-       function start() {
-       }
-       
-       function finish() {
-       }
+    function set_id($id) {
+        $this->_id = $id;
+    }
+    
+    function transport() {
+        return NULL;
+    }
+    
+    function start() {
+    }
+    
+    function finish() {
+    }
 
-       function handle_notice($notice) {
-               return true;
-       }
-       
-       function run() {
-               if (!$this->start()) {
-                       return false;
-               }
-               $this->log(LOG_INFO, 'checking for queued notices');
-               $transport = $this->transport();
-               do {
-                       $qi = Queue_item::top($transport);
-                       if ($qi) {
-                               $this->log(LOG_INFO, 'Got item enqueued '.common_exact_date($qi->created));
-                               $notice = Notice::staticGet($qi->notice_id);
-                               if ($notice) {
-                                       $this->log(LOG_INFO, 'broadcasting notice ID = ' . $notice->id);
-                                       # XXX: what to do if broadcast fails?
-                                       $result = $this->handle_notice($notice);
-                                       if (!$result) {
-                                               $this->log(LOG_WARNING, 'Failed broadcast for notice ID = ' . $notice->id);
-                                               $orig = $qi;
-                                               $qi->claimed = NULL;
-                                               $qi->update($orig);
-                                               $this->log(LOG_WARNING, 'Abandoned claim for notice ID = ' . $notice->id);
-                                               continue;
-                                       }
-                                       $this->log(LOG_INFO, 'finished broadcasting notice ID = ' . $notice->id);
-                                       $notice->free();
-                                       unset($notice);
-                                       $notice = NULL;
-                               } else {
-                                       $this->log(LOG_WARNING, 'queue item for notice that does not exist');
-                               }
-                               $qi->delete();
-                               $qi->free();
-                               unset($qi);
-                               $this->idle(0);
-                       } else {
-                               $this->clear_old_claims();
-                               $this->idle(5);
-                       }       
-               } while (true);
-               if (!$this->finish()) {
-                       return false;
-               }
-               return true;
-       }
+    function handle_notice($notice) {
+        return true;
+    }
+    
+    function run() {
+        if (!$this->start()) {
+            return false;
+        }
+        $this->log(LOG_INFO, 'checking for queued notices');
+        $transport = $this->transport();
+        do {
+            $qi = Queue_item::top($transport);
+            if ($qi) {
+                $this->log(LOG_INFO, 'Got item enqueued '.common_exact_date($qi->created));
+                $notice = Notice::staticGet($qi->notice_id);
+                if ($notice) {
+                    $this->log(LOG_INFO, 'broadcasting notice ID = ' . $notice->id);
+                    # XXX: what to do if broadcast fails?
+                    $result = $this->handle_notice($notice);
+                    if (!$result) {
+                        $this->log(LOG_WARNING, 'Failed broadcast for notice ID = ' . $notice->id);
+                        $orig = $qi;
+                        $qi->claimed = NULL;
+                        $qi->update($orig);
+                        $this->log(LOG_WARNING, 'Abandoned claim for notice ID = ' . $notice->id);
+                        continue;
+                    }
+                    $this->log(LOG_INFO, 'finished broadcasting notice ID = ' . $notice->id);
+                    $notice->free();
+                    unset($notice);
+                    $notice = NULL;
+                } else {
+                    $this->log(LOG_WARNING, 'queue item for notice that does not exist');
+                }
+                $qi->delete();
+                $qi->free();
+                unset($qi);
+                $this->idle(0);
+            } else {
+                $this->clear_old_claims();
+                $this->idle(5);
+            }    
+        } while (true);
+        if (!$this->finish()) {
+            return false;
+        }
+        return true;
+    }
 
-       function idle($timeout=0) {
-               if ($timeout>0) {
-                       sleep($timeout);
-               }
-       }
-       
-       function clear_old_claims() {
-               $qi = new Queue_item();
-               $qi->transport = $this->transport();
-               $qi->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
-               $qi->update(DB_DATAOBJECT_WHEREADD_ONLY);
-               $qi->free();
-               unset($qi);
-       }
-       
-       function log($level, $msg) {
-               common_log($level, $this->class_name() . ' ('. $this->get_id() .'): '.$msg);
-       }
+    function idle($timeout=0) {
+        if ($timeout>0) {
+            sleep($timeout);
+        }
+    }
+    
+    function clear_old_claims() {
+        $qi = new Queue_item();
+        $qi->transport = $this->transport();
+        $qi->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
+        $qi->update(DB_DATAOBJECT_WHEREADD_ONLY);
+        $qi->free();
+        unset($qi);
+    }
+    
+    function log($level, $msg) {
+        common_log($level, $this->class_name() . ' ('. $this->get_id() .'): '.$msg);
+    }
 }
-       
\ No newline at end of file
+    
\ No newline at end of file
index 777511506dff0bf8b710a77bcc7029e3344cab5e..b647968887c28f3118e9df8331c21d18d09914c8 100644 (file)
@@ -23,167 +23,167 @@ define('DEFAULT_RSS_LIMIT', 48);
 
 class Rss10Action extends Action {
 
-       # This will contain the details of each feed item's author and be used to generate SIOC data.
-       var $creators = array();
-
-       function is_readonly() {
-               return true;
-       }
-
-       function handle($args) {
-               parent::handle($args);
-               $limit = (int) $this->trimmed('limit');
-               if ($limit == 0) {
-                       $limit = DEFAULT_RSS_LIMIT;
-               }
-               $this->show_rss($limit);
-       }
-
-       function init() {
-               return true;
-       }
-
-       function get_notices() {
-               return array();
-       }
-
-       function get_channel() {
-               return array('url' => '',
-                                        'title' => '',
-                                        'link' => '',
-                                        'description' => '');
-       }
-
-       function get_image() {
-               return NULL;
-       }
-
-       function show_rss($limit=0) {
-
-               if (!$this->init()) {
-                       return;
-               }
-
-               $notices = $this->get_notices($limit);
-
-               $this->init_rss();
-               $this->show_channel($notices);
-               $this->show_image();
-
-               foreach ($notices as $n) {
-                       $this->show_item($n);
-               }
-
-               $this->show_creators();
-               $this->end_rss();
-       }
-
-       function show_channel($notices) {
-
-               $channel = $this->get_channel();
-               $image = $this->get_image();
-
-               common_element_start('channel', array('rdf:about' => $channel['url']));
-               common_element('title', NULL, $channel['title']);
-               common_element('link', NULL, $channel['link']);
-               common_element('description', NULL, $channel['description']);
-               common_element('cc:licence', array('rdf:resource' => common_config('license','url')));
-
-               if ($image) {
-                       common_element('image', array('rdf:resource' => $image));
-               }
-
-               common_element_start('items');
-               common_element_start('rdf:Seq');
-
-               foreach ($notices as $notice) {
-                       common_element('sioct:MicroblogPost', array('rdf:resource' => $notice->uri));
-               }
-
-               common_element_end('rdf:Seq');
-               common_element_end('items');
-
-               common_element_end('channel');
-       }
-
-       function show_image() {
-               $image = $this->get_image();
-               if ($image) {
-                       $channel = $this->get_channel();
-                       common_element_start('image', array('rdf:about' => $image));
-                       common_element('title', NULL, $channel['title']);
-                       common_element('link', NULL, $channel['link']);
-                       common_element('url', NULL, $image);
-                       common_element_end('image');
-               }
-       }
-
-       function show_item($notice) {
-               $profile = Profile::staticGet($notice->profile_id);
-               $nurl = common_local_url('shownotice', array('notice' => $notice->id));
-               $creator_uri = common_profile_uri($profile);
-               common_element_start('item', array('rdf:about' => $notice->uri));
-               $title = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
-               common_element('title', NULL, $title);
-               common_element('link', NULL, $nurl);
-               common_element('description', NULL, $profile->nickname."'s status on ".common_exact_date($notice->created));
-               common_element('dc:date', NULL, common_date_w3dtf($notice->created));
-               common_element('dc:creator', NULL, ($profile->fullname) ? $profile->fullname : $profile->nickname);
-               common_element('sioc:has_creator', array('rdf:resource' => $creator_uri));
-               common_element('laconica:postIcon', array('rdf:resource' => common_profile_avatar_url($profile)));
-               common_element('cc:licence', array('rdf:resource' => common_config('license', 'url')));
-               common_element_end('item');
-               $this->creators[$creator_uri] = $profile;
-       }
-
-       function show_creators() {
-               foreach ($this->creators as $uri => $profile) {
-                       $id = $profile->id;
-                       $nickname = $profile->nickname;
-                       common_element_start('sioc:User', array('rdf:about' => $uri));
-                       common_element('foaf:nick', NULL, $nickname);
-                       if ($profile->fullname) {
-                               common_element('foaf:name', NULL, $profile->fullname);
-                       }
-                       common_element('sioc:id', NULL, $id);
-                       $avatar = common_profile_avatar_url($profile);
-                       common_element('sioc:avatar', array('rdf:resource' => $avatar));
-                       common_element_end('sioc:User');
-               }
-       }
-
-       function init_rss() {
-               $channel = $this->get_channel();
-               header('Content-Type: application/rdf+xml');
-
-               common_start_xml();
-               common_element_start('rdf:RDF', array('xmlns:rdf' =>
-                                                                                         'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
-                                                                                         'xmlns:dc' =>
-                                                                                         'http://purl.org/dc/elements/1.1/',
-                                                                                         'xmlns:cc' =>
-                                                                                         'http://web.resource.org/cc/',
+    # This will contain the details of each feed item's author and be used to generate SIOC data.
+    var $creators = array();
+
+    function is_readonly() {
+        return true;
+    }
+
+    function handle($args) {
+        parent::handle($args);
+        $limit = (int) $this->trimmed('limit');
+        if ($limit == 0) {
+            $limit = DEFAULT_RSS_LIMIT;
+        }
+        $this->show_rss($limit);
+    }
+
+    function init() {
+        return true;
+    }
+
+    function get_notices() {
+        return array();
+    }
+
+    function get_channel() {
+        return array('url' => '',
+                     'title' => '',
+                     'link' => '',
+                     'description' => '');
+    }
+
+    function get_image() {
+        return NULL;
+    }
+
+    function show_rss($limit=0) {
+
+        if (!$this->init()) {
+            return;
+        }
+
+        $notices = $this->get_notices($limit);
+
+        $this->init_rss();
+        $this->show_channel($notices);
+        $this->show_image();
+
+        foreach ($notices as $n) {
+            $this->show_item($n);
+        }
+
+        $this->show_creators();
+        $this->end_rss();
+    }
+
+    function show_channel($notices) {
+
+        $channel = $this->get_channel();
+        $image = $this->get_image();
+
+        common_element_start('channel', array('rdf:about' => $channel['url']));
+        common_element('title', NULL, $channel['title']);
+        common_element('link', NULL, $channel['link']);
+        common_element('description', NULL, $channel['description']);
+        common_element('cc:licence', array('rdf:resource' => common_config('license','url')));
+
+        if ($image) {
+            common_element('image', array('rdf:resource' => $image));
+        }
+
+        common_element_start('items');
+        common_element_start('rdf:Seq');
+
+        foreach ($notices as $notice) {
+            common_element('sioct:MicroblogPost', array('rdf:resource' => $notice->uri));
+        }
+
+        common_element_end('rdf:Seq');
+        common_element_end('items');
+
+        common_element_end('channel');
+    }
+
+    function show_image() {
+        $image = $this->get_image();
+        if ($image) {
+            $channel = $this->get_channel();
+            common_element_start('image', array('rdf:about' => $image));
+            common_element('title', NULL, $channel['title']);
+            common_element('link', NULL, $channel['link']);
+            common_element('url', NULL, $image);
+            common_element_end('image');
+        }
+    }
+
+    function show_item($notice) {
+        $profile = Profile::staticGet($notice->profile_id);
+        $nurl = common_local_url('shownotice', array('notice' => $notice->id));
+        $creator_uri = common_profile_uri($profile);
+        common_element_start('item', array('rdf:about' => $notice->uri));
+        $title = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
+        common_element('title', NULL, $title);
+        common_element('link', NULL, $nurl);
+        common_element('description', NULL, $profile->nickname."'s status on ".common_exact_date($notice->created));
+        common_element('dc:date', NULL, common_date_w3dtf($notice->created));
+        common_element('dc:creator', NULL, ($profile->fullname) ? $profile->fullname : $profile->nickname);
+        common_element('sioc:has_creator', array('rdf:resource' => $creator_uri));
+        common_element('laconica:postIcon', array('rdf:resource' => common_profile_avatar_url($profile)));
+        common_element('cc:licence', array('rdf:resource' => common_config('license', 'url')));
+        common_element_end('item');
+        $this->creators[$creator_uri] = $profile;
+    }
+
+    function show_creators() {
+        foreach ($this->creators as $uri => $profile) {
+            $id = $profile->id;
+            $nickname = $profile->nickname;
+            common_element_start('sioc:User', array('rdf:about' => $uri));
+            common_element('foaf:nick', NULL, $nickname);
+            if ($profile->fullname) {
+                common_element('foaf:name', NULL, $profile->fullname);
+            }
+            common_element('sioc:id', NULL, $id);
+            $avatar = common_profile_avatar_url($profile);
+            common_element('sioc:avatar', array('rdf:resource' => $avatar));
+            common_element_end('sioc:User');
+        }
+    }
+
+    function init_rss() {
+        $channel = $this->get_channel();
+        header('Content-Type: application/rdf+xml');
+
+        common_start_xml();
+        common_element_start('rdf:RDF', array('xmlns:rdf' =>
+                                              'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
+                                              'xmlns:dc' =>
+                                              'http://purl.org/dc/elements/1.1/',
+                                              'xmlns:cc' =>
+                                              'http://web.resource.org/cc/',
                                               'xmlns:content' =>
                                               'http://purl.org/rss/1.0/modules/content/',
-                                                                                         'xmlns:foaf' =>
-                                                                                         'http://xmlns.com/foaf/0.1/',
-                                                                                         'xmlns:sioc' =>
-                                                                                         'http://rdfs.org/sioc/ns#',
-                                                     'xmlns:sioct' =>
-                                                     'http://rdfs.org/sioc/types#',
-                                                     'xmlns:laconica' =>
-                                                     'http://laconi.ca/ont/',
-                                                                                         'xmlns' => 'http://purl.org/rss/1.0/'));
-               common_element_start('sioc:Site', array('rdf:about' => common_root_url()));
-               common_element('sioc:name', NULL, common_config('site', 'name'));
-               common_element_start('sioc:container_of');
-               common_element('sioc:Container', array('rdf:about' =>
-                                                      $channel['url']));
-               common_element_end('sioc:container_of');
-               common_element_end('sioc:Site');
-       }
-
-       function end_rss() {
-               common_element_end('rdf:RDF');
-       }
+                                              'xmlns:foaf' =>
+                                              'http://xmlns.com/foaf/0.1/',
+                                              'xmlns:sioc' =>
+                                              'http://rdfs.org/sioc/ns#',
+                                              'xmlns:sioct' =>
+                                              'http://rdfs.org/sioc/types#',
+                                              'xmlns:laconica' =>
+                                              'http://laconi.ca/ont/',
+                                              'xmlns' => 'http://purl.org/rss/1.0/'));
+        common_element_start('sioc:Site', array('rdf:about' => common_root_url()));
+        common_element('sioc:name', NULL, common_config('site', 'name'));
+        common_element_start('sioc:container_of');
+        common_element('sioc:Container', array('rdf:about' =>
+                                               $channel['url']));
+        common_element_end('sioc:container_of');
+        common_element_end('sioc:Site');
+    }
+
+    function end_rss() {
+        common_element_end('rdf:RDF');
+    }
 }
index 7fcc1ffcb027d375e120ea58271bbc379292b1d1..d53d7d8d8a731c2ca2c75de4628185821e1b666f 100644 (file)
@@ -98,10 +98,10 @@ class MySQLSearch extends SearchEngine {
     function query($q) {
         if ('identica_people' === $this->table)
             return $this->target->whereAdd('MATCH(nickname, fullname, location, bio, homepage) ' .
-                                                  'against (\''.addslashes($q).'\')');
+                           'against (\''.addslashes($q).'\')');
         if ('identica_notices' === $this->table)
             return $this->target->whereAdd('MATCH(content) ' .
-                                                  'against (\''.addslashes($q).'\')');
+                           'against (\''.addslashes($q).'\')');
     }
 }
 
index f99883b251ec7ca2eed5044f555155c5f1ed5166..8634bd99cfc8fe9f784679fff250fa85313ea77a 100644 (file)
@@ -21,90 +21,90 @@ if (!defined('LACONICA')) { exit(1); }
 
 class SearchAction extends Action {
 
-       function is_readonly() {
-               return true;
-       }
+    function is_readonly() {
+        return true;
+    }
 
-       function handle($args) {
-               parent::handle($args);
-               $this->show_form();
-       }
+    function handle($args) {
+        parent::handle($args);
+        $this->show_form();
+    }
 
-       function show_top($arr=NULL) {
-               if ($arr) {
-                       $error = $arr[1];
-               }
-               if ($error) {
-                       common_element('p', 'error', $error);
-               } else {
-                       $instr = $this->get_instructions();
-                       $output = common_markup_to_html($instr);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-               }
-               $this->search_menu();
-       }
+    function show_top($arr=NULL) {
+        if ($arr) {
+            $error = $arr[1];
+        }
+        if ($error) {
+            common_element('p', 'error', $error);
+        } else {
+            $instr = $this->get_instructions();
+            $output = common_markup_to_html($instr);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('div');
+        }
+        $this->search_menu();
+    }
 
-       function get_title() {
-               return NULL;
-       }
+    function get_title() {
+        return NULL;
+    }
 
-       function show_header($arr) {
-               return;
-       }
+    function show_header($arr) {
+        return;
+    }
 
-       function show_form($error=NULL) {
-               global $config;
+    function show_form($error=NULL) {
+        global $config;
 
-               $q = $this->trimmed('q');
-               $page = $this->trimmed('page', 1);
+        $q = $this->trimmed('q');
+        $page = $this->trimmed('page', 1);
 
-               common_show_header($this->get_title(), array($this, 'show_header'), array($q, $error),
-                                                  array($this, 'show_top'));
-               common_element_start('form', array('method' => 'get',
-                                                                                  'id' => 'login',
-                                                                                  'action' => common_local_url($this->trimmed('action'))));
-               common_element_start('p');
-               if (!isset($config['site']['fancy']) || !$config['site']['fancy']) {
-                       common_element('input', array('name' => 'action',
-                                                                                 'type' => 'hidden',
-                                                                                 'value' => $this->trimmed('action')));
-               }
-               common_element('input', array('name' => 'q',
-                                                                         'id' => 'q',
-                                                                         'type' => 'text',
-                                                                         'class' => 'input_text',
-                                                                         'value' => ($q) ? $q : ''));
-               common_text(' ');
-               common_element('input', array('type' => 'submit',
-                                                                         'id' => 'search',
-                                                                         'name' => 'search',
-                                                                         'class' => 'submit',
-                                                                         'value' => _('Search')));
+        common_show_header($this->get_title(), array($this, 'show_header'), array($q, $error),
+                           array($this, 'show_top'));
+        common_element_start('form', array('method' => 'get',
+                                           'id' => 'login',
+                                           'action' => common_local_url($this->trimmed('action'))));
+        common_element_start('p');
+        if (!isset($config['site']['fancy']) || !$config['site']['fancy']) {
+            common_element('input', array('name' => 'action',
+                                          'type' => 'hidden',
+                                          'value' => $this->trimmed('action')));
+        }
+        common_element('input', array('name' => 'q',
+                                      'id' => 'q',
+                                      'type' => 'text',
+                                      'class' => 'input_text',
+                                      'value' => ($q) ? $q : ''));
+        common_text(' ');
+        common_element('input', array('type' => 'submit',
+                                      'id' => 'search',
+                                      'name' => 'search',
+                                      'class' => 'submit',
+                                      'value' => _('Search')));
 
-               common_element_end('p');
-               common_element_end('form');
-               if ($q) {
-                       $this->show_results($q, $page);
-               }
-               common_show_footer();
-       }
+        common_element_end('p');
+        common_element_end('form');
+        if ($q) {
+            $this->show_results($q, $page);
+        }
+        common_show_footer();
+    }
 
-       function search_menu() {
-               # action => array('prompt', 'title', $args)
-               $action = $this->trimmed('action');
-               $menu =
-                 array('peoplesearch' =>
-                               array(
-                                         _('People'),
-                                         _('Find people on this site'),
-                                         ($action != 'peoplesearch' && $this->trimmed('q')) ? array('q' => $this->trimmed('q')) : NULL),
-                               'noticesearch' =>
-                               array( _('Text'),
-                                          _('Find content of notices'),
-                                          ($action != 'noticesearch' && $this->trimmed('q')) ? array('q' => $this->trimmed('q')) : NULL)
-                               );
-               $this->nav_menu($menu);
-       }
+    function search_menu() {
+        # action => array('prompt', 'title', $args)
+        $action = $this->trimmed('action');
+        $menu =
+          array('peoplesearch' =>
+                array(
+                      _('People'),
+                      _('Find people on this site'),
+                      ($action != 'peoplesearch' && $this->trimmed('q')) ? array('q' => $this->trimmed('q')) : NULL),
+                'noticesearch' =>
+                array( _('Text'),
+                       _('Find content of notices'),
+                       ($action != 'noticesearch' && $this->trimmed('q')) ? array('q' => $this->trimmed('q')) : NULL)
+                );
+        $this->nav_menu($menu);
+    }
 }
index 9e783431f23586073429c867546e3cddbc7b3a89..3021eb192e933c7cfd093c087abf5cc7650e03aa 100644 (file)
@@ -27,9 +27,9 @@ class SettingsAction extends Action {
             common_user_error(_('Not logged in.'));
             return;
         } else if (!common_is_real_login()) {
-               # Cookie theft means that automatic logins can't
-               # change important settings or see private info, and
-               # _all_ our settings are important
+            # Cookie theft means that automatic logins can't
+            # change important settings or see private info, and
+            # _all_ our settings are important
             common_set_returnto($this->self_url());
             common_redirect(common_local_url('login'));
         } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
@@ -55,60 +55,60 @@ class SettingsAction extends Action {
         }
     }
 
-       function form_header($title, $msg=NULL, $success=false) {
-               common_show_header($title,
-                                  NULL,
-                                  array($msg, $success),
-                                                  array($this, 'show_top'));
-       }
+    function form_header($title, $msg=NULL, $success=false) {
+        common_show_header($title,
+                           NULL,
+                           array($msg, $success),
+                           array($this, 'show_top'));
+    }
 
-       function show_top($arr) {
-               $msg = $arr[0];
-               $success = $arr[1];
-               if ($msg) {
-                       $this->message($msg, $success);
-               } else {
-                       $inst = $this->get_instructions();
-                       $output = common_markup_to_html($inst);
-                       common_element_start('div', 'instructions');
-                       common_raw($output);
-                       common_element_end('div');
-               }
-               $this->settings_menu();
-       }
+    function show_top($arr) {
+        $msg = $arr[0];
+        $success = $arr[1];
+        if ($msg) {
+            $this->message($msg, $success);
+        } else {
+            $inst = $this->get_instructions();
+            $output = common_markup_to_html($inst);
+            common_element_start('div', 'instructions');
+            common_raw($output);
+            common_element_end('div');
+        }
+        $this->settings_menu();
+    }
 
     function settings_menu() {
         # action => array('prompt', 'title')
-               $menu =
-                 array('profilesettings' =>
-                               array(_('Profile'),
-                                         _('Change your profile settings')),
-                               'emailsettings' =>
-                               array(_('Email'),
-                                         _('Change email handling')),
-                               'openidsettings' =>
-                               array(_('OpenID'),
-                                         _('Add or remove OpenIDs')),
-                               'smssettings' =>
-                               array(_('SMS'),
-                                         _('Updates by SMS')),
-                               'imsettings' =>
-                               array(_('IM'),
-                                         _('Updates by instant messenger (IM)')),
-                               'twittersettings' =>
-                               array(_('Twitter'),
-                                         _('Twitter integration options')),
-                               'othersettings' =>
-                               array(_('Other'),
-                                         _('Other options')));
-               
+        $menu =
+          array('profilesettings' =>
+                array(_('Profile'),
+                      _('Change your profile settings')),
+                'emailsettings' =>
+                array(_('Email'),
+                      _('Change email handling')),
+                'openidsettings' =>
+                array(_('OpenID'),
+                      _('Add or remove OpenIDs')),
+                'smssettings' =>
+                array(_('SMS'),
+                      _('Updates by SMS')),
+                'imsettings' =>
+                array(_('IM'),
+                      _('Updates by instant messenger (IM)')),
+                'twittersettings' =>
+                array(_('Twitter'),
+                      _('Twitter integration options')),
+                'othersettings' =>
+                array(_('Other'),
+                      _('Other options')));
+        
         $action = $this->trimmed('action');
         common_element_start('ul', array('id' => 'nav_views'));
         foreach ($menu as $menuaction => $menudesc) {
-                       if ($menuaction == 'imsettings' &&
-                               !common_config('xmpp', 'enabled')) {
-                               continue;
-                       }
+            if ($menuaction == 'imsettings' &&
+                !common_config('xmpp', 'enabled')) {
+                continue;
+            }
             common_menu_item(common_local_url($menuaction),
                     $menudesc[0],
                     $menudesc[1],
index 27ab78137f430f7f6ba1205897d6e938815500c3..2d45df2d3aca1447a8b586c4b00cf407d1e495a1 100644 (file)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 if (!defined('LACONICA')) { exit(1); }
@@ -24,29 +24,29 @@ require_once(INSTALLDIR.'/lib/noticelist.php');
 
 class StreamAction extends PersonalAction {
 
-       function public_views_menu() {
+    function public_views_menu() {
 
-               $action = $this->trimmed('action');
+        $action = $this->trimmed('action');
 
-               common_element_start('ul', array('id' => 'nav_views'));
+        common_element_start('ul', array('id' => 'nav_views'));
 
-               common_menu_item(common_local_url('public'), _('Public'),
-                       _('Public timeline'), $action == 'public');
+        common_menu_item(common_local_url('public'), _('Public'),
+            _('Public timeline'), $action == 'public');
 
-               common_menu_item(common_local_url('tag'), _('Recent tags'),
-                       _('Recent tags'), $action == 'tag');
+        common_menu_item(common_local_url('tag'), _('Recent tags'),
+            _('Recent tags'), $action == 'tag');
 
-               if (count(common_config('nickname', 'featured')) > 0) {
-                       common_menu_item(common_local_url('featured'), _('Featured'),
-                               _('Featured users'), $action == 'featured');
-               }
+        if (count(common_config('nickname', 'featured')) > 0) {
+            common_menu_item(common_local_url('featured'), _('Featured'),
+                _('Featured users'), $action == 'featured');
+        }
 
-               common_menu_item(common_local_url('favorited'), _('Popular'),
-                       _("Popular notices"), $action == 'favorited');
+        common_menu_item(common_local_url('favorited'), _('Popular'),
+            _("Popular notices"), $action == 'favorited');
 
-               common_element_end('ul');
+        common_element_end('ul');
 
-       }
+    }
 
     function show_notice_list($notice) {
         $nl = new NoticeList($notice);
index 91fc8445d7c34bc4a130819c5986f9ffd49a3350..55e74e0b2f8aa7cb7886c654adce639e28c90f2e 100644 (file)
@@ -27,13 +27,13 @@ require_once('XMPPHP/XMPP.php');
 
 function subs_subscribe_user($user, $other_nickname) {
 
-       $other = User::staticGet('nickname', $other_nickname);
+    $other = User::staticGet('nickname', $other_nickname);
 
-       if (!$other) {
-               return _('No such user.');
-       }
+    if (!$other) {
+        return _('No such user.');
+    }
 
-       return subs_subscribe_to($user, $other);
+    return subs_subscribe_to($user, $other);
 }
 
 /* Subscribe user $user to other user $other.
@@ -43,54 +43,54 @@ function subs_subscribe_user($user, $other_nickname) {
 
 function subs_subscribe_to($user, $other) {
 
-       if ($user->isSubscribed($other)) {
-               return _('Already subscribed!.');
-       }
+    if ($user->isSubscribed($other)) {
+        return _('Already subscribed!.');
+    }
 
     if ($other->hasBlocked($user)) {
-               return _('User has blocked you.');
+        return _('User has blocked you.');
     }
 
-       if (!$user->subscribeTo($other)) {
-               return _('Could not subscribe.');
-               return;
-       }
+    if (!$user->subscribeTo($other)) {
+        return _('Could not subscribe.');
+        return;
+    }
 
     subs_notify($other, $user);
 
-       if (common_config('memcached', 'enabled')) {
-               $cache = new Memcache();
-               if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
-                       $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
-               }
-       }
-
-       if ($other->autosubscribe && !$other->isSubscribed($user) && !$user->hasBlocked($other)) {
-               if (!$other->subscribeTo($user)) {
-                       return _('Could not subscribe other to you.');
-               }
-               if (common_config('memcached', 'enabled')) {
-                       $cache = new Memcache();
-                       if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
-                               $cache->delete(common_cache_key('user:notices_with_friends:' . $other->id));
-                       }
-               }
-
-               subs_notify($user, $other);
-       }
-
-       return true;
+    if (common_config('memcached', 'enabled')) {
+        $cache = new Memcache();
+        if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
+            $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+        }
+    }
+
+    if ($other->autosubscribe && !$other->isSubscribed($user) && !$user->hasBlocked($other)) {
+        if (!$other->subscribeTo($user)) {
+            return _('Could not subscribe other to you.');
+        }
+        if (common_config('memcached', 'enabled')) {
+            $cache = new Memcache();
+            if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
+                $cache->delete(common_cache_key('user:notices_with_friends:' . $other->id));
+            }
+        }
+
+        subs_notify($user, $other);
+    }
+
+    return true;
 }
 
 function subs_notify($listenee, $listener) {
-       # XXX: add other notifications (Jabber, SMS) here
-       # XXX: queue this and handle it offline
-       # XXX: Whatever happens, do it in Twitter-like API, too
-       subs_notify_email($listenee, $listener);
+    # XXX: add other notifications (Jabber, SMS) here
+    # XXX: queue this and handle it offline
+    # XXX: Whatever happens, do it in Twitter-like API, too
+    subs_notify_email($listenee, $listener);
 }
 
 function subs_notify_email($listenee, $listener) {
-       mail_subscribe_notify($listenee, $listener);
+    mail_subscribe_notify($listenee, $listener);
 }
 
 /* Unsubscribe $user from nickname $other_nickname
@@ -99,13 +99,13 @@ function subs_notify_email($listenee, $listener) {
 
 function subs_unsubscribe_user($user, $other_nickname) {
 
-       $other = User::staticGet('nickname', $other_nickname);
+    $other = User::staticGet('nickname', $other_nickname);
 
-       if (!$other) {
-               return _('No such user.');
-       }
+    if (!$other) {
+        return _('No such user.');
+    }
 
-       return subs_unsubscribe_to($user, $other->getProfile());
+    return subs_unsubscribe_to($user, $other->getProfile());
 }
 
 /* Unsubscribe user $user from profile $other
@@ -113,28 +113,28 @@ function subs_unsubscribe_user($user, $other_nickname) {
 
 function subs_unsubscribe_to($user, $other) {
 
-       if (!$user->isSubscribed($other))
-               return _('Not subscribed!.');
+    if (!$user->isSubscribed($other))
+        return _('Not subscribed!.');
 
-       $sub = DB_DataObject::factory('subscription');
+    $sub = DB_DataObject::factory('subscription');
 
-       $sub->subscriber = $user->id;
-       $sub->subscribed = $other->id;
+    $sub->subscriber = $user->id;
+    $sub->subscribed = $other->id;
 
-       $sub->find(true);
+    $sub->find(true);
 
-       // note we checked for existence above
+    // note we checked for existence above
 
-       if (!$sub->delete())
-               return _('Couldn\'t delete subscription.');
+    if (!$sub->delete())
+        return _('Couldn\'t delete subscription.');
 
-       if (common_config('memcached', 'enabled')) {
-               $cache = new Memcache();
-               if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
-                       $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
-               }
-       }
+    if (common_config('memcached', 'enabled')) {
+        $cache = new Memcache();
+        if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
+            $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+        }
+    }
 
-       return true;
+    return true;
 }
 
index 80982aa82b0d59f7742fd2d128dceccbbb60881b..346cff4343ae67b31f331c02c6e4dac2ca0e508a 100644 (file)
 if (!defined('LACONICA')) { exit(1); }
 
 function theme_file($relative) {
-       $theme = common_config('site', 'theme');
-       return INSTALLDIR.'/theme/'.$theme.'/'.$relative;
+    $theme = common_config('site', 'theme');
+    return INSTALLDIR.'/theme/'.$theme.'/'.$relative;
 }
 
 function theme_path($relative) {
-       $theme = common_config('site', 'theme');
-       $server = common_config('theme', 'server');
-       if ($server) {
-               return 'http://'.$server.'/'.$theme.'/'.$relative;
-       } else {
-               return common_path('theme/'.$theme.'/'.$relative);
-       }
+    $theme = common_config('site', 'theme');
+    $server = common_config('theme', 'server');
+    if ($server) {
+        return 'http://'.$server.'/'.$theme.'/'.$relative;
+    } else {
+        return common_path('theme/'.$theme.'/'.$relative);
+    }
 }
\ No newline at end of file
index 5c9ef5d6f540e40107d4715270b2f4bf368f5c43..c1d2de0eaed5a6af569a6922de6fc5f0f330ba10 100644 (file)
@@ -21,179 +21,179 @@ if (!defined('LACONICA')) { exit(1); }
 
 function get_twitter_data($uri, $screen_name, $password) {
 
-       $options = array(
-                       CURLOPT_USERPWD => sprintf("%s:%s", $screen_name, $password),
-                       CURLOPT_RETURNTRANSFER  => true,
-                       CURLOPT_FAILONERROR             => true,
-                       CURLOPT_HEADER                  => false,
-                       CURLOPT_FOLLOWLOCATION  => true,
-                       // CURLOPT_USERAGENT            => "identi.ca",
-                       CURLOPT_CONNECTTIMEOUT  => 120,
-                       CURLOPT_TIMEOUT                 => 120
-       );
-
-
-       $ch = curl_init($uri);
+    $options = array(
+            CURLOPT_USERPWD => sprintf("%s:%s", $screen_name, $password),
+            CURLOPT_RETURNTRANSFER    => true,
+            CURLOPT_FAILONERROR        => true,
+            CURLOPT_HEADER            => false,
+            CURLOPT_FOLLOWLOCATION    => true,
+            // CURLOPT_USERAGENT        => "identi.ca",
+            CURLOPT_CONNECTTIMEOUT    => 120,
+            CURLOPT_TIMEOUT            => 120
+    );
+
+
+    $ch = curl_init($uri);
     curl_setopt_array($ch, $options);
     $data = curl_exec($ch);
     $errmsg = curl_error($ch);
 
-       if ($errmsg) {
-               common_debug("Twitter bridge - cURL error: $errmsg - trying to load: $uri with user $twit_user.",
-                       __FILE__);
-       }
+    if ($errmsg) {
+        common_debug("Twitter bridge - cURL error: $errmsg - trying to load: $uri with user $twit_user.",
+            __FILE__);
+    }
 
-       curl_close($ch);
+    curl_close($ch);
 
-       return $data;
+    return $data;
 }
 
 function twitter_user_info($screen_name, $password) {
 
-       $uri = "http://twitter.com/users/show/$screen_name.json";
-       $data = get_twitter_data($uri, $screen_name, $password);
+    $uri = "http://twitter.com/users/show/$screen_name.json";
+    $data = get_twitter_data($uri, $screen_name, $password);
 
-       if (!$data) {
-               return false;
-       }
+    if (!$data) {
+        return false;
+    }
 
-       $twit_user = json_decode($data);
+    $twit_user = json_decode($data);
 
-       if (!$twit_user) {
-               return false;
-       }
+    if (!$twit_user) {
+        return false;
+    }
 
-       return $twit_user;
+    return $twit_user;
 }
 
 function update_twitter_user($fuser, $twitter_id, $screen_name) {
 
-       $original = clone($fuser);
-       $fuser->nickname = $screen_name;
-       $fuser->uri = 'http://twitter.com/' . $screen_name;
-       $result = $fuser->updateKeys($original);
+    $original = clone($fuser);
+    $fuser->nickname = $screen_name;
+    $fuser->uri = 'http://twitter.com/' . $screen_name;
+    $result = $fuser->updateKeys($original);
 
-       if (!$result) {
-               common_log_db_error($fuser, 'UPDATE', __FILE__);
-               return false;
-       }
+    if (!$result) {
+        common_log_db_error($fuser, 'UPDATE', __FILE__);
+        return false;
+    }
 
-       return true;
+    return true;
 }
 
 function add_twitter_user($twitter_id, $screen_name) {
 
-       // Otherwise, create a new Twitter user
-       $fuser = DB_DataObject::factory('foreign_user');
+    // Otherwise, create a new Twitter user
+    $fuser = DB_DataObject::factory('foreign_user');
 
-       $fuser->nickname = $screen_name;
-       $fuser->uri = 'http://twitter.com/' . $screen_name;
-       $fuser->id = $twitter_id;
-       $fuser->service = 1; // Twitter
-       $fuser->created = common_sql_now();
-       $result = $fuser->insert();
+    $fuser->nickname = $screen_name;
+    $fuser->uri = 'http://twitter.com/' . $screen_name;
+    $fuser->id = $twitter_id;
+    $fuser->service = 1; // Twitter
+    $fuser->created = common_sql_now();
+    $result = $fuser->insert();
 
-       if (!$result) {
-               common_debug("Twitter bridge - failed to add new Twitter user: $twitter_id - $screen_name.");
-               common_log_db_error($fuser, 'INSERT', __FILE__);
-               return false;
-       }
+    if (!$result) {
+        common_debug("Twitter bridge - failed to add new Twitter user: $twitter_id - $screen_name.");
+        common_log_db_error($fuser, 'INSERT', __FILE__);
+        return false;
+    }
 
-       common_debug("Twitter bridge - Added new Twitter user: $screen_name ($twitter_id).");
+    common_debug("Twitter bridge - Added new Twitter user: $screen_name ($twitter_id).");
 
-       return true;
+    return true;
 }
 
 // Creates or Updates a Twitter user
 function save_twitter_user($twitter_id, $screen_name) {
 
-       // Check to see whether the Twitter user is already in the system,
-       // and update its screen name and uri if so.
-       $fuser = Foreign_user::getForeignUser($twitter_id, 1);
+    // Check to see whether the Twitter user is already in the system,
+    // and update its screen name and uri if so.
+    $fuser = Foreign_user::getForeignUser($twitter_id, 1);
 
-       if ($fuser) {
+    if ($fuser) {
 
-               // Only update if Twitter screen name has changed
-               if ($fuser->nickname != $screen_name) {
+        // Only update if Twitter screen name has changed
+        if ($fuser->nickname != $screen_name) {
 
-                       common_debug('Twitter bridge - Updated nickname (and URI) for Twitter user ' .
-                               "$fuser->id to $screen_name, was $fuser->nickname");
+            common_debug('Twitter bridge - Updated nickname (and URI) for Twitter user ' .
+                "$fuser->id to $screen_name, was $fuser->nickname");
 
-                       return update_twitter_user($fuser, $twitter_id, $screen_name);
-               }
+            return update_twitter_user($fuser, $twitter_id, $screen_name);
+        }
 
-       } else {
-               return add_twitter_user($twitter_id, $screen_name);
-       }
+    } else {
+        return add_twitter_user($twitter_id, $screen_name);
+    }
 
-       return true;
+    return true;
 }
 
 function retreive_twitter_friends($twitter_id, $screen_name, $password) {
 
-       $uri = "http://twitter.com/statuses/friends/$twitter_id.json?page=";
-       $twitter_user = twitter_user_info($screen_name, $password);
+    $uri = "http://twitter.com/statuses/friends/$twitter_id.json?page=";
+    $twitter_user = twitter_user_info($screen_name, $password);
 
-       // Calculate how many pages to get...
-       $pages = ceil($twitter_user->friends_count / 100);
+    // Calculate how many pages to get...
+    $pages = ceil($twitter_user->friends_count / 100);
 
-       if ($pages == 0) {
-               common_debug("Twitter bridge - Twitter user $screen_name has no friends! Lame.");
-       }
+    if ($pages == 0) {
+        common_debug("Twitter bridge - Twitter user $screen_name has no friends! Lame.");
+    }
 
-       $friends = array();
+    $friends = array();
 
-       for ($i = 1; $i <= $pages; $i++) {
+    for ($i = 1; $i <= $pages; $i++) {
 
-               $data = get_twitter_data($uri . $i, $screen_name, $password);
+        $data = get_twitter_data($uri . $i, $screen_name, $password);
 
-               if (!$data) {
-                       return NULL;
-               }
+        if (!$data) {
+            return NULL;
+        }
 
-               $more_friends = json_decode($data);
+        $more_friends = json_decode($data);
 
-               if (!$more_friends) {
-                       return NULL;
-               }
+        if (!$more_friends) {
+            return NULL;
+        }
 
-               $friends = array_merge($friends, $more_friends);
-       }
+         $friends = array_merge($friends, $more_friends);
+    }
 
-       return $friends;
+    return $friends;
 }
 
 function save_twitter_friends($user, $twitter_id, $screen_name, $password) {
 
-       $friends = retreive_twitter_friends($twitter_id, $screen_name, $password);
+    $friends = retreive_twitter_friends($twitter_id, $screen_name, $password);
 
-       if (is_null($friends)) {
-               common_debug("Twitter bridge - Couldn't get friends data from Twitter.");
-               return false;
-       }
+    if (is_null($friends)) {
+        common_debug("Twitter bridge - Couldn't get friends data from Twitter.");
+        return false;
+    }
 
     foreach ($friends as $friend) {
 
-               $friend_name = $friend->screen_name;
-               $friend_id = $friend->id;
+        $friend_name = $friend->screen_name;
+        $friend_id = $friend->id;
 
-               // Update or create the Foreign_user record
-               if (!save_twitter_user($friend_id, $friend_name)) {
-                       return false;
-               }
+        // Update or create the Foreign_user record
+        if (!save_twitter_user($friend_id, $friend_name)) {
+            return false;
+        }
 
-               // Check to see if there's a related local user
-               $flink = Foreign_link::getByForeignID($friend_id, 1);
+        // Check to see if there's a related local user
+        $flink = Foreign_link::getByForeignID($friend_id, 1);
 
-               if ($flink) {
+        if ($flink) {
 
-                       // Get associated user and subscribe her
-                       $friend_user = User::staticGet('id', $flink->user_id);
-                       subs_subscribe_to($user, $friend_user);
-                       common_debug("Twitter bridge - subscribed $friend_user->nickname to $user->nickname.");
-               }
-       }
+            // Get associated user and subscribe her
+            $friend_user = User::staticGet('id', $flink->user_id);
+            subs_subscribe_to($user, $friend_user);
+            common_debug("Twitter bridge - subscribed $friend_user->nickname to $user->nickname.");
+        }
+    }
 
-       return true;
+    return true;
 }
 
index 2eb127525c5c0bb1b819e85345ecce506c72e7d1..3122caf12ec1282ea3eff0d2225649123e2c284f 100644 (file)
@@ -21,637 +21,637 @@ if (!defined('LACONICA')) { exit(1); }
 
 class TwitterapiAction extends Action {
 
-       var $auth_user;
+    var $auth_user;
 
-       function handle($args) {
-               parent::handle($args);
-       }
+    function handle($args) {
+        parent::handle($args);
+    }
 
-       function twitter_user_array($profile, $get_notice=false) {
+    function twitter_user_array($profile, $get_notice=false) {
 
-               $twitter_user = array();
+        $twitter_user = array();
 
-               $twitter_user['name'] = $profile->getBestName();
-               $twitter_user['followers_count'] = $this->count_subscriptions($profile);
-               $twitter_user['screen_name'] = $profile->nickname;
-               $twitter_user['description'] = ($profile->bio) ? $profile->bio : NULL;
-               $twitter_user['location'] = ($profile->location) ? $profile->location : NULL;
-               $twitter_user['id'] = intval($profile->id);
+        $twitter_user['name'] = $profile->getBestName();
+        $twitter_user['followers_count'] = $this->count_subscriptions($profile);
+        $twitter_user['screen_name'] = $profile->nickname;
+        $twitter_user['description'] = ($profile->bio) ? $profile->bio : NULL;
+        $twitter_user['location'] = ($profile->location) ? $profile->location : NULL;
+        $twitter_user['id'] = intval($profile->id);
 
-               $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
+        $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
 
-               $twitter_user['profile_image_url'] = ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE);
-               $twitter_user['protected'] = 'false'; # not supported by Laconica yet
-               $twitter_user['url'] = ($profile->homepage) ? $profile->homepage : NULL;
+        $twitter_user['profile_image_url'] = ($avatar) ? common_avatar_display_url($avatar) : common_default_avatar(AVATAR_STREAM_SIZE);
+        $twitter_user['protected'] = 'false'; # not supported by Laconica yet
+        $twitter_user['url'] = ($profile->homepage) ? $profile->homepage : NULL;
 
-               if ($get_notice) {
-                       $notice = $profile->getCurrentNotice();
-                       if ($notice) {
-                               # don't get user!
-                               $twitter_user['status'] = $this->twitter_status_array($notice, false);
-                       }
-               }
+        if ($get_notice) {
+            $notice = $profile->getCurrentNotice();
+            if ($notice) {
+                # don't get user!
+                $twitter_user['status'] = $this->twitter_status_array($notice, false);
+            }
+        }
 
-               return $twitter_user;
-       }
+        return $twitter_user;
+    }
 
-       function twitter_status_array($notice, $include_user=true) {
+    function twitter_status_array($notice, $include_user=true) {
 
-               $profile = $notice->getProfile();
+        $profile = $notice->getProfile();
 
-               $twitter_status = array();
-               $twitter_status['text'] = $notice->content;
-               $twitter_status['truncated'] = 'false'; # Not possible on Laconica
-               $twitter_status['created_at'] = $this->date_twitter($notice->created);
-               $twitter_status['in_reply_to_status_id'] = ($notice->reply_to) ? intval($notice->reply_to) : NULL;
-               $twitter_status['source'] = $this->source_link($notice->source);
-               $twitter_status['id'] = intval($notice->id);
-               $twitter_status['in_reply_to_user_id'] = ($notice->reply_to) ? $this->replier_by_reply(intval($notice->reply_to)) : NULL;
+        $twitter_status = array();
+        $twitter_status['text'] = $notice->content;
+        $twitter_status['truncated'] = 'false'; # Not possible on Laconica
+        $twitter_status['created_at'] = $this->date_twitter($notice->created);
+        $twitter_status['in_reply_to_status_id'] = ($notice->reply_to) ? intval($notice->reply_to) : NULL;
+        $twitter_status['source'] = $this->source_link($notice->source);
+        $twitter_status['id'] = intval($notice->id);
+        $twitter_status['in_reply_to_user_id'] = ($notice->reply_to) ? $this->replier_by_reply(intval($notice->reply_to)) : NULL;
 
-               if (isset($this->auth_user)) {
-                       $twitter_status['favorited'] = ($this->auth_user->hasFave($notice)) ? 'true' : 'false';
-               } else {
-                       $twitter_status['favorited'] = 'false';
-               }
+        if (isset($this->auth_user)) {
+            $twitter_status['favorited'] = ($this->auth_user->hasFave($notice)) ? 'true' : 'false';
+        } else {
+            $twitter_status['favorited'] = 'false';
+        }
 
-               if ($include_user) {
-                       # Don't get notice (recursive!)
-                       $twitter_user = $this->twitter_user_array($profile, false);
-                       $twitter_status['user'] = $twitter_user;
-               }
+        if ($include_user) {
+            # Don't get notice (recursive!)
+            $twitter_user = $this->twitter_user_array($profile, false);
+            $twitter_status['user'] = $twitter_user;
+        }
 
-               return $twitter_status;
-       }
+        return $twitter_status;
+    }
 
-       function twitter_rss_entry_array($notice) {
+    function twitter_rss_entry_array($notice) {
 
-               $profile = $notice->getProfile();
+        $profile = $notice->getProfile();
 
-               $server = common_config('site', 'server');
-               $entry = array();
+        $server = common_config('site', 'server');
+        $entry = array();
 
         # We trim() to avoid extraneous whitespace in the output
 
-               $entry['content'] = common_xml_safe_str(trim($notice->rendered));
-               $entry['title'] = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
-               $entry['link'] = common_local_url('shownotice', array('notice' => $notice->id));
-               $entry['published'] = common_date_iso8601($notice->created);
-               $entry['id'] = "tag:$server,2008:$entry[link]";
-               $entry['updated'] = $entry['published'];
-
-               # RSS Item specific
-               $entry['description'] = $entry['content'];
-               $entry['pubDate'] = common_date_rfc2822($notice->created);
-               $entry['guid'] = $entry['link'];
-
-               return $entry;
-       }
-
-       function twitter_rss_dmsg_array($message) {
-
-               $server = common_config('site', 'server');
-               $entry = array();
-
-               $entry['title'] = sprintf('Message from %s to %s',
-                       $message->getFrom()->nickname, $message->getTo()->nickname);
-
-               $entry['content'] = common_xml_safe_str(trim($message->content));
-               $entry['link'] = common_local_url('showmessage', array('message' => $message->id));
-               $entry['published'] = common_date_iso8601($message->created);
-               $entry['id'] = "tag:$server,2008:$entry[link]";
-               $entry['updated'] = $entry['published'];
-
-               # RSS Item specific
-               $entry['description'] = $entry['content'];
-               $entry['pubDate'] = common_date_rfc2822($message->created);
-               $entry['guid'] = $entry['link'];
-
-               return $entry;
-       }
-
-       function twitter_dmsg_array($message) {
-
-               $twitter_dm = array();
-
-               $from_profile = $message->getFrom();
-               $to_profile = $message->getTo();
-
-               $twitter_dm['id'] = $message->id;
-               $twitter_dm['sender_id'] = $message->from_profile;
-               $twitter_dm['text'] = trim($message->content);
-               $twitter_dm['recipient_id'] = $message->to_profile;
-               $twitter_dm['created_at'] = $this->date_twitter($message->created);
-               $twitter_dm['sender_screen_name'] = $from_profile->nickname;
-               $twitter_dm['recipient_screen_name'] = $to_profile->nickname;
-               $twitter_dm['sender'] = $this->twitter_user_array($from_profile, false);
-               $twitter_dm['recipient'] = $this->twitter_user_array($to_profile, false);
-
-               return $twitter_dm;
-       }
-
-       function show_twitter_xml_status($twitter_status) {
-               common_element_start('status');
-               foreach($twitter_status as $element => $value) {
-                       switch ($element) {
-                       case 'user':
-                               $this->show_twitter_xml_user($twitter_status['user']);
-                               break;
-                       case 'text':
-                               common_element($element, NULL, common_xml_safe_str($value));
-                               break;
-                       default:
-                               common_element($element, NULL, $value);
-                       }
-               }
-               common_element_end('status');
-       }
-
-       function show_twitter_xml_user($twitter_user, $role='user') {
-               common_element_start($role);
-               foreach($twitter_user as $element => $value) {
-                       if ($element == 'status') {
-                               $this->show_twitter_xml_status($twitter_user['status']);
-                       } else {
-                               common_element($element, NULL, $value);
-                       }
-               }
-               common_element_end($role);
-       }
-
-       function show_twitter_rss_item($entry) {
-               common_element_start('item');
-               common_element('title', NULL, $entry['title']);
-               common_element('description', NULL, $entry['description']);
-               common_element('pubDate', NULL, $entry['pubDate']);
-               common_element('guid', NULL, $entry['guid']);
-               common_element('link', NULL, $entry['link']);
-               common_element_end('item');
-       }
-
-       function show_twitter_atom_entry($entry) {
-           common_element_start('entry');
-               common_element('title', NULL, $entry['title']);
-               common_element('content', array('type' => 'html'), $entry['content']);
-               common_element('id', NULL, $entry['id']);
-               common_element('published', NULL, $entry['published']);
-               common_element('updated', NULL, $entry['updated']);
-               common_element('link', array('href' => $entry['link'], 'rel' => 'alternate', 'type' => 'text/html'), NULL);
-               common_element_end('entry');
-       }
-
-       function show_json_objects($objects) {
-               print(json_encode($objects));
-       }
-
-       function show_single_xml_status($notice) {
-               $this->init_document('xml');
-               $twitter_status = $this->twitter_status_array($notice);
-               $this->show_twitter_xml_status($twitter_status);
-               $this->end_document('xml');
-       }
-
-       function show_single_json_status($notice) {
-               $this->init_document('json');
-               $status = $this->twitter_status_array($notice);
-               $this->show_json_objects($status);
-               $this->end_document('json');
-       }
-
-       function show_single_xml_dmsg($message) {
-               $this->init_document('xml');
-               $dmsg = $this->twitter_dmsg_array($message);
-               $this->show_twitter_xml_dmsg($dmsg);
-               $this->end_document('xml');
-       }
-
-       function show_single_json_dmsg($message) {
-               $this->init_document('json');
-               $dmsg = $this->twitter_dmsg_array($message);
-               $this->show_json_objects($dmsg);
-               $this->end_document('json');
-       }
-
-       function show_twitter_xml_dmsg($twitter_dm) {
-               common_element_start('direct_message');
-               foreach($twitter_dm as $element => $value) {
-                       switch ($element) {
-                       case 'sender':
-                       case 'recipient':
-                               $this->show_twitter_xml_user($value, $element);
-                               break;
-                       case 'text':
-                               common_element($element, NULL, common_xml_safe_str($value));
-                               break;
-                       default:
-                               common_element($element, NULL, $value);
-                       }
-               }
-               common_element_end('direct_message');
-       }
-
-       function show_xml_timeline($notice) {
-
-               $this->init_document('xml');
-               common_element_start('statuses', array('type' => 'array'));
-
-               if (is_array($notice)) {
-                       foreach ($notice as $n) {
-                               $twitter_status = $this->twitter_status_array($n);
-                               $this->show_twitter_xml_status($twitter_status);
-                       }
-               } else {
-                       while ($notice->fetch()) {
-                               $twitter_status = $this->twitter_status_array($notice);
-                               $this->show_twitter_xml_status($twitter_status);
-                       }
-               }
-
-               common_element_end('statuses');
-               $this->end_document('xml');
-       }
-
-       function show_rss_timeline($notice, $title, $link, $subtitle, $suplink=NULL) {
-
-               $this->init_document('rss');
-
-               common_element_start('channel');
-               common_element('title', NULL, $title);
-               common_element('link', NULL, $link);
-               if (!is_null($suplink)) {
-                       # For FriendFeed's SUP protocol
-                       common_element('link', array('xmlns' => 'http://www.w3.org/2005/Atom',
-                                                                                'rel' => 'http://api.friendfeed.com/2008/03#sup',
-                                                                                'href' => $suplink,
-                                                                                'type' => 'application/json'));
-               }
-               common_element('description', NULL, $subtitle);
-               common_element('language', NULL, 'en-us');
-               common_element('ttl', NULL, '40');
-
-               if (is_array($notice)) {
-                       foreach ($notice as $n) {
-                               $entry = $this->twitter_rss_entry_array($n);
-                               $this->show_twitter_rss_item($entry);
-                       }
-               } else {
-                       while ($notice->fetch()) {
-                               $entry = $this->twitter_rss_entry_array($notice);
-                               $this->show_twitter_rss_item($entry);
-                       }
-               }
-
-               common_element_end('channel');
-               $this->end_twitter_rss();
-       }
-
-       function show_atom_timeline($notice, $title, $id, $link, $subtitle=NULL, $suplink=NULL) {
-
-               $this->init_document('atom');
-
-               common_element('title', NULL, $title);
-               common_element('id', NULL, $id);
-               common_element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), NULL);
-               if (!is_null($suplink)) {
-                       # For FriendFeed's SUP protocol
-                       common_element('link', array('rel' => 'http://api.friendfeed.com/2008/03#sup',
-                                                                                'href' => $suplink,
-                                                                                'type' => 'application/json'));
-               }
-               common_element('subtitle', NULL, $subtitle);
-
-               if (is_array($notice)) {
-                       foreach ($notice as $n) {
-                               $entry = $this->twitter_rss_entry_array($n);
-                               $this->show_twitter_atom_entry($entry);
-                       }
-               } else {
-                       while ($notice->fetch()) {
-                               $entry = $this->twitter_rss_entry_array($notice);
-                               $this->show_twitter_atom_entry($entry);
-                       }
-               }
-
-               $this->end_document('atom');
-
-       }
-
-       function show_json_timeline($notice) {
-
-               $this->init_document('json');
-
-               $statuses = array();
-
-               if (is_array($notice)) {
-                       foreach ($notice as $n) {
-                               $twitter_status = $this->twitter_status_array($n);
-                               array_push($statuses, $twitter_status);
-                       }
-               } else {
-                       while ($notice->fetch()) {
-                               $twitter_status = $this->twitter_status_array($notice);
-                               array_push($statuses, $twitter_status);
-                       }
-               }
-
-               $this->show_json_objects($statuses);
-
-               $this->end_document('json');
-       }
-
-       // Anyone know what date format this is?
-       // Twitter's dates look like this: "Mon Jul 14 23:52:38 +0000 2008" -- Zach
-       function date_twitter($dt) {
-               $t = strtotime($dt);
-               return date("D M d G:i:s O Y", $t);
-       }
-
-       function replier_by_reply($reply_id) {
-               $notice = Notice::staticGet($reply_id);
-               if ($notice) {
-                       $profile = $notice->getProfile();
-                       if ($profile) {
-                               return intval($profile->id);
-                       } else {
-                               common_debug('Can\'t find a profile for notice: ' . $notice->id, __FILE__);
-                       }
-               } else {
-                       common_debug("Can't get notice: $reply_id", __FILE__);
-               }
-               return NULL;
-       }
-
-       // XXX: Candidate for a general utility method somewhere?
-       function count_subscriptions($profile) {
-
-               $count = 0;
-               $sub = new Subscription();
-               $sub->subscribed = $profile->id;
-
-               $count = $sub->find();
-
-               if ($count > 0) {
-                       return $count - 1;
-               } else {
-                       return 0;
-               }
-       }
-
-       function init_document($type='xml') {
-               switch ($type) {
-                case 'xml':
-                       header('Content-Type: application/xml; charset=utf-8');
-                       common_start_xml();
-                       break;
-                case 'json':
-                       header('Content-Type: application/json; charset=utf-8');
-
-                       // Check for JSONP callback
-                       $callback = $this->arg('callback');
-                       if ($callback) {
-                               print $callback . '(';
-                       }
-                       break;
-                case 'rss':
-                       header("Content-Type: application/rss+xml; charset=utf-8");
-                       $this->init_twitter_rss();
-                       break;
-                case 'atom':
-                       header('Content-Type: application/atom+xml; charset=utf-8');
-                       $this->init_twitter_atom();
-                       break;
-                default:
-                       $this->client_error(_('Not a supported data format.'));
-                       break;
-               }
-
-               return;
-       }
-
-       function end_document($type='xml') {
-               switch ($type) {
-                case 'xml':
-                       common_end_xml();
-                       break;
-                case 'json':
-
-                       // Check for JSONP callback
-                       $callback = $this->arg('callback');
-                       if ($callback) {
-                               print ')';
-                       }
-                       break;
-                case 'rss':
-                       $this->end_twitter_rss();
-                       break;
-                case 'atom':
-                       $this->end_twitter_rss();
-                       break;
-                default:
-                       $this->client_error(_('Not a supported data format.'));
-                       break;
-               }
-               return;
-       }
-
-       function client_error($msg, $code = 400, $content_type = 'json') {
-
-               static $status = array(400 => 'Bad Request',
-                                                          401 => 'Unauthorized',
-                                                          402 => 'Payment Required',
-                                                          403 => 'Forbidden',
-                                                          404 => 'Not Found',
-                                                          405 => 'Method Not Allowed',
-                                                          406 => 'Not Acceptable',
-                                                          407 => 'Proxy Authentication Required',
-                                                          408 => 'Request Timeout',
-                                                          409 => 'Conflict',
-                                                          410 => 'Gone',
-                                                          411 => 'Length Required',
-                                                          412 => 'Precondition Failed',
-                                                          413 => 'Request Entity Too Large',
-                                                          414 => 'Request-URI Too Long',
-                                                          415 => 'Unsupported Media Type',
-                                                          416 => 'Requested Range Not Satisfiable',
-                                                          417 => 'Expectation Failed');
-
-               $action = $this->trimmed('action');
-
-               common_debug("User error '$code' on '$action': $msg", __FILE__);
-
-               if (!array_key_exists($code, $status)) {
-                       $code = 400;
-               }
-
-               $status_string = $status[$code];
-               header('HTTP/1.1 '.$code.' '.$status_string);
-
-               if ($content_type == 'xml') {
-                       $this->init_document('xml');
-                       common_element_start('hash');
-                       common_element('error', NULL, $msg);
-                       common_element('request', NULL, $_SERVER['REQUEST_URI']);
-                       common_element_end('hash');
-                       $this->end_document('xml');
-               } else {
-                       $this->init_document('json');
-                       $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
-                       print(json_encode($error_array));
-                       $this->end_document('json');
-               }
-
-       }
-
-       function init_twitter_rss() {
-               common_start_xml();
-               common_element_start('rss', array('version' => '2.0'));
-       }
-
-       function end_twitter_rss() {
-               common_element_end('rss');
-               common_end_xml();
-       }
-
-       function init_twitter_atom() {
-               common_start_xml();
-               common_element_start('feed', array('xmlns' => 'http://www.w3.org/2005/Atom', 'xml:lang' => 'en-US'));
-       }
-
-       function end_twitter_atom() {
-               common_end_xml();
-               common_element_end('feed');
-       }
-
-       function show_profile($profile, $content_type='xml', $notice=NULL) {
-               $profile_array = $this->twitter_user_array($profile, true);
-               switch ($content_type) {
-                case 'xml':
-                       $this->show_twitter_xml_user($profile_array);
-                       break;
-                case 'json':
-                       $this->show_json_objects($profile_array);
-                       break;
-                default:
-                       $this->client_error(_('Not a supported data format.'));
-                       return;
-               }
-               return;
-       }
-
-       function get_user($id, $apidata=NULL) {
-               if (!$id) {
-                       return $apidata['user'];
-               } else if (is_numeric($id)) {
-                       return User::staticGet($id);
-               } else {
-                       $nickname = common_canonical_nickname($id);
-                       return User::staticGet('nickname', $nickname);
-               }
-       }
-
-       function get_profile($id) {
-               if (is_numeric($id)) {
-                       return Profile::staticGet($id);
-               } else {
-                       $user = User::staticGet('nickname', $id);
-                       if ($user) {
-                               return $user->getProfile();
-                       } else {
-                               return NULL;
-                       }
-               }
-       }
-
-       function source_link($source) {
-               $source_name = _($source);
-               switch ($source) {
-                case 'web':
-                case 'xmpp':
-                case 'mail':
-                case 'omb':
-                case 'api':
-                       break;
-                default:
-                       $ns = Notice_source::staticGet($source);
-                       if ($ns) {
-                               $source_name = '<a href="' . $ns->url . '">' . $ns->name . '</a>';
-                       }
-                       break;
-               }
-               return $source_name;
-       }
-
-       function show_extended_profile($user, $apidata) {
-
-               $this->auth_user = $apidata['user'];
-
-               $profile = $user->getProfile();
-
-               if (!$profile) {
-                       common_server_error(_('User has no profile.'));
-                       return;
-               }
-
-               $twitter_user = $this->twitter_user_array($profile, true);
-
-               // Add in extended user fields offered up by this method
-               $twitter_user['created_at'] = $this->date_twitter($profile->created);
-
-               $subbed = DB_DataObject::factory('subscription');
-               $subbed->subscriber = $profile->id;
-               $subbed_count = (int) $subbed->count() - 1;
-
-               $notices = DB_DataObject::factory('notice');
-               $notices->profile_id = $profile->id;
-               $notice_count = (int) $notices->count();
-
-               $twitter_user['friends_count'] = (is_int($subbed_count)) ? $subbed_count : 0;
-               $twitter_user['statuses_count'] = (is_int($notice_count)) ? $notice_count : 0;
-
-               // Other fields Twitter sends...
-               $twitter_user['profile_background_color'] = '';
-               $twitter_user['profile_text_color'] = '';
-               $twitter_user['profile_link_color'] = '';
-               $twitter_user['profile_sidebar_fill_color'] = '';
-
-               $faves = DB_DataObject::factory('fave');
-               $faves->user_id = $user->id;
-               $faves_count = (int) $faves->count();
-               $twitter_user['favourites_count'] = $faves_count;
-
-               $timezone = 'UTC';
-
-               if ($user->timezone) {
-                       $timezone = $user->timezone;
-               }
-
-               $t = new DateTime;
-               $t->setTimezone(new DateTimeZone($timezone));
-               $twitter_user['utc_offset'] = $t->format('Z');
-               $twitter_user['time_zone'] = $timezone;
-
-               $following = 'false';
-
-               if (isset($this->auth_user)) {
-                       if ($this->auth_user->isSubscribed($profile)) {
-                               $following = 'true';
-                       }
-
-                       // Not implemented yet
-                       $twitter_user['notifications'] = 'false';
-               }
-
-               $twitter_user['following'] = $following;
-
-               if ($apidata['content-type'] == 'xml') {
-                       $this->init_document('xml');
-                       $this->show_twitter_xml_user($twitter_user);
-                       $this->end_document('xml');
-               } elseif ($apidata['content-type'] == 'json') {
-                       $this->init_document('json');
-                       $this->show_json_objects($twitter_user);
-                       $this->end_document('json');
-               }
-
-       }
+        $entry['content'] = common_xml_safe_str(trim($notice->rendered));
+        $entry['title'] = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
+        $entry['link'] = common_local_url('shownotice', array('notice' => $notice->id));
+        $entry['published'] = common_date_iso8601($notice->created);
+        $entry['id'] = "tag:$server,2008:$entry[link]";
+        $entry['updated'] = $entry['published'];
+
+        # RSS Item specific
+        $entry['description'] = $entry['content'];
+        $entry['pubDate'] = common_date_rfc2822($notice->created);
+        $entry['guid'] = $entry['link'];
+
+        return $entry;
+    }
+
+    function twitter_rss_dmsg_array($message) {
+
+        $server = common_config('site', 'server');
+        $entry = array();
+
+        $entry['title'] = sprintf('Message from %s to %s',
+            $message->getFrom()->nickname, $message->getTo()->nickname);
+
+        $entry['content'] = common_xml_safe_str(trim($message->content));
+        $entry['link'] = common_local_url('showmessage', array('message' => $message->id));
+        $entry['published'] = common_date_iso8601($message->created);
+        $entry['id'] = "tag:$server,2008:$entry[link]";
+        $entry['updated'] = $entry['published'];
+
+        # RSS Item specific
+        $entry['description'] = $entry['content'];
+        $entry['pubDate'] = common_date_rfc2822($message->created);
+        $entry['guid'] = $entry['link'];
+
+        return $entry;
+    }
+
+    function twitter_dmsg_array($message) {
+
+        $twitter_dm = array();
+
+        $from_profile = $message->getFrom();
+        $to_profile = $message->getTo();
+
+        $twitter_dm['id'] = $message->id;
+        $twitter_dm['sender_id'] = $message->from_profile;
+        $twitter_dm['text'] = trim($message->content);
+        $twitter_dm['recipient_id'] = $message->to_profile;
+        $twitter_dm['created_at'] = $this->date_twitter($message->created);
+        $twitter_dm['sender_screen_name'] = $from_profile->nickname;
+        $twitter_dm['recipient_screen_name'] = $to_profile->nickname;
+        $twitter_dm['sender'] = $this->twitter_user_array($from_profile, false);
+        $twitter_dm['recipient'] = $this->twitter_user_array($to_profile, false);
+
+        return $twitter_dm;
+    }
+
+    function show_twitter_xml_status($twitter_status) {
+        common_element_start('status');
+        foreach($twitter_status as $element => $value) {
+            switch ($element) {
+            case 'user':
+                $this->show_twitter_xml_user($twitter_status['user']);
+                break;
+            case 'text':
+                common_element($element, NULL, common_xml_safe_str($value));
+                break;
+            default:
+                common_element($element, NULL, $value);
+            }
+        }
+        common_element_end('status');
+    }
+
+    function show_twitter_xml_user($twitter_user, $role='user') {
+        common_element_start($role);
+        foreach($twitter_user as $element => $value) {
+            if ($element == 'status') {
+                $this->show_twitter_xml_status($twitter_user['status']);
+            } else {
+                common_element($element, NULL, $value);
+            }
+        }
+        common_element_end($role);
+    }
+
+    function show_twitter_rss_item($entry) {
+        common_element_start('item');
+        common_element('title', NULL, $entry['title']);
+        common_element('description', NULL, $entry['description']);
+        common_element('pubDate', NULL, $entry['pubDate']);
+        common_element('guid', NULL, $entry['guid']);
+        common_element('link', NULL, $entry['link']);
+        common_element_end('item');
+    }
+
+    function show_twitter_atom_entry($entry) {
+        common_element_start('entry');
+        common_element('title', NULL, $entry['title']);
+        common_element('content', array('type' => 'html'), $entry['content']);
+        common_element('id', NULL, $entry['id']);
+        common_element('published', NULL, $entry['published']);
+        common_element('updated', NULL, $entry['updated']);
+        common_element('link', array('href' => $entry['link'], 'rel' => 'alternate', 'type' => 'text/html'), NULL);
+        common_element_end('entry');
+    }
+
+    function show_json_objects($objects) {
+        print(json_encode($objects));
+    }
+
+    function show_single_xml_status($notice) {
+        $this->init_document('xml');
+        $twitter_status = $this->twitter_status_array($notice);
+        $this->show_twitter_xml_status($twitter_status);
+        $this->end_document('xml');
+    }
+
+    function show_single_json_status($notice) {
+        $this->init_document('json');
+        $status = $this->twitter_status_array($notice);
+        $this->show_json_objects($status);
+        $this->end_document('json');
+    }
+
+    function show_single_xml_dmsg($message) {
+        $this->init_document('xml');
+        $dmsg = $this->twitter_dmsg_array($message);
+        $this->show_twitter_xml_dmsg($dmsg);
+        $this->end_document('xml');
+    }
+
+    function show_single_json_dmsg($message) {
+        $this->init_document('json');
+        $dmsg = $this->twitter_dmsg_array($message);
+        $this->show_json_objects($dmsg);
+        $this->end_document('json');
+    }
+
+    function show_twitter_xml_dmsg($twitter_dm) {
+        common_element_start('direct_message');
+        foreach($twitter_dm as $element => $value) {
+            switch ($element) {
+            case 'sender':
+            case 'recipient':
+                $this->show_twitter_xml_user($value, $element);
+                break;
+            case 'text':
+                common_element($element, NULL, common_xml_safe_str($value));
+                break;
+            default:
+                common_element($element, NULL, $value);
+            }
+        }
+        common_element_end('direct_message');
+    }
+
+    function show_xml_timeline($notice) {
+
+        $this->init_document('xml');
+        common_element_start('statuses', array('type' => 'array'));
+
+        if (is_array($notice)) {
+            foreach ($notice as $n) {
+                $twitter_status = $this->twitter_status_array($n);
+                $this->show_twitter_xml_status($twitter_status);
+            }
+        } else {
+            while ($notice->fetch()) {
+                $twitter_status = $this->twitter_status_array($notice);
+                $this->show_twitter_xml_status($twitter_status);
+            }
+        }
+
+        common_element_end('statuses');
+        $this->end_document('xml');
+    }
+
+    function show_rss_timeline($notice, $title, $link, $subtitle, $suplink=NULL) {
+
+        $this->init_document('rss');
+
+        common_element_start('channel');
+        common_element('title', NULL, $title);
+        common_element('link', NULL, $link);
+        if (!is_null($suplink)) {
+            # For FriendFeed's SUP protocol
+            common_element('link', array('xmlns' => 'http://www.w3.org/2005/Atom',
+                                         'rel' => 'http://api.friendfeed.com/2008/03#sup',
+                                         'href' => $suplink,
+                                         'type' => 'application/json'));
+        }
+        common_element('description', NULL, $subtitle);
+        common_element('language', NULL, 'en-us');
+        common_element('ttl', NULL, '40');
+
+        if (is_array($notice)) {
+            foreach ($notice as $n) {
+                $entry = $this->twitter_rss_entry_array($n);
+                $this->show_twitter_rss_item($entry);
+            }
+        } else {
+            while ($notice->fetch()) {
+                $entry = $this->twitter_rss_entry_array($notice);
+                $this->show_twitter_rss_item($entry);
+            }
+        }
+
+        common_element_end('channel');
+        $this->end_twitter_rss();
+    }
+
+    function show_atom_timeline($notice, $title, $id, $link, $subtitle=NULL, $suplink=NULL) {
+
+        $this->init_document('atom');
+
+        common_element('title', NULL, $title);
+        common_element('id', NULL, $id);
+        common_element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), NULL);
+        if (!is_null($suplink)) {
+            # For FriendFeed's SUP protocol
+            common_element('link', array('rel' => 'http://api.friendfeed.com/2008/03#sup',
+                                         'href' => $suplink,
+                                         'type' => 'application/json'));
+        }
+        common_element('subtitle', NULL, $subtitle);
+
+        if (is_array($notice)) {
+            foreach ($notice as $n) {
+                $entry = $this->twitter_rss_entry_array($n);
+                $this->show_twitter_atom_entry($entry);
+            }
+        } else {
+            while ($notice->fetch()) {
+                $entry = $this->twitter_rss_entry_array($notice);
+                $this->show_twitter_atom_entry($entry);
+            }
+        }
+
+        $this->end_document('atom');
+
+    }
+
+    function show_json_timeline($notice) {
+
+        $this->init_document('json');
+
+        $statuses = array();
+
+        if (is_array($notice)) {
+            foreach ($notice as $n) {
+                $twitter_status = $this->twitter_status_array($n);
+                array_push($statuses, $twitter_status);
+            }
+        } else {
+            while ($notice->fetch()) {
+                $twitter_status = $this->twitter_status_array($notice);
+                array_push($statuses, $twitter_status);
+            }
+        }
+
+        $this->show_json_objects($statuses);
+
+        $this->end_document('json');
+    }
+
+    // Anyone know what date format this is?
+    // Twitter's dates look like this: "Mon Jul 14 23:52:38 +0000 2008" -- Zach
+    function date_twitter($dt) {
+        $t = strtotime($dt);
+        return date("D M d G:i:s O Y", $t);
+    }
+
+    function replier_by_reply($reply_id) {
+        $notice = Notice::staticGet($reply_id);
+        if ($notice) {
+            $profile = $notice->getProfile();
+            if ($profile) {
+                return intval($profile->id);
+            } else {
+                common_debug('Can\'t find a profile for notice: ' . $notice->id, __FILE__);
+            }
+        } else {
+            common_debug("Can't get notice: $reply_id", __FILE__);
+        }
+        return NULL;
+    }
+
+    // XXX: Candidate for a general utility method somewhere?
+    function count_subscriptions($profile) {
+
+        $count = 0;
+        $sub = new Subscription();
+        $sub->subscribed = $profile->id;
+
+        $count = $sub->find();
+
+        if ($count > 0) {
+            return $count - 1;
+        } else {
+            return 0;
+        }
+    }
+
+    function init_document($type='xml') {
+        switch ($type) {
+         case 'xml':
+            header('Content-Type: application/xml; charset=utf-8');
+            common_start_xml();
+            break;
+         case 'json':
+            header('Content-Type: application/json; charset=utf-8');
+
+            // Check for JSONP callback
+            $callback = $this->arg('callback');
+            if ($callback) {
+                print $callback . '(';
+            }
+            break;
+         case 'rss':
+            header("Content-Type: application/rss+xml; charset=utf-8");
+            $this->init_twitter_rss();
+            break;
+         case 'atom':
+            header('Content-Type: application/atom+xml; charset=utf-8');
+            $this->init_twitter_atom();
+            break;
+         default:
+            $this->client_error(_('Not a supported data format.'));
+            break;
+        }
+
+        return;
+    }
+
+    function end_document($type='xml') {
+        switch ($type) {
+         case 'xml':
+            common_end_xml();
+            break;
+         case 'json':
+
+            // Check for JSONP callback
+            $callback = $this->arg('callback');
+            if ($callback) {
+                print ')';
+            }
+            break;
+         case 'rss':
+            $this->end_twitter_rss();
+            break;
+         case 'atom':
+            $this->end_twitter_rss();
+            break;
+         default:
+            $this->client_error(_('Not a supported data format.'));
+            break;
+        }
+        return;
+    }
+
+    function client_error($msg, $code = 400, $content_type = 'json') {
+
+        static $status = array(400 => 'Bad Request',
+                               401 => 'Unauthorized',
+                               402 => 'Payment Required',
+                               403 => 'Forbidden',
+                               404 => 'Not Found',
+                               405 => 'Method Not Allowed',
+                               406 => 'Not Acceptable',
+                               407 => 'Proxy Authentication Required',
+                               408 => 'Request Timeout',
+                               409 => 'Conflict',
+                               410 => 'Gone',
+                               411 => 'Length Required',
+                               412 => 'Precondition Failed',
+                               413 => 'Request Entity Too Large',
+                               414 => 'Request-URI Too Long',
+                               415 => 'Unsupported Media Type',
+                               416 => 'Requested Range Not Satisfiable',
+                               417 => 'Expectation Failed');
+
+        $action = $this->trimmed('action');
+
+        common_debug("User error '$code' on '$action': $msg", __FILE__);
+
+        if (!array_key_exists($code, $status)) {
+            $code = 400;
+        }
+
+        $status_string = $status[$code];
+        header('HTTP/1.1 '.$code.' '.$status_string);
+
+        if ($content_type == 'xml') {
+            $this->init_document('xml');
+            common_element_start('hash');
+            common_element('error', NULL, $msg);
+            common_element('request', NULL, $_SERVER['REQUEST_URI']);
+            common_element_end('hash');
+            $this->end_document('xml');
+        } else {
+            $this->init_document('json');
+            $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']);
+            print(json_encode($error_array));
+            $this->end_document('json');
+        }
+
+    }
+
+    function init_twitter_rss() {
+        common_start_xml();
+        common_element_start('rss', array('version' => '2.0'));
+    }
+
+    function end_twitter_rss() {
+        common_element_end('rss');
+        common_end_xml();
+    }
+
+    function init_twitter_atom() {
+        common_start_xml();
+        common_element_start('feed', array('xmlns' => 'http://www.w3.org/2005/Atom', 'xml:lang' => 'en-US'));
+    }
+
+    function end_twitter_atom() {
+        common_end_xml();
+        common_element_end('feed');
+    }
+
+    function show_profile($profile, $content_type='xml', $notice=NULL) {
+        $profile_array = $this->twitter_user_array($profile, true);
+        switch ($content_type) {
+         case 'xml':
+            $this->show_twitter_xml_user($profile_array);
+            break;
+         case 'json':
+            $this->show_json_objects($profile_array);
+            break;
+         default:
+            $this->client_error(_('Not a supported data format.'));
+            return;
+        }
+        return;
+    }
+
+    function get_user($id, $apidata=NULL) {
+        if (!$id) {
+            return $apidata['user'];
+        } else if (is_numeric($id)) {
+            return User::staticGet($id);
+        } else {
+            $nickname = common_canonical_nickname($id);
+            return User::staticGet('nickname', $nickname);
+        }
+    }
+
+    function get_profile($id) {
+        if (is_numeric($id)) {
+            return Profile::staticGet($id);
+        } else {
+            $user = User::staticGet('nickname', $id);
+            if ($user) {
+                return $user->getProfile();
+            } else {
+                return NULL;
+            }
+        }
+    }
+
+    function source_link($source) {
+        $source_name = _($source);
+        switch ($source) {
+         case 'web':
+         case 'xmpp':
+         case 'mail':
+         case 'omb':
+         case 'api':
+            break;
+         default:
+            $ns = Notice_source::staticGet($source);
+            if ($ns) {
+                $source_name = '<a href="' . $ns->url . '">' . $ns->name . '</a>';
+            }
+            break;
+        }
+        return $source_name;
+    }
+
+    function show_extended_profile($user, $apidata) {
+
+        $this->auth_user = $apidata['user'];
+
+        $profile = $user->getProfile();
+
+        if (!$profile) {
+            common_server_error(_('User has no profile.'));
+            return;
+        }
+
+        $twitter_user = $this->twitter_user_array($profile, true);
+
+        // Add in extended user fields offered up by this method
+        $twitter_user['created_at'] = $this->date_twitter($profile->created);
+
+        $subbed = DB_DataObject::factory('subscription');
+        $subbed->subscriber = $profile->id;
+        $subbed_count = (int) $subbed->count() - 1;
+
+        $notices = DB_DataObject::factory('notice');
+        $notices->profile_id = $profile->id;
+        $notice_count = (int) $notices->count();
+
+        $twitter_user['friends_count'] = (is_int($subbed_count)) ? $subbed_count : 0;
+        $twitter_user['statuses_count'] = (is_int($notice_count)) ? $notice_count : 0;
+
+        // Other fields Twitter sends...
+        $twitter_user['profile_background_color'] = '';
+        $twitter_user['profile_text_color'] = '';
+        $twitter_user['profile_link_color'] = '';
+        $twitter_user['profile_sidebar_fill_color'] = '';
+
+        $faves = DB_DataObject::factory('fave');
+        $faves->user_id = $user->id;
+        $faves_count = (int) $faves->count();
+        $twitter_user['favourites_count'] = $faves_count;
+
+        $timezone = 'UTC';
+
+        if ($user->timezone) {
+            $timezone = $user->timezone;
+        }
+
+        $t = new DateTime;
+        $t->setTimezone(new DateTimeZone($timezone));
+        $twitter_user['utc_offset'] = $t->format('Z');
+        $twitter_user['time_zone'] = $timezone;
+
+        $following = 'false';
+
+        if (isset($this->auth_user)) {
+            if ($this->auth_user->isSubscribed($profile)) {
+                $following = 'true';
+            }
+
+            // Not implemented yet
+            $twitter_user['notifications'] = 'false';
+        }
+
+        $twitter_user['following'] = $following;
+
+        if ($apidata['content-type'] == 'xml') {
+            $this->init_document('xml');
+            $this->show_twitter_xml_user($twitter_user);
+            $this->end_document('xml');
+        } elseif ($apidata['content-type'] == 'json') {
+            $this->init_document('json');
+            $this->show_json_objects($twitter_user);
+            $this->end_document('json');
+        }
+
+    }
 
 }
\ No newline at end of file
index cfc9642e4c159a602a00dda22edfdaab2fa7befd..33b987291654ef063ba8d62dc76f62add2fa8a75 100644 (file)
@@ -29,63 +29,63 @@ require_once(INSTALLDIR.'/lib/queuehandler.php');
  */
 
 class XmppQueueHandler extends QueueHandler {
-       
-       function start() {
-               # Low priority; we don't want to receive messages
-               $this->log(LOG_INFO, "INITIALIZE");
-               $this->conn = jabber_connect($this->_id);
-               if ($this->conn) {
-                       $this->conn->addEventHandler('message', 'forward_message', $this);
-                       $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
-                       $this->conn->setReconnectTimeout(600);
-                       jabber_send_presence("Send me a message to post a notice", 'available', NULL, 'available', -1);
-               }
-               return !is_null($this->conn);
-       }
-       
-       function handle_reconnect(&$pl) {
-               $this->conn->processUntil('session_start');
-               $this->conn->presence(NULL, 'available', NULL, 'available', -1);
-       }
+    
+    function start() {
+        # Low priority; we don't want to receive messages
+        $this->log(LOG_INFO, "INITIALIZE");
+        $this->conn = jabber_connect($this->_id);
+        if ($this->conn) {
+            $this->conn->addEventHandler('message', 'forward_message', $this);
+            $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
+            $this->conn->setReconnectTimeout(600);
+            jabber_send_presence("Send me a message to post a notice", 'available', NULL, 'available', -1);
+        }
+        return !is_null($this->conn);
+    }
+    
+    function handle_reconnect(&$pl) {
+        $this->conn->processUntil('session_start');
+        $this->conn->presence(NULL, 'available', NULL, 'available', -1);
+    }
 
-       function idle($timeout=0) {
-               # Process the queue for as long as needed
-               try {
-                       if ($this->conn) {
-                               $this->conn->processTime($timeout);
-                       }
-               } catch (XMPPHP_Exception $e) {
-                       $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
-                       die($e->getMessage());
-               }
-       }
-       
-       function forward_message(&$pl) {
-               if ($pl['type'] != 'chat') {
-                   $this->log(LOG_DEBUG, 'Ignoring message of type ' . $pl['type'] . ' from ' . $pl['from']);
-                       return;
-               }
-               $listener = $this->listener();
-               if (strtolower($listener) == strtolower($pl['from'])) {
-                       $this->log(LOG_WARNING, 'Ignoring loop message.');
-                       return;
-               }
-               $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 idle($timeout=0) {
+        # Process the queue for as long as needed
+        try {
+            if ($this->conn) {
+                $this->conn->processTime($timeout);
+            }
+        } catch (XMPPHP_Exception $e) {
+            $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
+            die($e->getMessage());
+        }
+    }
+    
+    function forward_message(&$pl) {
+        if ($pl['type'] != 'chat') {
+            $this->log(LOG_DEBUG, 'Ignoring message of type ' . $pl['type'] . ' from ' . $pl['from']);
+            return;
+        }
+        $listener = $this->listener();
+        if (strtolower($listener) == strtolower($pl['from'])) {
+            $this->log(LOG_WARNING, 'Ignoring loop message.');
+            return;
+        }
+        $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 = "<addresses xmlns='http://jabber.org/protocol/address'>\n";
-               $address .= "<address type='ofrom' jid='$from' />\n";
-               $address .= "</addresses>\n";
-               return $address;
-       }
+    function ofrom($from) {
+        $address = "<addresses xmlns='http://jabber.org/protocol/address'>\n";
+        $address .= "<address type='ofrom' jid='$from' />\n";
+        $address .= "</addresses>\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';
-               }
-       }
+    function listener() {
+        if (common_config('xmpp', 'listener')) {
+            return common_config('xmpp', 'listener');
+        } else {
+            return jabber_daemon_address() . '/' . common_config('xmpp','resource') . '-listener';
+        }
+    }
 }
index 8538ae09a2c561aaac2cfb80751c96dc1b5521b7..cfb2537533b91cd98780f74ef102c98759b38f07 100755 (executable)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -34,20 +34,20 @@ require_once(INSTALLDIR . '/lib/queuehandler.php');
 set_error_handler('common_error_handler');
 
 class EnjitQueueHandler extends QueueHandler {
-       
-       function transport() {
-               return 'enjit';
-       }
+    
+    function transport() {
+        return 'enjit';
+    }
 
-       function start() {
+    function start() {
                 $this->log(LOG_INFO, "Starting EnjitQueueHandler");
                 $this->log(LOG_INFO, "Broadcasting to ".common_config('enjit', 'apiurl'));
-               return true;
-       }
+        return true;
+    }
 
-       function handle_notice($notice) {
+    function handle_notice($notice) {
 
-               $profile = Profile::staticGet($notice->profile_id);
+        $profile = Profile::staticGet($notice->profile_id);
 
                 $this->log(LOG_INFO, "Posting Notice ".$notice->id." from ".$profile->nickname);
 
@@ -60,25 +60,25 @@ class EnjitQueueHandler extends QueueHandler {
                 #
                 # Build an Atom message from the notice
                 #
-               $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
-               $msg = $profile->nickname . ': ' . $notice->content;
-
-               $atom  = "<entry xmlns='http://www.w3.org/2005/Atom'>\n";
-               $atom .= "<apisource>".common_config('enjit','source')."</apisource>\n";
-               $atom .= "<source>\n";
-               $atom .= "<title>" . $profile->nickname . " - " . common_config('site', 'name') . "</title>\n";
-               $atom .= "<link href='" . $profile->profileurl . "'/>\n";
-               $atom .= "<link rel='self' type='application/rss+xml' href='" . common_local_url('userrss', array('nickname' => $profile->nickname)) . "'/>\n";
-               $atom .= "<author><name>" . $profile->nickname . "</name></author>\n";
-               $atom .= "<icon>" . common_profile_avatar_url($profile, AVATAR_PROFILE_SIZE) . "</icon>\n";
-               $atom .= "</source>\n";
-               $atom .= "<title>" . htmlspecialchars($msg) . "</title>\n";
-               $atom .= "<summary>" . htmlspecialchars($msg) . "</summary>\n";
-               $atom .= "<link rel='alternate' href='" . $noticeurl . "' />\n";
-               $atom .= "<id>". $notice->uri . "</id>\n";
-               $atom .= "<published>".common_date_w3dtf($notice->created)."</published>\n";
-               $atom .= "<updated>".common_date_w3dtf($notice->modified)."</updated>\n";
-               $atom .= "</entry>\n";
+        $noticeurl = common_local_url('shownotice', array('notice' => $notice->id));
+        $msg = $profile->nickname . ': ' . $notice->content;
+
+        $atom  = "<entry xmlns='http://www.w3.org/2005/Atom'>\n";
+        $atom .= "<apisource>".common_config('enjit','source')."</apisource>\n";
+        $atom .= "<source>\n";
+        $atom .= "<title>" . $profile->nickname . " - " . common_config('site', 'name') . "</title>\n";
+        $atom .= "<link href='" . $profile->profileurl . "'/>\n";
+        $atom .= "<link rel='self' type='application/rss+xml' href='" . common_local_url('userrss', array('nickname' => $profile->nickname)) . "'/>\n";
+        $atom .= "<author><name>" . $profile->nickname . "</name></author>\n";
+        $atom .= "<icon>" . common_profile_avatar_url($profile, AVATAR_PROFILE_SIZE) . "</icon>\n";
+        $atom .= "</source>\n";
+        $atom .= "<title>" . htmlspecialchars($msg) . "</title>\n";
+        $atom .= "<summary>" . htmlspecialchars($msg) . "</summary>\n";
+        $atom .= "<link rel='alternate' href='" . $noticeurl . "' />\n";
+        $atom .= "<id>". $notice->uri . "</id>\n";
+        $atom .= "<published>".common_date_w3dtf($notice->created)."</published>\n";
+        $atom .= "<updated>".common_date_w3dtf($notice->modified)."</updated>\n";
+        $atom .= "</entry>\n";
 
                 $url  = common_config('enjit', 'apiurl') . "/submit/". common_config('enjit','apikey');
                 $data = "msg=$atom";
@@ -86,32 +86,32 @@ class EnjitQueueHandler extends QueueHandler {
                 #
                 # POST the message to $config['enjit']['apiurl']
                 #
-               $ch   = curl_init();
+        $ch   = curl_init();
 
-               curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_URL, $url);
  
                 curl_setopt($ch, CURLOPT_HEADER, 1); 
-               curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-               curl_setopt($ch, CURLOPT_POST, 1) ;
-               curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        curl_setopt($ch, CURLOPT_POST, 1) ;
+        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
 
                 # SSL and Debugging options
                 #
-               # curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
-               # curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
+        # curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
+        # curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                 # curl_setopt($ch, CURLOPT_VERBOSE, 1); 
 
-               $result = curl_exec($ch);
+        $result = curl_exec($ch);
 
-               $code = curl_getinfo($ch, CURLINFO_HTTP_CODE );
+        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE );
 
                 $this->log(LOG_INFO, "Response Code: $code");
 
-               curl_close($ch);
+        curl_close($ch);
 
                 return $code;
-       }
-       
+    }
+    
 
 }
 
@@ -122,7 +122,7 @@ $id = ($argc > 1) ? $argv[1] : NULL;
 $handler = new EnjitQueueHandler($id);
 
 if ($handler->start()) {
-       $handler->handle_queue();
+    $handler->handle_queue();
 }
 
 $handler->finish();
index 88f385798d0496c930e9f6e1a4346153ad532590..6f65c78a1fe8f8971c3ed5ad0d90b04cd5f2ed63 100755 (executable)
@@ -37,10 +37,10 @@ $cnt = $notice->find();
 while ($notice->fetch()) {
     common_log(LOG_INFO, 'Getting tags for notice #' . $notice->id);
     $notice->saveTags();
-       $original = clone($notice);
-       $notice->rendered = common_render_content($notice->content, $notice);
-       $result = $notice->update($original);
-       if (!$result) {
-               common_log_db_error($notice, 'UPDATE', __FILE__);
-       }
+    $original = clone($notice);
+    $notice->rendered = common_render_content($notice->content, $notice);
+    $result = $notice->update($original);
+    if (!$result) {
+        common_log_db_error($notice, 'UPDATE', __FILE__);
+    }
 }
index 1715b0bc1ba22d13b3461121672f385772b02684..e631a80ed8906423081665646d987f9e5265869d 100755 (executable)
@@ -41,7 +41,7 @@ common_log(LOG_INFO, 'Updating user inboxes.');
 $user = new User();
 
 if ($start_at) {
-       $user->whereAdd('id >= ' . $start_at);
+    $user->whereAdd('id >= ' . $start_at);
 }
 
 $cnt = $user->find();
@@ -49,32 +49,32 @@ $cache = common_memcache();
 
 while ($user->fetch()) {
     common_log(LOG_INFO, 'Updating inbox for user ' . $user->id);
-       $user->query('BEGIN');
-       $inbox = new Notice_inbox();
-       $result = $inbox->query('INSERT LOW_PRIORITY INTO notice_inbox (user_id, notice_id, created) ' .
-                                                       'SELECT ' . $user->id . ', notice.id, notice.created ' .
-                                                       'FROM subscription JOIN notice ON subscription.subscribed = notice.profile_id ' .
-                                                       'WHERE subscription.subscriber = ' . $user->id . ' ' .
-                                                       'AND notice.created >= subscription.created ' . 
-                                                       'AND NOT EXISTS (SELECT user_id, notice_id ' .
-                                                       'FROM notice_inbox ' .
-                                                       'WHERE user_id = ' . $user->id . ' ' . 
-                                                       'AND notice_id = notice.id)');
-       if (is_null($result) || $result === false) {
-               common_log_db_error($inbox, 'INSERT', __FILE__);
-               continue;
-       }
-       $orig = clone($user);
-       $user->inboxed = 1;
-       $result = $user->update($orig);
-       if (!$result) {
-               common_log_db_error($user, 'UPDATE', __FILE__);
-               continue;
-       }
-       $user->query('COMMIT');
-       $inbox->free();
-       unset($inbox);
-       if ($cache) {
-               $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
-       }
+    $user->query('BEGIN');
+    $inbox = new Notice_inbox();
+    $result = $inbox->query('INSERT LOW_PRIORITY INTO notice_inbox (user_id, notice_id, created) ' .
+                            'SELECT ' . $user->id . ', notice.id, notice.created ' .
+                            'FROM subscription JOIN notice ON subscription.subscribed = notice.profile_id ' .
+                            'WHERE subscription.subscriber = ' . $user->id . ' ' .
+                            'AND notice.created >= subscription.created ' . 
+                            'AND NOT EXISTS (SELECT user_id, notice_id ' .
+                            'FROM notice_inbox ' .
+                            'WHERE user_id = ' . $user->id . ' ' . 
+                            'AND notice_id = notice.id)');
+    if (is_null($result) || $result === false) {
+        common_log_db_error($inbox, 'INSERT', __FILE__);
+        continue;
+    }
+    $orig = clone($user);
+    $user->inboxed = 1;
+    $result = $user->update($orig);
+    if (!$result) {
+        common_log_db_error($user, 'UPDATE', __FILE__);
+        continue;
+    }
+    $user->query('COMMIT');
+    $inbox->free();
+    unset($inbox);
+    if ($cache) {
+        $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+    }
 }
index c6c925729eca884dc446a3450185561a73edd30d..1fa9f394e20b6aa248cdabd1e469071ce9c3e04c 100755 (executable)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -35,16 +35,16 @@ $start_at = ($argc > 1) ? $argv[1] : NULL;
 
 $notice = new Notice();
 if ($start_at) {
-       $notice->whereAdd('id >= ' . $start_at);
+    $notice->whereAdd('id >= ' . $start_at);
 }
 $cnt = $notice->find();
 
 while ($notice->fetch()) {
-       common_log(LOG_INFO, 'Pre-rendering notice #' . $notice->id);
-       $original = clone($notice);
-       $notice->rendered = common_render_content($notice->content, $notice);
-       $result = $notice->update($original);
-       if (!$result) {
-               common_log_db_error($notice, 'UPDATE', __FILE__);
-       }
+    common_log(LOG_INFO, 'Pre-rendering notice #' . $notice->id);
+    $original = clone($notice);
+    $notice->rendered = common_render_content($notice->content, $notice);
+    $result = $notice->update($original);
+    if (!$result) {
+        common_log_db_error($notice, 'UPDATE', __FILE__);
+    }
 }
index b4dda2254cef080d3bccf150d6e2c836ccaf23aa..4f5704249319b018beee7be4dcdc613fe0997621 100755 (executable)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
index 0543abb2a33bb46e045699ed78faa711192a2167..f907e158416099b87df2da8d0b66d9fcd26927ff 100755 (executable)
@@ -42,68 +42,68 @@ common_log(LOG_INFO, 'Updating user inboxes.');
 $ids = file($id_file);
 
 foreach ($ids as $id) {
-       
-       $user = User::staticGet('id', $id);
+    
+    $user = User::staticGet('id', $id);
 
-       if (!$user) {
-               common_log(LOG_WARNING, 'No such user: ' . $id);
-               continue;
-       }
-       
-       if ($user->inboxed) {
-               common_log(LOG_WARNING, 'Already inboxed: ' . $id);
-               continue;
-       }
-       
+    if (!$user) {
+        common_log(LOG_WARNING, 'No such user: ' . $id);
+        continue;
+    }
+    
+    if ($user->inboxed) {
+        common_log(LOG_WARNING, 'Already inboxed: ' . $id);
+        continue;
+    }
+    
     common_log(LOG_INFO, 'Updating inbox for user ' . $user->id);
-       
-       $user->query('BEGIN');
-       
-       $old_inbox = new Notice_inbox();
-       $old_inbox->user_id = $user->id;
-       
-       $result = $old_inbox->delete();
-       
-       if (is_null($result) || $result === false) {
-               common_log_db_error($old_inbox, 'DELETE', __FILE__);
-               continue;
-       }
+    
+    $user->query('BEGIN');
+    
+    $old_inbox = new Notice_inbox();
+    $old_inbox->user_id = $user->id;
+    
+    $result = $old_inbox->delete();
+    
+    if (is_null($result) || $result === false) {
+        common_log_db_error($old_inbox, 'DELETE', __FILE__);
+        continue;
+    }
 
-       $old_inbox->free();
-       
-       $inbox = new Notice_inbox();
-       
-       $result = $inbox->query('INSERT INTO notice_inbox (user_id, notice_id, created) ' .
-                                                       'SELECT ' . $user->id . ', notice.id, notice.created ' .
-                                                       'FROM subscription JOIN notice ON subscription.subscribed = notice.profile_id ' .
-                                                       'WHERE subscription.subscriber = ' . $user->id . ' ' .
-                                                       'AND notice.created >= subscription.created ' .
-                                                       'AND now() - notice.created < ' . (7 * 24 * 3600) . ' ' .
-                                                       'AND NOT EXISTS (SELECT user_id, notice_id ' .
-                                                       'FROM notice_inbox ' .
-                                                       'WHERE user_id = ' . $user->id . ' ' . 
-                                                       'AND notice_id = notice.id)');
-       
-       if (is_null($result) || $result === false) {
-               common_log_db_error($inbox, 'INSERT', __FILE__);
-               continue;
-       }
-       
-       $orig = clone($user);
-       $user->inboxed = 1;
-       $result = $user->update($orig);
-       
-       if (!$result) {
-               common_log_db_error($user, 'UPDATE', __FILE__);
-               continue;
-       }
-       
-       $user->query('COMMIT');
-       
-       $inbox->free();
-       unset($inbox);
-       
-       if ($cache) {
-               $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
-       }
+    $old_inbox->free();
+    
+    $inbox = new Notice_inbox();
+    
+    $result = $inbox->query('INSERT INTO notice_inbox (user_id, notice_id, created) ' .
+                            'SELECT ' . $user->id . ', notice.id, notice.created ' .
+                            'FROM subscription JOIN notice ON subscription.subscribed = notice.profile_id ' .
+                            'WHERE subscription.subscriber = ' . $user->id . ' ' .
+                            'AND notice.created >= subscription.created ' .
+                            'AND now() - notice.created < ' . (7 * 24 * 3600) . ' ' .
+                            'AND NOT EXISTS (SELECT user_id, notice_id ' .
+                            'FROM notice_inbox ' .
+                            'WHERE user_id = ' . $user->id . ' ' . 
+                            'AND notice_id = notice.id)');
+    
+    if (is_null($result) || $result === false) {
+        common_log_db_error($inbox, 'INSERT', __FILE__);
+        continue;
+    }
+    
+    $orig = clone($user);
+    $user->inboxed = 1;
+    $result = $user->update($orig);
+    
+    if (!$result) {
+        common_log_db_error($user, 'UPDATE', __FILE__);
+        continue;
+    }
+    
+    $user->query('COMMIT');
+    
+    $inbox->free();
+    unset($inbox);
+    
+    if ($cache) {
+        $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+    }
 }
index 59cdb94ad72e28dd0e0b6dd861f72ddf51fcbb01..8e33cfaf0d7529448570524eb7dd9bc9799cd1c4 100755 (executable)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -35,20 +35,20 @@ set_error_handler('common_error_handler');
 
 class JabberQueueHandler extends XmppQueueHandler {
 
-       var $conn = NULL;
+    var $conn = NULL;
 
-       function transport() {
-               return 'jabber';
-       }
+    function transport() {
+        return 'jabber';
+    }
 
-       function handle_notice($notice) {
-               try {
-                       return jabber_broadcast_notice($notice);
-               } catch (XMPPHP_Exception $e) {
-                       $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
-                       exit(1);
-               }
-       }
+    function handle_notice($notice) {
+        try {
+            return jabber_broadcast_notice($notice);
+        } catch (XMPPHP_Exception $e) {
+            $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
+            exit(1);
+        }
+    }
 }
 
 ini_set("max_execution_time", "0");
index 8b809f646eb88c97d2020857bf40e6988aa0e804..6d850751482d032845409c86fc9576b3a0b71afd 100755 (executable)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -36,179 +36,179 @@ require_once('Mail/mimeDecode.php');
 
 class MailerDaemon {
 
-       function __construct() {
-       }
-
-       function handle_message($fname='php://stdin') {
-               list($from, $to, $msg) = $this->parse_message($fname);
-               if (!$from || !$to || !$msg) {
-                       $this->error(NULL, _('Could not parse message.'));
-               }
-               common_log(LOG_INFO, "Mail from $from to $to: " .substr($msg, 0, 20));
-               $user = $this->user_from($from);
-               if (!$user) {
-                       $this->error($from, _('Not a registered user.'));
-                       return false;
-               }
-               if (!$this->user_match_to($user, $to)) {
-                       $this->error($from, _('Sorry, that is not your incoming email address.'));
-                       return false;
-               }
-               if (!$user->emailpost) {
-                       $this->error($from, _('Sorry, no incoming email allowed.'));
-                       return false;
-               }
-               $response = $this->handle_command($user, $from, $msg);
-               if ($response) {
-                       return true;
-               }
-               $msg = $this->cleanup_msg($msg);
-               $this->add_notice($user, $msg);
-       }
-
-       function error($from, $msg) {
-               file_put_contents("php://stderr", $msg . "\n");
-               exit(1);
-       }
-
-       function user_from($from_hdr) {
-               $froms = mailparse_rfc822_parse_addresses($from_hdr);
-               if (!$froms) {
-                       return NULL;
-               }
-               $from = $froms[0];
-               $addr = common_canonical_email($from['address']);
-               $user = User::staticGet('email', $addr);
-               if (!$user) {
-                       $user = User::staticGet('smsemail', $addr);
-               }
-               return $user;
-       }
-
-       function user_match_to($user, $to_hdr) {
-               $incoming = $user->incomingemail;
-               $tos = mailparse_rfc822_parse_addresses($to_hdr);
-               foreach ($tos as $to) {
-                       if (strcasecmp($incoming, $to['address']) == 0) {
-                               return true;
-                       }
-               }
-               return false;
-       }
-
-       function handle_command($user, $from, $msg) {
-               $inter = new CommandInterpreter();
-               $cmd = $inter->handle_command($user, $msg);
-               if ($cmd) {
-                       $cmd->execute(new MailChannel($from));
-                       return true;
-               }
-               return false;
-       }
-
-       function respond($from, $to, $response) {
-
-               $headers['From'] = $to;
-               $headers['To'] = $from;
-               $headers['Subject'] = "Command complete";
-
-               return mail_send(array($from), $headers, $response);
-       }
-
-       function log($level, $msg) {
-               common_log($level, 'MailDaemon: '.$msg);
-       }
-
-       function add_notice($user, $msg) {
+    function __construct() {
+    }
+
+    function handle_message($fname='php://stdin') {
+        list($from, $to, $msg) = $this->parse_message($fname);
+        if (!$from || !$to || !$msg) {
+            $this->error(NULL, _('Could not parse message.'));
+        }
+        common_log(LOG_INFO, "Mail from $from to $to: " .substr($msg, 0, 20));
+        $user = $this->user_from($from);
+        if (!$user) {
+            $this->error($from, _('Not a registered user.'));
+            return false;
+        }
+        if (!$this->user_match_to($user, $to)) {
+            $this->error($from, _('Sorry, that is not your incoming email address.'));
+            return false;
+        }
+        if (!$user->emailpost) {
+            $this->error($from, _('Sorry, no incoming email allowed.'));
+            return false;
+        }
+        $response = $this->handle_command($user, $from, $msg);
+        if ($response) {
+            return true;
+        }
+        $msg = $this->cleanup_msg($msg);
+        $this->add_notice($user, $msg);
+    }
+
+    function error($from, $msg) {
+        file_put_contents("php://stderr", $msg . "\n");
+        exit(1);
+    }
+
+    function user_from($from_hdr) {
+        $froms = mailparse_rfc822_parse_addresses($from_hdr);
+        if (!$froms) {
+            return NULL;
+        }
+        $from = $froms[0];
+        $addr = common_canonical_email($from['address']);
+        $user = User::staticGet('email', $addr);
+        if (!$user) {
+            $user = User::staticGet('smsemail', $addr);
+        }
+        return $user;
+    }
+
+    function user_match_to($user, $to_hdr) {
+        $incoming = $user->incomingemail;
+        $tos = mailparse_rfc822_parse_addresses($to_hdr);
+        foreach ($tos as $to) {
+            if (strcasecmp($incoming, $to['address']) == 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    function handle_command($user, $from, $msg) {
+        $inter = new CommandInterpreter();
+        $cmd = $inter->handle_command($user, $msg);
+        if ($cmd) {
+            $cmd->execute(new MailChannel($from));
+            return true;
+        }
+        return false;
+    }
+
+    function respond($from, $to, $response) {
+
+        $headers['From'] = $to;
+        $headers['To'] = $from;
+        $headers['Subject'] = "Command complete";
+
+        return mail_send(array($from), $headers, $response);
+    }
+
+    function log($level, $msg) {
+        common_log($level, 'MailDaemon: '.$msg);
+    }
+
+    function add_notice($user, $msg) {
         // should test
         // $msg_shortened = common_shorten_links($msg);
         // if (mb_strlen($msg_shortened) > 140) ERROR and STOP
-               $notice = Notice::saveNew($user->id, $msg, 'mail');
-               if (is_string($notice)) {
-                       $this->log(LOG_ERR, $notice);
-                       return;
-               }
-               common_broadcast_notice($notice);
-               $this->log(LOG_INFO,
-                                  'Added notice ' . $notice->id . ' from user ' . $user->nickname);
-       }
-
-       function parse_message($fname) {
-               $contents = file_get_contents($fname);
-               $parsed = Mail_mimeDecode::decode(array('input' => $contents,
-                                                                                               'include_bodies' => true,
-                                                                                               'decode_headers' => true,
-                                                                                               'decode_bodies' => true));
-               if (!$parsed) {
-                       return NULL;
-               }
-
-               $from = $parsed->headers['from'];
-
-               $to = $parsed->headers['to'];
-
-               $type = $parsed->ctype_primary . '/' . $parsed->ctype_secondary;
-
-               if ($parsed->ctype_primary == 'multipart') {
-                       foreach ($parsed->parts as $part) {
-                               if ($part->ctype_primary == 'text' &&
-                                       $part->ctype_secondary == 'plain') {
-                                       $msg = $part->body;
-                                       break;
-                               }
-                       }
-               } else if ($type == 'text/plain') {
-                       $msg = $parsed->body;
-               } else {
-                       $this->unsupported_type($type);
-               }
-
-               return array($from, $to, $msg);
-       }
-
-       function unsupported_type($type) {
-               $this->error(NULL, "Unsupported message type: " . $type);
-       }
-
-       function cleanup_msg($msg) {
-               $lines = explode("\n", $msg);
-
-               $output = '';
-
-               foreach ($lines as $line) {
-                       // skip quotes
-                       if (preg_match('/^\s*>.*$/', $line)) {
-                               continue;
-                       }
-                       // skip start of quote
-                       if (preg_match('/^\s*On.*wrote:\s*$/', $line)) {
-                               continue;
-                       }
-                       // probably interesting to someone, not us
-                       if (preg_match('/^\s*Sent via/', $line)) {
-                               continue;
-                       }
-                       // skip everything after a sig
-                       if (preg_match('/^\s*--+\s*$/', $line) ||
-                               preg_match('/^\s*__+\s*$/', $line))
-                       {
-                               break;
-                       }
-                       // skip everything after Outlook quote
-                       if (preg_match('/^\s*-+\s*Original Message\s*-+\s*$/', $line)) {
-                               break;
-                       }
-                       // skip everything after weird forward
-                       if (preg_match('/^\s*Begin\s+forward/', $line)) {
-                               break;
-                       }
-
-                       $output .= ' ' . $line;
-               }
-
-               preg_replace('/\s+/', ' ', $output);
-               return trim($output);
-       }
+        $notice = Notice::saveNew($user->id, $msg, 'mail');
+        if (is_string($notice)) {
+            $this->log(LOG_ERR, $notice);
+            return;
+        }
+        common_broadcast_notice($notice);
+        $this->log(LOG_INFO,
+                   'Added notice ' . $notice->id . ' from user ' . $user->nickname);
+    }
+
+    function parse_message($fname) {
+        $contents = file_get_contents($fname);
+        $parsed = Mail_mimeDecode::decode(array('input' => $contents,
+                                                'include_bodies' => true,
+                                                'decode_headers' => true,
+                                                'decode_bodies' => true));
+        if (!$parsed) {
+            return NULL;
+        }
+
+        $from = $parsed->headers['from'];
+
+        $to = $parsed->headers['to'];
+
+        $type = $parsed->ctype_primary . '/' . $parsed->ctype_secondary;
+
+        if ($parsed->ctype_primary == 'multipart') {
+            foreach ($parsed->parts as $part) {
+                if ($part->ctype_primary == 'text' &&
+                    $part->ctype_secondary == 'plain') {
+                    $msg = $part->body;
+                    break;
+                }
+            }
+        } else if ($type == 'text/plain') {
+            $msg = $parsed->body;
+        } else {
+            $this->unsupported_type($type);
+        }
+
+        return array($from, $to, $msg);
+    }
+
+    function unsupported_type($type) {
+        $this->error(NULL, "Unsupported message type: " . $type);
+    }
+
+    function cleanup_msg($msg) {
+        $lines = explode("\n", $msg);
+
+        $output = '';
+
+        foreach ($lines as $line) {
+            // skip quotes
+            if (preg_match('/^\s*>.*$/', $line)) {
+                continue;
+            }
+            // skip start of quote
+            if (preg_match('/^\s*On.*wrote:\s*$/', $line)) {
+                continue;
+            }
+            // probably interesting to someone, not us
+            if (preg_match('/^\s*Sent via/', $line)) {
+                continue;
+            }
+            // skip everything after a sig
+            if (preg_match('/^\s*--+\s*$/', $line) ||
+                preg_match('/^\s*__+\s*$/', $line))
+            {
+                break;
+            }
+            // skip everything after Outlook quote
+            if (preg_match('/^\s*-+\s*Original Message\s*-+\s*$/', $line)) {
+                break;
+            }
+            // skip everything after weird forward
+            if (preg_match('/^\s*Begin\s+forward/', $line)) {
+                break;
+            }
+
+            $output .= ' ' . $line;
+        }
+
+        preg_replace('/\s+/', ' ', $output);
+        return trim($output);
+    }
 }
 
 $md = new MailerDaemon();
index 1df816d1403e2b49566313a8b57a048623a9ce1f..31ae20f00caae405025ac1d69f67386899cd8760 100755 (executable)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -34,32 +34,32 @@ require_once(INSTALLDIR . '/lib/queuehandler.php');
 set_error_handler('common_error_handler');
 
 class OmbQueueHandler extends QueueHandler {
-       
-       function transport() {
-               return 'omb';
-       }
-       
-       function start() {
-               $this->log(LOG_INFO, "INITIALIZE");
-               return true;
-       }
+    
+    function transport() {
+        return 'omb';
+    }
+    
+    function start() {
+        $this->log(LOG_INFO, "INITIALIZE");
+        return true;
+    }
 
-       function handle_notice($notice) {
-               if ($this->is_remote($notice)) {
-                       $this->log(LOG_DEBUG, 'Ignoring remote notice ' . $notice->id);
-                       return true;
-               } else {
-                       return omb_broadcast_remote_subscribers($notice);
-               }
-       }
-       
-       function finish() {
-       }
+    function handle_notice($notice) {
+        if ($this->is_remote($notice)) {
+            $this->log(LOG_DEBUG, 'Ignoring remote notice ' . $notice->id);
+            return true;
+        } else {
+            return omb_broadcast_remote_subscribers($notice);
+        }
+    }
+    
+    function finish() {
+    }
 
-       function is_remote($notice) {
-               $user = User::staticGet($notice->profile_id);
-               return is_null($user);
-       }
+    function is_remote($notice) {
+        $user = User::staticGet($notice->profile_id);
+        return is_null($user);
+    }
 }
 
 ini_set("max_execution_time", "0");
index b1ae1d581dbcdda2ec57039183a264d4bbd3d5ac..2168aade29ba21523deaf9d9d0e2cdab5e8bd76d 100755 (executable)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -34,19 +34,19 @@ require_once(INSTALLDIR . '/lib/xmppqueuehandler.php');
 set_error_handler('common_error_handler');
 
 class PublicQueueHandler extends XmppQueueHandler {
-       
-       function transport() {
-               return 'public';
-       }
-       
-       function handle_notice($notice) {
-               try {
-                       return jabber_public_notice($notice);
-               } catch (XMPPHP_Exception $e) {
-                       $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
-                       die($e->getMessage());
-               }
-       }
+    
+    function transport() {
+        return 'public';
+    }
+    
+    function handle_notice($notice) {
+        try {
+            return jabber_public_notice($notice);
+        } catch (XMPPHP_Exception $e) {
+            $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
+            die($e->getMessage());
+        }
+    }
 }
 
 ini_set("max_execution_time", "0");
index 6b845beae1d50b91db49c06c42d1cd782bb0cc05..b49bfe2a5f60bfaa47d8b894bf707092520e1338 100644 (file)
@@ -19,188 +19,188 @@ index_map();
 
 # Generate index sitemap of all other sitemaps.
 function index_map() {
-       global $output_paths;
-       $output_dir = $output_paths['output_dir'];
-       $output_url = $output_paths['output_url'];
+    global $output_paths;
+    $output_dir = $output_paths['output_dir'];
+    $output_url = $output_paths['output_url'];
 
-       foreach (glob("$output_dir*.xml") as $file_name) {
+    foreach (glob("$output_dir*.xml") as $file_name) {
 
-               # Just the file name please.
-               $file_name = preg_replace("|$output_dir|", '', $file_name);
+        # Just the file name please.
+        $file_name = preg_replace("|$output_dir|", '', $file_name);
 
-               $index_urls .= sitemap(
-                                                  array(
-                                                                'url' => $output_url . $file_name,
-                                                                'changefreq' => 'daily'
-                                                                )
-                                                  );
-       }
+        $index_urls .= sitemap(
+                           array(
+                                 'url' => $output_url . $file_name,
+                                 'changefreq' => 'daily'
+                                 )
+                           );
+    }
 
-       write_file($output_paths['index_file'], sitemapindex($index_urls));
+    write_file($output_paths['index_file'], sitemapindex($index_urls));
 }
 
 # Generate sitemap of standard site elements.
 function standard_map() {
-       global $output_paths;
-
-       $standard_map_urls .= url(
-                                                         array(
-                                                                       'url' => common_local_url('public'),
-                                                                       'changefreq' => 'daily',
-                                                                       'priority' => '1',
-                                                                       )
-                                                         );
-
-       $standard_map_urls .= url(
-                                                         array(
-                                                                       'url' => common_local_url('publicrss'),
-                                                                       'changefreq' => 'daily',
-                                                                       'priority' => '0.3',
-                                                                       )
-                                                         );
-
-       $docs = array('about', 'faq', 'contact', 'im', 'openid', 'openmublog', 'privacy', 'source');
-
-       foreach($docs as $title) {
-               $standard_map_urls .= url(
-                                                                 array(
-                                                                               'url' => common_local_url('doc', array('title' => $title)),
-                                                                               'changefreq' => 'monthly',
-                                                                               'priority'   => '0.2',
-                                                                               )
-                                                                 );
-       }
-
-       $urlset_path = $output_paths['output_dir'] . 'standard.xml';
-
-       write_file($urlset_path, urlset($standard_map_urls));
+    global $output_paths;
+
+    $standard_map_urls .= url(
+                              array(
+                                    'url' => common_local_url('public'),
+                                    'changefreq' => 'daily',
+                                    'priority' => '1',
+                                    )
+                              );
+
+    $standard_map_urls .= url(
+                              array(
+                                    'url' => common_local_url('publicrss'),
+                                    'changefreq' => 'daily',
+                                    'priority' => '0.3',
+                                    )
+                              );
+
+    $docs = array('about', 'faq', 'contact', 'im', 'openid', 'openmublog', 'privacy', 'source');
+
+    foreach($docs as $title) {
+        $standard_map_urls .= url(
+                                  array(
+                                        'url' => common_local_url('doc', array('title' => $title)),
+                                        'changefreq' => 'monthly',
+                                        'priority'   => '0.2',
+                                        )
+                                  );
+    }
+
+    $urlset_path = $output_paths['output_dir'] . 'standard.xml';
+
+    write_file($urlset_path, urlset($standard_map_urls));
 }
 
 # Generate sitemaps of all notices.
 function notices_map() {
-       global $output_paths;
+    global $output_paths;
 
-       $notices = DB_DataObject::factory('notice');
+    $notices = DB_DataObject::factory('notice');
 
-       $notices->query('SELECT id, uri, url, modified FROM notice where is_local = 1');
+    $notices->query('SELECT id, uri, url, modified FROM notice where is_local = 1');
 
-       $notice_count = 0;
-       $map_count = 1;
+    $notice_count = 0;
+    $map_count = 1;
 
-       while ($notices->fetch()) {
+    while ($notices->fetch()) {
 
-               # Maximum 50,000 URLs per sitemap file.
-               if ($notice_count == 50000) {
-                       $notice_count = 0;
-                       $map_count++;
-               }
+        # Maximum 50,000 URLs per sitemap file.
+        if ($notice_count == 50000) {
+            $notice_count = 0;
+            $map_count++;
+        }
 
-               # remote notices have an URL
-               
-               if (!$notices->url && $notices->uri) {
-                       $notice = array(
-                                               'url'        => ($notices->uri) ? $notices->uri : common_local_url('shownotice', array('notice' => $notices->id)),
-                                               'lastmod'    => common_date_w3dtf($notices->modified),
-                                               'changefreq' => 'never',
-                                               'priority'   => '1',
-                                               );
+        # remote notices have an URL
+        
+        if (!$notices->url && $notices->uri) {
+            $notice = array(
+                        'url'        => ($notices->uri) ? $notices->uri : common_local_url('shownotice', array('notice' => $notices->id)),
+                        'lastmod'    => common_date_w3dtf($notices->modified),
+                        'changefreq' => 'never',
+                        'priority'   => '1',
+                        );
 
-                       $notice_list[$map_count] .= url($notice);
-                       $notice_count++;
-               }
-       }
+            $notice_list[$map_count] .= url($notice);
+            $notice_count++;
+        }
+    }
 
-       # Make full sitemaps from the lists and save them.
-       array_to_map($notice_list, 'notice');
+    # Make full sitemaps from the lists and save them.
+    array_to_map($notice_list, 'notice');
 }
 
 # Generate sitemaps of all users.
 function user_map() {
-       global $output_paths;
-
-       $users = DB_DataObject::factory('user');
-
-       $users->query('SELECT id, nickname FROM user');
-
-       $user_count = 0;
-       $map_count = 1;
-
-       while ($users->fetch()) {
-
-               # Maximum 50,000 URLs per sitemap file.
-               if ($user_count == 50000) {
-                       $user_count = 0;
-                       $map_count++;
-               }
-
-               $user_args = array('nickname' => $users->nickname);
-
-               # Define parameters for generating <url></url> elements.
-               $user = array(
-                                         'url'        => common_local_url('showstream', $user_args),
-                                         'changefreq' => 'daily',
-                                         'priority'   => '1',
-                                         );
-
-               $user_rss = array(
-                                                 'url'        => common_local_url('userrss', $user_args),
-                                                 'changefreq' => 'daily',
-                                                 'priority'   => '0.3',
-                                                 );
-
-               $all = array(
-                                        'url'        => common_local_url('all', $user_args),
-                                        'changefreq' => 'daily',
-                                        'priority'   => '1',
-                                        );
-
-               $all_rss = array(
-                                                'url'        => common_local_url('allrss', $user_args),
-                                                'changefreq' => 'daily',
-                                                'priority'   => '0.3',
-                                                );
-
-               $replies = array(
-                                                'url'        => common_local_url('replies', $user_args),
-                                                'changefreq' => 'daily',
-                                                'priority'   => '1',
-                                                );
-
-               $replies_rss = array(
-                                                        'url'        => common_local_url('repliesrss', $user_args),
-                                                        'changefreq' => 'daily',
-                                                        'priority'   => '0.3',
-                                                        );
-
-               $foaf = array(
-                                         'url'        => common_local_url('foaf', $user_args),
-                                         'changefreq' => 'weekly',
-                                         'priority'   => '0.5',
-                                         );
-
-               # Construct a <url></url> element for each user facet and add it
-               # to our existing list of those.
-               $user_list[$map_count]        .= url($user);
-               $user_rss_list[$map_count]    .= url($user_rss);
-               $all_list[$map_count]         .= url($all);
-               $all_rss_list[$map_count]     .= url($all_rss);
-               $replies_list[$map_count]     .= url($replies);
-               $replies_rss_list[$map_count] .= url($replies_rss);
-               $foaf_list[$map_count]        .= url($foaf);
-
-               $user_count++;
-       }
-
-       # Make full sitemaps from the lists and save them.
-       # Possible factoring: put all the lists into a master array, thus allowing
-       # calling with single argument (i.e., array_to_map('user')).
-       array_to_map($user_list, 'user');
-       array_to_map($user_rss_list, 'user_rss');
-       array_to_map($all_list, 'all');
-       array_to_map($all_rss_list, 'all_rss');
-       array_to_map($replies_list, 'replies');
-       array_to_map($replies_rss_list, 'replies_rss');
-       array_to_map($foaf_list, 'foaf');
+    global $output_paths;
+
+    $users = DB_DataObject::factory('user');
+
+    $users->query('SELECT id, nickname FROM user');
+
+    $user_count = 0;
+    $map_count = 1;
+
+    while ($users->fetch()) {
+
+        # Maximum 50,000 URLs per sitemap file.
+        if ($user_count == 50000) {
+            $user_count = 0;
+            $map_count++;
+        }
+
+        $user_args = array('nickname' => $users->nickname);
+
+        # Define parameters for generating <url></url> elements.
+        $user = array(
+                      'url'        => common_local_url('showstream', $user_args),
+                      'changefreq' => 'daily',
+                      'priority'   => '1',
+                      );
+
+        $user_rss = array(
+                          'url'        => common_local_url('userrss', $user_args),
+                          'changefreq' => 'daily',
+                          'priority'   => '0.3',
+                          );
+
+        $all = array(
+                     'url'        => common_local_url('all', $user_args),
+                     'changefreq' => 'daily',
+                     'priority'   => '1',
+                     );
+
+        $all_rss = array(
+                         'url'        => common_local_url('allrss', $user_args),
+                         'changefreq' => 'daily',
+                         'priority'   => '0.3',
+                         );
+
+        $replies = array(
+                         'url'        => common_local_url('replies', $user_args),
+                         'changefreq' => 'daily',
+                         'priority'   => '1',
+                         );
+
+        $replies_rss = array(
+                             'url'        => common_local_url('repliesrss', $user_args),
+                             'changefreq' => 'daily',
+                             'priority'   => '0.3',
+                             );
+
+        $foaf = array(
+                      'url'        => common_local_url('foaf', $user_args),
+                      'changefreq' => 'weekly',
+                      'priority'   => '0.5',
+                      );
+
+        # Construct a <url></url> element for each user facet and add it
+        # to our existing list of those.
+        $user_list[$map_count]        .= url($user);
+        $user_rss_list[$map_count]    .= url($user_rss);
+        $all_list[$map_count]         .= url($all);
+        $all_rss_list[$map_count]     .= url($all_rss);
+        $replies_list[$map_count]     .= url($replies);
+        $replies_rss_list[$map_count] .= url($replies_rss);
+        $foaf_list[$map_count]        .= url($foaf);
+
+        $user_count++;
+    }
+
+    # Make full sitemaps from the lists and save them.
+    # Possible factoring: put all the lists into a master array, thus allowing
+    # calling with single argument (i.e., array_to_map('user')).
+    array_to_map($user_list, 'user');
+    array_to_map($user_rss_list, 'user_rss');
+    array_to_map($all_list, 'all');
+    array_to_map($all_rss_list, 'all_rss');
+    array_to_map($replies_list, 'replies');
+    array_to_map($replies_rss_list, 'replies_rss');
+    array_to_map($foaf_list, 'foaf');
 }
 
 # ------------------------------------------------------------------------------
@@ -209,87 +209,87 @@ function user_map() {
 
 # Generate a <url></url> element.
 function url($url_args) {
-       $url        = preg_replace('/&/', '&amp;', $url_args['url']); # escape ampersands for XML
-       $lastmod    = $url_args['lastmod'];
-       $changefreq = $url_args['changefreq'];
-       $priority   = $url_args['priority'];
+    $url        = preg_replace('/&/', '&amp;', $url_args['url']); # escape ampersands for XML
+    $lastmod    = $url_args['lastmod'];
+    $changefreq = $url_args['changefreq'];
+    $priority   = $url_args['priority'];
 
-       if (is_null($url)) {
-               error("url() arguments require 'url' value.");
-       }
+    if (is_null($url)) {
+        error("url() arguments require 'url' value.");
+    }
 
-       $url_out = "\t<url>\n";
-       $url_out .= "\t\t<loc>$url</loc>\n";
+    $url_out = "\t<url>\n";
+    $url_out .= "\t\t<loc>$url</loc>\n";
 
-       if ($changefreq) {
-               $url_out .= "\t\t<changefreq>$changefreq</changefreq>\n";
-       }
+    if ($changefreq) {
+        $url_out .= "\t\t<changefreq>$changefreq</changefreq>\n";
+    }
 
-       if ($lastmod) {
-               $url_out .= "\t\t<lastmod>$lastmod</lastmod>\n";
-       }
+    if ($lastmod) {
+        $url_out .= "\t\t<lastmod>$lastmod</lastmod>\n";
+    }
 
-       if ($priority) {
-               $url_out .= "\t\t<priority>$priority</priority>\n";
-       }
+    if ($priority) {
+        $url_out .= "\t\t<priority>$priority</priority>\n";
+    }
 
-       $url_out .= "\t</url>\n";
+    $url_out .= "\t</url>\n";
 
-       return $url_out;
+    return $url_out;
 }
 
 function sitemap($sitemap_args) {
-       $url        = preg_replace('/&/', '&amp;', $sitemap_args['url']); # escape ampersands for XML
-       $lastmod    = $sitemap_args['lastmod'];
+    $url        = preg_replace('/&/', '&amp;', $sitemap_args['url']); # escape ampersands for XML
+    $lastmod    = $sitemap_args['lastmod'];
 
-       if (is_null($url)) {
-               error("url() arguments require 'url' value.");
-       }
+    if (is_null($url)) {
+        error("url() arguments require 'url' value.");
+    }
 
-       $sitemap_out = "\t<sitemap>\n";
-       $sitemap_out .= "\t\t<loc>$url</loc>\n";
+    $sitemap_out = "\t<sitemap>\n";
+    $sitemap_out .= "\t\t<loc>$url</loc>\n";
 
-       if ($lastmod) {
-               $sitemap_out .= "\t\t<lastmod>$lastmod</lastmod>\n";
-       }
+    if ($lastmod) {
+        $sitemap_out .= "\t\t<lastmod>$lastmod</lastmod>\n";
+    }
 
-       $sitemap_out .= "\t</sitemap>\n";
+    $sitemap_out .= "\t</sitemap>\n";
 
-       return $sitemap_out;
+    return $sitemap_out;
 }
 
 # Generate a <urlset></urlset> element.
 function urlset($urlset_text) {
-       $urlset = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
-         '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n" .
-         $urlset_text .
-         '</urlset>';
+    $urlset = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
+      '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n" .
+      $urlset_text .
+      '</urlset>';
 
-       return $urlset;
+    return $urlset;
 }
 
 # Generate a <urlset></urlset> element.
 function sitemapindex($sitemapindex_text) {
-       $sitemapindex = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
-         '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n" .
-         $sitemapindex_text .
-         '</sitemapindex>';
+    $sitemapindex = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
+      '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n" .
+      $sitemapindex_text .
+      '</sitemapindex>';
 
-       return $sitemapindex;
+    return $sitemapindex;
 }
 
 # Generate a sitemap from an array containing <url></url> elements and write it to a file.
 function array_to_map($url_list, $filename_prefix) {
-       global $output_paths;
-
-       if ($url_list) {
-               # $map_urls is a long string containing concatenated <url></url> elements.
-               while (list($map_idx, $map_urls) = each($url_list)) {
-                       $urlset_path = $output_paths['output_dir'] . "$filename_prefix-$map_idx.xml";
-                       
-                       write_file($urlset_path, urlset($map_urls));
-               }
-       }
+    global $output_paths;
+
+    if ($url_list) {
+        # $map_urls is a long string containing concatenated <url></url> elements.
+        while (list($map_idx, $map_urls) = each($url_list)) {
+            $urlset_path = $output_paths['output_dir'] . "$filename_prefix-$map_idx.xml";
+            
+            write_file($urlset_path, urlset($map_urls));
+        }
+    }
 }
 
 # ------------------------------------------------------------------------------
@@ -298,79 +298,79 @@ function array_to_map($url_list, $filename_prefix) {
 
 # Parse command line arguments.
 function parse_args() {
-       $args = getopt('f:d:u:');
-
-       if (is_null($args[f]) && is_null($args[d]) && is_null($args[u])) {
-               error('Mandatory arguments: -f <index file path> -d <output directory path> -u <URL of sitemaps directory>');
-       }
-
-       if (is_null($args[f])) {
-               error('You must specify an index file name with the -f option.');
-       }
-
-       if (is_null($args[d])) {
-               error('You must specify a directory for the output file with the -d option.');
-       }
-
-       if (is_null($args[u])) {
-               error('You must specify a URL for the directory where the sitemaps will be kept with the -u option.');
-       }
-
-       $index_file = $args[f];
-       $output_dir = $args[d];
-       $output_url = $args[u];
-
-       if (file_exists($output_dir)) {
-               if (is_writable($output_dir) === FALSE) {
-                       error("$output_dir is not writable.");
-               }
-       }        else {
-               error("output directory $output_dir does not exist.");
-       }
-
-       $paths = array(
-                                  'index_file' => $index_file,
-                                  'output_dir' => trailing_slash($output_dir),
-                                  'output_url' => trailing_slash($output_url),
-                                  );
-
-       return $paths;
+    $args = getopt('f:d:u:');
+
+    if (is_null($args[f]) && is_null($args[d]) && is_null($args[u])) {
+        error('Mandatory arguments: -f <index file path> -d <output directory path> -u <URL of sitemaps directory>');
+    }
+
+    if (is_null($args[f])) {
+        error('You must specify an index file name with the -f option.');
+    }
+
+    if (is_null($args[d])) {
+        error('You must specify a directory for the output file with the -d option.');
+    }
+
+    if (is_null($args[u])) {
+        error('You must specify a URL for the directory where the sitemaps will be kept with the -u option.');
+    }
+
+    $index_file = $args[f];
+    $output_dir = $args[d];
+    $output_url = $args[u];
+
+    if (file_exists($output_dir)) {
+        if (is_writable($output_dir) === FALSE) {
+            error("$output_dir is not writable.");
+        }
+    }     else {
+        error("output directory $output_dir does not exist.");
+    }
+
+    $paths = array(
+                   'index_file' => $index_file,
+                   'output_dir' => trailing_slash($output_dir),
+                   'output_url' => trailing_slash($output_url),
+                   );
+
+    return $paths;
 }
 
 # Ensure paths end with a "/".
 function trailing_slash($path) {
-       if (preg_match('/\/$/', $path) == 0) {
-               $path .= '/';
-       }
+    if (preg_match('/\/$/', $path) == 0) {
+        $path .= '/';
+    }
 
-       return $path;
+    return $path;
 }
 
 # Write data to disk.
 function write_file($path, $data) {
-       if (is_null($path)) {
-               error('No path specified for writing to.');
-       }        elseif (is_null($data)) {
-               error('No data specified for writing.');
-       }
-
-       if (($fh_out = fopen($path,'w')) === FALSE) {
-               error("couldn't open $path for writing.");
-       }
-
-       if (fwrite($fh_out, $data) === FALSE) {
-               error("couldn't write to $path.");
-       }
+    if (is_null($path)) {
+        error('No path specified for writing to.');
+    }     elseif (is_null($data)) {
+        error('No data specified for writing.');
+    }
+
+    if (($fh_out = fopen($path,'w')) === FALSE) {
+        error("couldn't open $path for writing.");
+    }
+
+    if (fwrite($fh_out, $data) === FALSE) {
+        error("couldn't write to $path.");
+    }
 }
 
 # Display an error message and exit.
 function error ($error_msg) {
-       if (is_null($error_msg)) {
-               $error_msg = 'error() was called without any explanation!';
-       }
+    if (is_null($error_msg)) {
+        $error_msg = 'error() was called without any explanation!';
+    }
 
-       echo "Error: $error_msg\n";
-       exit(1);
+    echo "Error: $error_msg\n";
+    exit(1);
 }
 
 ?>
\ No newline at end of file
index 8f0d02d9b67f76e35b17add1357de82e8e867f23..f17429d96318a093317b0cbc905da6835915b10b 100755 (executable)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -34,22 +34,22 @@ require_once(INSTALLDIR . '/lib/queuehandler.php');
 set_error_handler('common_error_handler');
 
 class SmsQueueHandler extends QueueHandler {
-       
-       function transport() {
-               return 'sms';
-       }
+    
+    function transport() {
+        return 'sms';
+    }
 
-       function start() {
-               $this->log(LOG_INFO, "INITIALIZE");
-               return true;
-       }
+    function start() {
+        $this->log(LOG_INFO, "INITIALIZE");
+        return true;
+    }
 
-       function handle_notice($notice) {
-               return mail_broadcast_notice_sms($notice);
-       }
-       
-       function finish() {
-       }
+    function handle_notice($notice) {
+        return mail_broadcast_notice_sms($notice);
+    }
+    
+    function finish() {
+    }
 }
 
 ini_set("max_execution_time", "0");
index 070eb9bbb2f6bcc22b4ed4e3257277d90f87e948..0ce34c2ae44f943303dcdcfbeaa76244fa1787e5 100755 (executable)
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
  * GNU Affero General Public License for more details.
  *
  * You should have received a copy of the GNU Affero General Public License
- * along with this program.     If not, see <http://www.gnu.org/licenses/>.
+ * along with this program.     If not, see <http://www.gnu.org/licenses/>.
  */
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -35,21 +35,21 @@ $flink->find();
 
 while ($flink->fetch()) {
 
-       if (($flink->friendsync & FOREIGN_FRIEND_RECV) == FOREIGN_FRIEND_RECV) {
+    if (($flink->friendsync & FOREIGN_FRIEND_RECV) == FOREIGN_FRIEND_RECV) {
 
-               $user = User::staticGet($flink->user_id);
+        $user = User::staticGet($flink->user_id);
 
-               print "Updating Twitter friends for user $user->nickname ($user->id)\n";
+        print "Updating Twitter friends for user $user->nickname ($user->id)\n";
 
-               $fuser = $flink->getForeignUser();
+        $fuser = $flink->getForeignUser();
 
-               $result = save_twitter_friends($user, $fuser->id, $fuser->nickname, $flink->credentials);
+        $result = save_twitter_friends($user, $fuser->id, $fuser->nickname, $flink->credentials);
 
-               if ($result == false) {
-                       print "Problems updating Twitter friends! Check the log.\n";
-                       exit(1);
-               }
-       }
+        if ($result == false) {
+            print "Problems updating Twitter friends! Check the log.\n";
+            exit(1);
+        }
+    }
 
 }
 
index 3eb7b34016ef7d5d6b5594e87e3082d47131f6a0..8ad07ccca9eb0a7b4f0c1da1bb0d646315e91a85 100644 (file)
@@ -5,62 +5,62 @@ chdir(dirname(__FILE__) . '/..');
 
 /* Languages to pull */
 $languages = array(
-       'da_DK' => 'http://laconi.ca/translate/download.php?file_id=23',
-       'nl_NL' => 'http://laconi.ca/translate/download.php?file_id=39',
-       'en_NZ' => 'http://laconi.ca/translate/download.php?file_id=15',
-       'eo'    => 'http://laconi.ca/translate/download.php?file_id=10',
-       'fr_FR' => 'http://laconi.ca/translate/download.php?file_id=19',
-       'de_DE' => 'http://laconi.ca/translate/download.php?file_id=18',
-       'it_IT' => 'http://laconi.ca/translate/download.php?file_id=21',
-       'ko'    => 'http://laconi.ca/translate/download.php?file_id=33',
-       'no_NB' => 'http://laconi.ca/translate/download.php?file_id=31',
-       'pt'    => 'http://laconi.ca/translate/download.php?file_id=8',
-       'pt_BR' => 'http://laconi.ca/translate/download.php?file_id=72',
-       'ru_RU' => 'http://laconi.ca/translate/download.php?file_id=26',
-       'es'    => 'http://laconi.ca/translate/download.php?file_id=9',
-       'tr_TR' => 'http://laconi.ca/translate/download.php?file_id=37',
-       'uk_UA' => 'http://laconi.ca/translate/download.php?file_id=44',
-       'he_IL' => 'http://laconi.ca/translate/download.php?file_id=71',
-       'mk_MK' => 'http://laconi.ca/translate/download.php?file_id=67',
-       'ja_JP' => 'http://laconi.ca/translate/download.php?file_id=43',
-       'cs_CZ' => 'http://laconi.ca/translate/download.php?file_id=63',
-       'ca_ES' => 'http://laconi.ca/translate/download.php?file_id=49',
-       'pl_PL' => 'http://laconi.ca/translate/download.php?file_id=51',
-       'sv_SE' => 'http://laconi.ca/translate/download.php?file_id=55'
+    'da_DK' => 'http://laconi.ca/translate/download.php?file_id=23',
+    'nl_NL' => 'http://laconi.ca/translate/download.php?file_id=39',
+    'en_NZ' => 'http://laconi.ca/translate/download.php?file_id=15',
+    'eo'    => 'http://laconi.ca/translate/download.php?file_id=10',
+    'fr_FR' => 'http://laconi.ca/translate/download.php?file_id=19',
+    'de_DE' => 'http://laconi.ca/translate/download.php?file_id=18',
+    'it_IT' => 'http://laconi.ca/translate/download.php?file_id=21',
+    'ko'    => 'http://laconi.ca/translate/download.php?file_id=33',
+    'no_NB' => 'http://laconi.ca/translate/download.php?file_id=31',
+    'pt'    => 'http://laconi.ca/translate/download.php?file_id=8',
+    'pt_BR' => 'http://laconi.ca/translate/download.php?file_id=72',
+    'ru_RU' => 'http://laconi.ca/translate/download.php?file_id=26',
+    'es'    => 'http://laconi.ca/translate/download.php?file_id=9',
+    'tr_TR' => 'http://laconi.ca/translate/download.php?file_id=37',
+    'uk_UA' => 'http://laconi.ca/translate/download.php?file_id=44',
+    'he_IL' => 'http://laconi.ca/translate/download.php?file_id=71',
+    'mk_MK' => 'http://laconi.ca/translate/download.php?file_id=67',
+    'ja_JP' => 'http://laconi.ca/translate/download.php?file_id=43',
+    'cs_CZ' => 'http://laconi.ca/translate/download.php?file_id=63',
+    'ca_ES' => 'http://laconi.ca/translate/download.php?file_id=49',
+    'pl_PL' => 'http://laconi.ca/translate/download.php?file_id=51',
+    'sv_SE' => 'http://laconi.ca/translate/download.php?file_id=55'
 );
 
 /* Update the languages */
 foreach ($languages as $code => $file) {
 
-       $lcdir='locale/'.$code;
-       $msgdir=$lcdir.'/LC_MESSAGES';
-       $pofile=$msgdir.'/laconica.po';
-       $mofile=$msgdir.'/laconica.mo';
+    $lcdir='locale/'.$code;
+    $msgdir=$lcdir.'/LC_MESSAGES';
+    $pofile=$msgdir.'/laconica.po';
+    $mofile=$msgdir.'/laconica.mo';
 
-       /* Check for an existing */
-       if (!is_dir($msgdir)) {
-               mkdir($lcdir);
-               mkdir($msgdir);
-               $existingSHA1 = '';
-       } else {
-               $existingSHA1 = file_exists($pofile) ? sha1_file($pofile) : '';
-       }
+    /* Check for an existing */
+    if (!is_dir($msgdir)) {
+        mkdir($lcdir);
+        mkdir($msgdir);
+        $existingSHA1 = '';
+    } else {
+        $existingSHA1 = file_exists($pofile) ? sha1_file($pofile) : '';
+    }
 
-       /* Get the remote one */
-       $newFile = file_get_contents($file);
+    /* Get the remote one */
+    $newFile = file_get_contents($file);
 
-       // Update if the local .po file is different to the one downloaded, or
-       // if the .mo file is not present.
-       if(sha1($newFile)!=$existingSHA1 || !file_exists($mofile)) {
-               echo "Updating ".$code."\n";
-               file_put_contents($pofile, $newFile);
-               $prevdir = getcwd();
-               chdir($msgdir);
-               system('msgmerge -U laconica.po ../../laconica.pot');
-               system('msgfmt -f -o laconica.mo laconica.po');
-               chdir($prevdir);
-       } else {
-               echo "Unchanged - ".$code."\n";
-       }
+    // Update if the local .po file is different to the one downloaded, or
+    // if the .mo file is not present.
+    if(sha1($newFile)!=$existingSHA1 || !file_exists($mofile)) {
+        echo "Updating ".$code."\n";
+        file_put_contents($pofile, $newFile);
+        $prevdir = getcwd();
+        chdir($msgdir);
+        system('msgmerge -U laconica.po ../../laconica.pot');
+        system('msgfmt -f -o laconica.mo laconica.po');
+        chdir($prevdir);
+    } else {
+        echo "Unchanged - ".$code."\n";
+    }
 }
 echo "Finished\n";
index 8961b0b6e38f6a54a62cdc3782b79ae9a93dadae..454616ca09bc42cec2ac862a49c43e8b77cdc371 100755 (executable)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -37,102 +37,102 @@ define('CLAIM_TIMEOUT', 1200);
 
 class XmppConfirmHandler extends XmppQueueHandler {
 
-       var $_id = 'confirm';
-       
-       function class_name() {
-               return 'XmppConfirmHandler';
-       }
-       
-       function run() {
-               if (!$this->start()) {
-                       return false;
-               }
-               $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,
-                                                                                                 $confirm->address);
-                               if (!$success) {
-                                       $this->log(LOG_ERR, '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; need a dupe so we don't have the WHERE clause
-                                       $dupe = Confirm_address::staticGet('code', $confirm->code);
-                                       if (!$dupe) {
-                                               common_log(LOG_WARNING, 'Could not refetch confirm', __FILE__);
-                                               continue;
-                                       }
-                                       $orig = clone($dupe);
-                                       $dupe->sent = $dupe->claimed;
-                                       $result = $dupe->update($orig);
-                                       if (!$result) {
-                                               common_log_db_error($dupe, 'UPDATE', __FILE__);
-                                               # Just let the claim age out; hopefully things work then
-                                               continue;
-                                       }
-                                       $dupe->free();
-                                       unset($dupe);
-                               }
-                               $user->free();
-                               unset($user);
-                               $confirm->free();
-                               unset($confirm);
-                               $this->idle(0);
-                       } else {
-#                              $this->clear_old_confirm_claims();
-                               $this->idle(10);
-                       }
-               } while (true);
-               if (!$this->finish()) {
-                       return false;
-               }
-               return true;
-       }
+    var $_id = 'confirm';
+    
+    function class_name() {
+        return 'XmppConfirmHandler';
+    }
+    
+    function run() {
+        if (!$this->start()) {
+            return false;
+        }
+        $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,
+                                                  $confirm->address);
+                if (!$success) {
+                    $this->log(LOG_ERR, '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; need a dupe so we don't have the WHERE clause
+                    $dupe = Confirm_address::staticGet('code', $confirm->code);
+                    if (!$dupe) {
+                        common_log(LOG_WARNING, 'Could not refetch confirm', __FILE__);
+                        continue;
+                    }
+                    $orig = clone($dupe);
+                    $dupe->sent = $dupe->claimed;
+                    $result = $dupe->update($orig);
+                    if (!$result) {
+                        common_log_db_error($dupe, 'UPDATE', __FILE__);
+                        # Just let the claim age out; hopefully things work then
+                        continue;
+                    }
+                    $dupe->free();
+                    unset($dupe);
+                }
+                $user->free();
+                unset($user);
+                $confirm->free();
+                unset($confirm);
+                $this->idle(0);
+            } else {
+#                $this->clear_old_confirm_claims();
+                $this->idle(10);
+            }
+        } while (true);
+        if (!$this->finish()) {
+            return false;
+        }
+        return true;
+    }
 
-       function next_confirm() {
-               $confirm = new Confirm_address();
-               $confirm->whereAdd('claimed IS NULL');
-               $confirm->whereAdd('sent IS NULL');
-               # XXX: eventually we could do other confirmations in the queue, too
-               $confirm->address_type = 'jabber';
-               $confirm->orderBy('modified DESC');
-               $confirm->limit(1);
-               if ($confirm->find(TRUE)) {
-                       $this->log(LOG_INFO, 'Claiming confirmation for ' . $confirm->address);
-                       # working around some weird DB_DataObject behaviour
-                       $confirm->whereAdd(''); # clears where stuff
-                       $original = clone($confirm);
-                       $confirm->claimed = common_sql_now();
-                       $result = $confirm->update($original);
-                       if ($result) {
-                               $this->log(LOG_INFO, 'Succeeded in claim! '. $result);
-                               return $confirm;
-                       } else {
-                               $this->log(LOG_INFO, 'Failed in claim!');
-                               return false;
-                       }
-               }
-               return NULL;
-       }
+    function next_confirm() {
+        $confirm = new Confirm_address();
+        $confirm->whereAdd('claimed IS NULL');
+        $confirm->whereAdd('sent IS NULL');
+        # XXX: eventually we could do other confirmations in the queue, too
+        $confirm->address_type = 'jabber';
+        $confirm->orderBy('modified DESC');
+        $confirm->limit(1);
+        if ($confirm->find(TRUE)) {
+            $this->log(LOG_INFO, 'Claiming confirmation for ' . $confirm->address);
+                # working around some weird DB_DataObject behaviour
+            $confirm->whereAdd(''); # clears where stuff
+            $original = clone($confirm);
+            $confirm->claimed = common_sql_now();
+            $result = $confirm->update($original);
+            if ($result) {
+                $this->log(LOG_INFO, 'Succeeded in claim! '. $result);
+                return $confirm;
+            } else {
+                $this->log(LOG_INFO, 'Failed in claim!');
+                return false;
+            }
+        }
+        return NULL;
+    }
 
-       function clear_old_confirm_claims() {
-               $confirm = new Confirm();
-               $confirm->claimed = NULL;
-               $confirm->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
-               $confirm->update(DB_DATAOBJECT_WHEREADD_ONLY);
-               $confirm->free();
-               unset($confirm);
-       }
+    function clear_old_confirm_claims() {
+        $confirm = new Confirm();
+        $confirm->claimed = NULL;
+        $confirm->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
+        $confirm->update(DB_DATAOBJECT_WHEREADD_ONLY);
+        $confirm->free();
+        unset($confirm);
+    }
 }
 
 ini_set("max_execution_time", "0");
index 9a60970a6e99414ec86b0f9cc594d2a67c35962a..cd27a2c1492b00782c85095cf02b13efbfbadba1 100755 (executable)
@@ -20,8 +20,8 @@
 
 # Abort if called from a web server
 if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
-       print "This script must be run from the command line\n";
-       exit();
+    print "This script must be run from the command line\n";
+    exit();
 }
 
 define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
@@ -39,203 +39,203 @@ set_error_handler('common_error_handler');
 
 class XMPPDaemon extends Daemon {
 
-       function XMPPDaemon($resource=NULL) {
-               static $attrs = array('server', 'port', 'user', 'password', 'host');
-
-               foreach ($attrs as $attr)
-               {
-                       $this->$attr = common_config('xmpp', $attr);
-               }
-
-               if ($resource) {
-                       $this->resource = $resource;
-               } else {
-                       $this->resource = common_config('xmpp', 'resource') . 'daemon';
-               }
-
-               $this->log(LOG_INFO, "INITIALIZE XMPPDaemon {$this->user}@{$this->server}/{$this->resource}");
-       }
-
-       function connect() {
-
-               $connect_to = ($this->host) ? $this->host : $this->server;
-
-               $this->log(LOG_INFO, "Connecting to $connect_to on port $this->port");
-
-               $this->conn = jabber_connect($this->resource);
-
-               if (!$this->conn) {
-                       return false;
-               }
-
-               $this->conn->setReconnectTimeout(600);
-
-               jabber_send_presence("Send me a message to post a notice", 'available',
-                                                        NULL, 'available', 100);
-               return !$this->conn->isDisconnected();
-       }
-
-       function name() {
-               return strtolower('xmppdaemon.'.$this->resource);
-       }
-
-       function run() {
-               if ($this->connect()) {
-
-                       $this->conn->addEventHandler('message', 'handle_message', $this);
-                       $this->conn->addEventHandler('presence', 'handle_presence', $this);
-                       $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
-
-                       $this->conn->process();
-               }
-       }
-
-       function handle_reconnect(&$pl) {
-               $this->conn->processUntil('session_start');
-               $this->conn->presence('Send me a message to post a notice', 'available', NULL, 'available', 100);
-       }
-
-       function get_user($from) {
-               $user = User::staticGet('jabber', jabber_normalize_jid($from));
-               return $user;
-       }
-
-       function handle_message(&$pl) {
-               if ($pl['type'] != 'chat') {
-                       return;
-               }
-               if (mb_strlen($pl['body']) == 0) {
-                       return;
-               }
-
-               $from = jabber_normalize_jid($pl['from']);
-
-               # Forwarded from another daemon (probably a broadcaster) for
-               # us to handle
-
-               if ($this->is_self($from)) {
-                       $from = $this->get_ofrom($pl);
-                       if (is_null($from) || $this->is_self($from)) {
-                               return;
-                       }
-               }
-
-               $user = $this->get_user($from);
-
-               if (!$user) {
-                       $this->from_site($from, 'Unknown user; go to ' .
-                                                        common_local_url('imsettings') .
-                                                        ' to add your address to your account');
-                       $this->log(LOG_WARNING, 'Message from unknown user ' . $from);
-                       return;
-               }
-               if ($this->handle_command($user, $pl['body'])) {
-                       return;
-               } else if ($this->is_autoreply($pl['body'])) {
-                       $this->log(LOG_INFO, 'Ignoring auto reply from ' . $from);
-                       return;
-               } else if ($this->is_otr($pl['body'])) {
-                       $this->log(LOG_INFO, 'Ignoring OTR from ' . $from);
-                       return;
-               } else if ($this->is_direct($pl['body'])) {
-                       preg_match_all('/d[\ ]*([a-z0-9]{1,64})/', $pl['body'], $to);
-
-                       $to = preg_replace('/^d([\ ])*/', '', $to[0][0]);
-                       $body = preg_replace('/d[\ ]*('. $to .')[\ ]*/', '', $pl['body']);
-                       $this->add_direct($user, $body, $to, $from);
-               } else {
-                       $len = mb_strlen($pl['body']);
-                       if($len > 140) {
-                               $this->from_site($from, 'Message too long - maximum is 140 characters, you sent ' . $len);
-                               return;
-                       }
-                       $this->add_notice($user, $pl);
-               }
-
-               $user->free();
-               unset($user);
-       }
-
-       function is_self($from) {
-               return preg_match('/^'.strtolower(jabber_daemon_address()).'/', strtolower($from));
-       }
-
-       function get_ofrom($pl) {
-               $xml = $pl['xml'];
-               $addresses = $xml->sub('addresses');
-               if (!$addresses) {
-                       $this->log(LOG_WARNING, 'Forwarded message without addresses');
-                       return NULL;
-               }
-               $address = $addresses->sub('address');
-               if (!$address) {
-                       $this->log(LOG_WARNING, 'Forwarded message without address');
-                       return NULL;
-               }
-               if (!array_key_exists('type', $address->attrs)) {
-                       $this->log(LOG_WARNING, 'No type for forwarded message');
-                       return NULL;
-               }
-               $type = $address->attrs['type'];
-               if ($type != 'ofrom') {
-                       $this->log(LOG_WARNING, 'Type of forwarded message is not ofrom');
-                       return NULL;
-               }
-               if (!array_key_exists('jid', $address->attrs)) {
-                       $this->log(LOG_WARNING, 'No jid for forwarded message');
-                       return NULL;
-               }
-               $jid = $address->attrs['jid'];
-               if (!$jid) {
-                       $this->log(LOG_WARNING, 'Could not get jid from address');
-                       return NULL;
-               }
-               $this->log(LOG_DEBUG, 'Got message forwarded from jid ' . $jid);
-               return $jid;
-       }
-
-       function is_autoreply($txt) {
-               if (preg_match('/[\[\(]?[Aa]uto[-\s]?[Rr]e(ply|sponse)[\]\)]/', $txt)) {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
-       function is_otr($txt) {
-               if (preg_match('/^\?OTR/', $txt)) {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
-       function is_direct($txt) {
-               if (strtolower(substr($txt, 0, 2))=='d ') {
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
-       function from_site($address, $msg) {
-               $text = '['.common_config('site', 'name') . '] ' . $msg;
-               jabber_send_message($address, $text);
-       }
-
-       function handle_command($user, $body) {
-               $inter = new CommandInterpreter();
-               $cmd = $inter->handle_command($user, $body);
-               if ($cmd) {
-                       $chan = new XMPPChannel($this->conn);
-                       $cmd->execute($chan);
-                       return true;
-               } else {
-                       return false;
-               }
-       }
-
-       function add_notice(&$user, &$pl) {
+    function XMPPDaemon($resource=NULL) {
+        static $attrs = array('server', 'port', 'user', 'password', 'host');
+
+        foreach ($attrs as $attr)
+        {
+            $this->$attr = common_config('xmpp', $attr);
+        }
+
+        if ($resource) {
+            $this->resource = $resource;
+        } else {
+            $this->resource = common_config('xmpp', 'resource') . 'daemon';
+        }
+
+        $this->log(LOG_INFO, "INITIALIZE XMPPDaemon {$this->user}@{$this->server}/{$this->resource}");
+    }
+
+    function connect() {
+
+        $connect_to = ($this->host) ? $this->host : $this->server;
+
+        $this->log(LOG_INFO, "Connecting to $connect_to on port $this->port");
+
+        $this->conn = jabber_connect($this->resource);
+
+        if (!$this->conn) {
+            return false;
+        }
+
+        $this->conn->setReconnectTimeout(600);
+
+        jabber_send_presence("Send me a message to post a notice", 'available',
+                             NULL, 'available', 100);
+        return !$this->conn->isDisconnected();
+    }
+
+    function name() {
+        return strtolower('xmppdaemon.'.$this->resource);
+    }
+
+    function run() {
+        if ($this->connect()) {
+
+            $this->conn->addEventHandler('message', 'handle_message', $this);
+            $this->conn->addEventHandler('presence', 'handle_presence', $this);
+            $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
+
+            $this->conn->process();
+        }
+    }
+
+    function handle_reconnect(&$pl) {
+        $this->conn->processUntil('session_start');
+        $this->conn->presence('Send me a message to post a notice', 'available', NULL, 'available', 100);
+    }
+
+    function get_user($from) {
+        $user = User::staticGet('jabber', jabber_normalize_jid($from));
+        return $user;
+    }
+
+    function handle_message(&$pl) {
+        if ($pl['type'] != 'chat') {
+            return;
+        }
+        if (mb_strlen($pl['body']) == 0) {
+            return;
+        }
+
+        $from = jabber_normalize_jid($pl['from']);
+
+        # Forwarded from another daemon (probably a broadcaster) for
+        # us to handle
+
+        if ($this->is_self($from)) {
+            $from = $this->get_ofrom($pl);
+            if (is_null($from) || $this->is_self($from)) {
+                return;
+            }
+        }
+
+        $user = $this->get_user($from);
+
+        if (!$user) {
+            $this->from_site($from, 'Unknown user; go to ' .
+                             common_local_url('imsettings') .
+                             ' to add your address to your account');
+            $this->log(LOG_WARNING, 'Message from unknown user ' . $from);
+            return;
+        }
+        if ($this->handle_command($user, $pl['body'])) {
+            return;
+        } else if ($this->is_autoreply($pl['body'])) {
+            $this->log(LOG_INFO, 'Ignoring auto reply from ' . $from);
+            return;
+        } else if ($this->is_otr($pl['body'])) {
+            $this->log(LOG_INFO, 'Ignoring OTR from ' . $from);
+            return;
+        } else if ($this->is_direct($pl['body'])) {
+            preg_match_all('/d[\ ]*([a-z0-9]{1,64})/', $pl['body'], $to);
+
+            $to = preg_replace('/^d([\ ])*/', '', $to[0][0]);
+            $body = preg_replace('/d[\ ]*('. $to .')[\ ]*/', '', $pl['body']);
+            $this->add_direct($user, $body, $to, $from);
+        } else {
+            $len = mb_strlen($pl['body']);
+            if($len > 140) {
+                $this->from_site($from, 'Message too long - maximum is 140 characters, you sent ' . $len);
+                return;
+            }
+            $this->add_notice($user, $pl);
+        }
+
+        $user->free();
+        unset($user);
+    }
+
+    function is_self($from) {
+        return preg_match('/^'.strtolower(jabber_daemon_address()).'/', strtolower($from));
+    }
+
+    function get_ofrom($pl) {
+        $xml = $pl['xml'];
+        $addresses = $xml->sub('addresses');
+        if (!$addresses) {
+            $this->log(LOG_WARNING, 'Forwarded message without addresses');
+            return NULL;
+        }
+        $address = $addresses->sub('address');
+        if (!$address) {
+            $this->log(LOG_WARNING, 'Forwarded message without address');
+            return NULL;
+        }
+        if (!array_key_exists('type', $address->attrs)) {
+            $this->log(LOG_WARNING, 'No type for forwarded message');
+            return NULL;
+        }
+        $type = $address->attrs['type'];
+        if ($type != 'ofrom') {
+            $this->log(LOG_WARNING, 'Type of forwarded message is not ofrom');
+            return NULL;
+        }
+        if (!array_key_exists('jid', $address->attrs)) {
+            $this->log(LOG_WARNING, 'No jid for forwarded message');
+            return NULL;
+        }
+        $jid = $address->attrs['jid'];
+        if (!$jid) {
+            $this->log(LOG_WARNING, 'Could not get jid from address');
+            return NULL;
+        }
+        $this->log(LOG_DEBUG, 'Got message forwarded from jid ' . $jid);
+        return $jid;
+    }
+
+    function is_autoreply($txt) {
+        if (preg_match('/[\[\(]?[Aa]uto[-\s]?[Rr]e(ply|sponse)[\]\)]/', $txt)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    function is_otr($txt) {
+        if (preg_match('/^\?OTR/', $txt)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    function is_direct($txt) {
+        if (strtolower(substr($txt, 0, 2))=='d ') {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    function from_site($address, $msg) {
+        $text = '['.common_config('site', 'name') . '] ' . $msg;
+        jabber_send_message($address, $text);
+    }
+
+    function handle_command($user, $body) {
+        $inter = new CommandInterpreter();
+        $cmd = $inter->handle_command($user, $body);
+        if ($cmd) {
+            $chan = new XMPPChannel($this->conn);
+            $cmd->execute($chan);
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    function add_notice(&$user, &$pl) {
         $body = trim($pl['body']);
         $content_shortened = common_shorten_link($body);
         if (mb_strlen($content_shortened) > 140) {
@@ -245,59 +245,59 @@ class XMPPDaemon extends Daemon {
         else {
             $content = $body;
         }
-               $notice = Notice::saveNew($user->id, $content, 'xmpp');
-               if (is_string($notice)) {
-                       $this->log(LOG_ERR, $notice);
-                       return;
-               }
-               common_broadcast_notice($notice);
-               $this->log(LOG_INFO,
-                                  'Added notice ' . $notice->id . ' from user ' . $user->nickname);
-               $notice->free();
-               unset($notice);
-       }
-
-       function handle_presence(&$pl) {
-               $from = jabber_normalize_jid($pl['from']);
-               switch ($pl['type']) {
-                case 'subscribe':
-                       # We let anyone subscribe
-                       $this->subscribed($from);
-                       $this->log(LOG_INFO,
-                                          'Accepted subscription from ' . $from);
-                       break;
-                case 'subscribed':
-                case 'unsubscribed':
-                case 'unsubscribe':
-                       $this->log(LOG_INFO,
-                                          'Ignoring  "' . $pl['type'] . '" from ' . $from);
-                       break;
-                default:
-                       if (!$pl['type']) {
-                               $user = User::staticGet('jabber', $from);
-                               if (!$user) {
-                                       $this->log(LOG_WARNING, 'Presence from unknown user ' . $from);
-                                       return;
-                               }
-                               if ($user->updatefrompresence) {
-                                       $this->log(LOG_INFO, 'Updating ' . $user->nickname .
-                                                          ' status from presence.');
-                                       $this->add_notice($user, $pl);
-                               }
-                               $user->free();
-                               unset($user);
-                       }
-                       break;
-               }
-       }
-
-       function log($level, $msg) {
-               common_log($level, 'XMPPDaemon('.$this->resource.'): '.$msg);
-       }
-
-       function subscribed($to) {
-               jabber_special_presence('subscribed', $to);
-       }
+        $notice = Notice::saveNew($user->id, $content, 'xmpp');
+        if (is_string($notice)) {
+            $this->log(LOG_ERR, $notice);
+            return;
+        }
+        common_broadcast_notice($notice);
+        $this->log(LOG_INFO,
+                   'Added notice ' . $notice->id . ' from user ' . $user->nickname);
+        $notice->free();
+        unset($notice);
+    }
+
+    function handle_presence(&$pl) {
+        $from = jabber_normalize_jid($pl['from']);
+        switch ($pl['type']) {
+         case 'subscribe':
+            # We let anyone subscribe
+            $this->subscribed($from);
+            $this->log(LOG_INFO,
+                       'Accepted subscription from ' . $from);
+            break;
+         case 'subscribed':
+         case 'unsubscribed':
+         case 'unsubscribe':
+            $this->log(LOG_INFO,
+                       'Ignoring  "' . $pl['type'] . '" from ' . $from);
+            break;
+         default:
+            if (!$pl['type']) {
+                $user = User::staticGet('jabber', $from);
+                if (!$user) {
+                    $this->log(LOG_WARNING, 'Presence from unknown user ' . $from);
+                    return;
+                }
+                if ($user->updatefrompresence) {
+                    $this->log(LOG_INFO, 'Updating ' . $user->nickname .
+                               ' status from presence.');
+                    $this->add_notice($user, $pl);
+                }
+                $user->free();
+                unset($user);
+            }
+            break;
+        }
+    }
+
+    function log($level, $msg) {
+        common_log($level, 'XMPPDaemon('.$this->resource.'): '.$msg);
+    }
+
+    function subscribed($to) {
+        jabber_special_presence('subscribed', $to);
+    }
 }
 
 ini_set("max_execution_time", "0");