diff options
273 files changed, 56264 insertions, 28200 deletions
diff --git a/_darcs/inventory b/_darcs/inventory index c66eff2b7..f49b758ab 100644 --- a/_darcs/inventory +++ b/_darcs/inventory @@ -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 Binary files differnew file mode 100644 index 000000000..0ce001299 --- /dev/null +++ b/_darcs/patches/20081223191907-84dde-21e8efe210e6d5d54e935a22d0cee5c7bbfc007d.gz diff --git a/_darcs/pristine/actions/accesstoken.php b/_darcs/pristine/actions/accesstoken.php index 4907749ce..a468c33a6 100644 --- a/_darcs/pristine/actions/accesstoken.php +++ b/_darcs/pristine/actions/accesstoken.php @@ -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()); + } + } } diff --git a/_darcs/pristine/actions/all.php b/_darcs/pristine/actions/all.php index 2a26e48d4..066ee77bf 100644 --- a/_darcs/pristine/actions/all.php +++ b/_darcs/pristine/actions/all.php @@ -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)); + } } diff --git a/_darcs/pristine/actions/allrss.php b/_darcs/pristine/actions/allrss.php index e49ac5540..d28fcea49 100644 --- a/_darcs/pristine/actions/allrss.php +++ b/_darcs/pristine/actions/allrss.php @@ -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 diff --git a/_darcs/pristine/actions/api.php b/_darcs/pristine/actions/api.php index 919a515ce..e03961e21 100644 --- a/_darcs/pristine/actions/api.php +++ b/_darcs/pristine/actions/api.php @@ -10,115 +10,115 @@ * * 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; + } } diff --git a/_darcs/pristine/actions/avatarbynickname.php b/_darcs/pristine/actions/avatarbynickname.php index b33cababf..2ca861a66 100644 --- a/_darcs/pristine/actions/avatarbynickname.php +++ b/_darcs/pristine/actions/avatarbynickname.php @@ -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); + } } diff --git a/_darcs/pristine/actions/block.php b/_darcs/pristine/actions/block.php index e6d2b7e49..20ba81edb 100644 --- a/_darcs/pristine/actions/block.php +++ b/_darcs/pristine/actions/block.php @@ -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? '. diff --git a/_darcs/pristine/actions/confirmaddress.php b/_darcs/pristine/actions/confirmaddress.php index 44280e08a..9d97c8205 100644 --- a/_darcs/pristine/actions/confirmaddress.php +++ b/_darcs/pristine/actions/confirmaddress.php @@ -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; } diff --git a/_darcs/pristine/actions/deletenotice.php b/_darcs/pristine/actions/deletenotice.php index 64746283a..ba348c5fa 100644 --- a/_darcs/pristine/actions/deletenotice.php +++ b/_darcs/pristine/actions/deletenotice.php @@ -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); + } } diff --git a/_darcs/pristine/actions/deleteprofile.php b/_darcs/pristine/actions/deleteprofile.php index 418ac998d..29797bc76 100644 --- a/_darcs/pristine/actions/deleteprofile.php +++ b/_darcs/pristine/actions/deleteprofile.php @@ -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], diff --git a/_darcs/pristine/actions/disfavor.php b/_darcs/pristine/actions/disfavor.php index be208f65a..e47e68a8c 100644 --- a/_darcs/pristine/actions/disfavor.php +++ b/_darcs/pristine/actions/disfavor.php @@ -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))); + } + } } diff --git a/_darcs/pristine/actions/doc.php b/_darcs/pristine/actions/doc.php index f3327048f..0cf665d68 100644 --- a/_darcs/pristine/actions/doc.php +++ b/_darcs/pristine/actions/doc.php @@ -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(); + } } diff --git a/_darcs/pristine/actions/emailsettings.php b/_darcs/pristine/actions/emailsettings.php index b35b4d28e..b77817c8e 100644 --- a/_darcs/pristine/actions/emailsettings.php +++ b/_darcs/pristine/actions/emailsettings.php @@ -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; + } + } } diff --git a/_darcs/pristine/actions/facebookhome.php b/_darcs/pristine/actions/facebookhome.php index 8ee2d4cd3..c964f451a 100644 --- a/_darcs/pristine/actions/facebookhome.php +++ b/_darcs/pristine/actions/facebookhome.php @@ -10,11 +10,11 @@ * * 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)); - } + } } diff --git a/_darcs/pristine/actions/facebookinvite.php b/_darcs/pristine/actions/facebookinvite.php index 68b351fb9..3a85a7c5c 100644 --- a/_darcs/pristine/actions/facebookinvite.php +++ b/_darcs/pristine/actions/facebookinvite.php @@ -10,11 +10,11 @@ * * 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(); - } + } } diff --git a/_darcs/pristine/actions/facebookremove.php b/_darcs/pristine/actions/facebookremove.php index 2a7bdd03e..1215f6622 100644 --- a/_darcs/pristine/actions/facebookremove.php +++ b/_darcs/pristine/actions/facebookremove.php @@ -10,11 +10,11 @@ * * 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!'); + } + } } diff --git a/_darcs/pristine/actions/facebooksettings.php b/_darcs/pristine/actions/facebooksettings.php index 4d7000d60..a5ad9d07a 100644 --- a/_darcs/pristine/actions/facebooksettings.php +++ b/_darcs/pristine/actions/facebooksettings.php @@ -10,11 +10,11 @@ * * 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(); - } + } } diff --git a/_darcs/pristine/actions/favor.php b/_darcs/pristine/actions/favor.php index aede32902..c0b0324b5 100644 --- a/_darcs/pristine/actions/favor.php +++ b/_darcs/pristine/actions/favor.php @@ -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 + } + } } diff --git a/_darcs/pristine/actions/favorited.php b/_darcs/pristine/actions/favorited.php index dc8070d06..6a465df96 100644 --- a/_darcs/pristine/actions/favorited.php +++ b/_darcs/pristine/actions/favorited.php @@ -10,11 +10,11 @@ * * 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'); + } } diff --git a/_darcs/pristine/actions/favoritesrss.php b/_darcs/pristine/actions/favoritesrss.php index 25dd3861f..642d4f880 100644 --- a/_darcs/pristine/actions/favoritesrss.php +++ b/_darcs/pristine/actions/favoritesrss.php @@ -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 diff --git a/_darcs/pristine/actions/featured.php b/_darcs/pristine/actions/featured.php index 96fbd89ab..2ff4f7745 100644 --- a/_darcs/pristine/actions/featured.php +++ b/_darcs/pristine/actions/featured.php @@ -10,11 +10,11 @@ * * 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 diff --git a/_darcs/pristine/actions/finishaddopenid.php b/_darcs/pristine/actions/finishaddopenid.php index 54d81b0b4..07024e091 100644 --- a/_darcs/pristine/actions/finishaddopenid.php +++ b/_darcs/pristine/actions/finishaddopenid.php @@ -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(); + } } diff --git a/_darcs/pristine/actions/finishimmediate.php b/_darcs/pristine/actions/finishimmediate.php index 6dbaa3d1c..ea711f5c5 100644 --- a/_darcs/pristine/actions/finishimmediate.php +++ b/_darcs/pristine/actions/finishimmediate.php @@ -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); + } } diff --git a/_darcs/pristine/actions/finishopenidlogin.php b/_darcs/pristine/actions/finishopenidlogin.php index 766a08b20..a2a778f31 100644 --- a/_darcs/pristine/actions/finishopenidlogin.php +++ b/_darcs/pristine/actions/finishopenidlogin.php @@ -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); + } } diff --git a/_darcs/pristine/actions/finishremotesubscribe.php b/_darcs/pristine/actions/finishremotesubscribe.php index 58040683f..c3387cf02 100644 --- a/_darcs/pristine/actions/finishremotesubscribe.php +++ b/_darcs/pristine/actions/finishremotesubscribe.php @@ -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']); + } } diff --git a/_darcs/pristine/actions/foaf.php b/_darcs/pristine/actions/foaf.php index 6811fc05a..310ba2c19 100644 --- a/_darcs/pristine/actions/foaf.php +++ b/_darcs/pristine/actions/foaf.php @@ -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'); + } } diff --git a/_darcs/pristine/actions/imsettings.php b/_darcs/pristine/actions/imsettings.php index 0aa7631dc..d0c47f7fd 100644 --- a/_darcs/pristine/actions/imsettings.php +++ b/_darcs/pristine/actions/imsettings.php @@ -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; + } + } } diff --git a/_darcs/pristine/actions/invite.php b/_darcs/pristine/actions/invite.php index c7d92085c..e5cc6ad01 100644 --- a/_darcs/pristine/actions/invite.php +++ b/_darcs/pristine/actions/invite.php @@ -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); + } } diff --git a/_darcs/pristine/actions/login.php b/_darcs/pristine/actions/login.php index ccec9cf8a..5e4d45149 100644 --- a/_darcs/pristine/actions/login.php +++ b/_darcs/pristine/actions/login.php @@ -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'); + } + } } diff --git a/_darcs/pristine/actions/logout.php b/_darcs/pristine/actions/logout.php index f00fa0ba7..5f7b9d502 100644 --- a/_darcs/pristine/actions/logout.php +++ b/_darcs/pristine/actions/logout.php @@ -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')); + } + } } diff --git a/_darcs/pristine/actions/microsummary.php b/_darcs/pristine/actions/microsummary.php index 104467d29..ced4b0d1e 100644 --- a/_darcs/pristine/actions/microsummary.php +++ b/_darcs/pristine/actions/microsummary.php @@ -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; + } } diff --git a/_darcs/pristine/actions/newmessage.php b/_darcs/pristine/actions/newmessage.php index da48fc7e7..121fc4246 100644 --- a/_darcs/pristine/actions/newmessage.php +++ b/_darcs/pristine/actions/newmessage.php @@ -20,116 +20,116 @@ 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 + } } diff --git a/_darcs/pristine/actions/newnotice.php b/_darcs/pristine/actions/newnotice.php index 42b48923f..7c3ad8815 100644 --- a/_darcs/pristine/actions/newnotice.php +++ b/_darcs/pristine/actions/newnotice.php @@ -10,11 +10,11 @@ * * 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(); - } + } } diff --git a/_darcs/pristine/actions/noticesearch.php b/_darcs/pristine/actions/noticesearch.php index 96e4d777f..53d78e199 100644 --- a/_darcs/pristine/actions/noticesearch.php +++ b/_darcs/pristine/actions/noticesearch.php @@ -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('→'); - 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('→'); + 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; + } } diff --git a/_darcs/pristine/actions/noticesearchrss.php b/_darcs/pristine/actions/noticesearchrss.php index 0f38515a0..a7df62ca0 100644 --- a/_darcs/pristine/actions/noticesearchrss.php +++ b/_darcs/pristine/actions/noticesearchrss.php @@ -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; + } } diff --git a/_darcs/pristine/actions/nudge.php b/_darcs/pristine/actions/nudge.php index 677f58800..6f3b4c95c 100644 --- a/_darcs/pristine/actions/nudge.php +++ b/_darcs/pristine/actions/nudge.php @@ -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 + } + } } diff --git a/_darcs/pristine/actions/openidlogin.php b/_darcs/pristine/actions/openidlogin.php index 1b289dbea..6192dfc34 100644 --- a/_darcs/pristine/actions/openidlogin.php +++ b/_darcs/pristine/actions/openidlogin.php @@ -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(); + } } diff --git a/_darcs/pristine/actions/openidsettings.php b/_darcs/pristine/actions/openidsettings.php index f539d111f..dd575bb73 100644 --- a/_darcs/pristine/actions/openidsettings.php +++ b/_darcs/pristine/actions/openidsettings.php @@ -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; + } } diff --git a/_darcs/pristine/actions/opensearch.php b/_darcs/pristine/actions/opensearch.php index 0f366be4c..707e929fb 100644 --- a/_darcs/pristine/actions/opensearch.php +++ b/_darcs/pristine/actions/opensearch.php @@ -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(); + } } diff --git a/_darcs/pristine/actions/othersettings.php b/_darcs/pristine/actions/othersettings.php index eccf90e91..9b824cea2 100644 --- a/_darcs/pristine/actions/othersettings.php +++ b/_darcs/pristine/actions/othersettings.php @@ -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); + } } diff --git a/_darcs/pristine/actions/peoplesearch.php b/_darcs/pristine/actions/peoplesearch.php index 2e54233ec..f89de53f7 100644 --- a/_darcs/pristine/actions/peoplesearch.php +++ b/_darcs/pristine/actions/peoplesearch.php @@ -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)); + } } diff --git a/_darcs/pristine/actions/peopletag.php b/_darcs/pristine/actions/peopletag.php index c508e0594..f03a3c8af 100644 --- a/_darcs/pristine/actions/peopletag.php +++ b/_darcs/pristine/actions/peopletag.php @@ -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; + } } diff --git a/_darcs/pristine/actions/postnotice.php b/_darcs/pristine/actions/postnotice.php index 243081f12..66e4dc806 100644 --- a/_darcs/pristine/actions/postnotice.php +++ b/_darcs/pristine/actions/postnotice.php @@ -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; + } } diff --git a/_darcs/pristine/actions/profilesettings.php b/_darcs/pristine/actions/profilesettings.php index ed2623c9b..3d92161ab 100644 --- a/_darcs/pristine/actions/profilesettings.php +++ b/_darcs/pristine/actions/profilesettings.php @@ -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); + } } diff --git a/_darcs/pristine/actions/public.php b/_darcs/pristine/actions/public.php index 218f80194..422e4bc98 100644 --- a/_darcs/pristine/actions/public.php +++ b/_darcs/pristine/actions/public.php @@ -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'); + } } diff --git a/_darcs/pristine/actions/publicrss.php b/_darcs/pristine/actions/publicrss.php index 1ab6a8be0..fa86de1d9 100644 --- a/_darcs/pristine/actions/publicrss.php +++ b/_darcs/pristine/actions/publicrss.php @@ -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 diff --git a/_darcs/pristine/actions/publicxrds.php b/_darcs/pristine/actions/publicxrds.php index 951434c87..ffd65c8c9 100644 --- a/_darcs/pristine/actions/publicxrds.php +++ b/_darcs/pristine/actions/publicxrds.php @@ -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 diff --git a/_darcs/pristine/actions/recoverpassword.php b/_darcs/pristine/actions/recoverpassword.php index 38c42f41d..1263fee9b 100644 --- a/_darcs/pristine/actions/recoverpassword.php +++ b/_darcs/pristine/actions/recoverpassword.php @@ -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(); + } } diff --git a/_darcs/pristine/actions/register.php b/_darcs/pristine/actions/register.php index a22ffca28..011aa3f09 100644 --- a/_darcs/pristine/actions/register.php +++ b/_darcs/pristine/actions/register.php @@ -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(); + } } diff --git a/_darcs/pristine/actions/remotesubscribe.php b/_darcs/pristine/actions/remotesubscribe.php index c3a09bcfc..14e8cb068 100644 --- a/_darcs/pristine/actions/remotesubscribe.php +++ b/_darcs/pristine/actions/remotesubscribe.php @@ -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); + } } diff --git a/_darcs/pristine/actions/replies.php b/_darcs/pristine/actions/replies.php index 835871ffc..be80fae79 100644 --- a/_darcs/pristine/actions/replies.php +++ b/_darcs/pristine/actions/replies.php @@ -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)); + } } diff --git a/_darcs/pristine/actions/repliesrss.php b/_darcs/pristine/actions/repliesrss.php index 7369db5e0..3689ea1f8 100644 --- a/_darcs/pristine/actions/repliesrss.php +++ b/_darcs/pristine/actions/repliesrss.php @@ -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 diff --git a/_darcs/pristine/actions/requesttoken.php b/_darcs/pristine/actions/requesttoken.php index 76019a929..4950d93c0 100644 --- a/_darcs/pristine/actions/requesttoken.php +++ b/_darcs/pristine/actions/requesttoken.php @@ -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()); + } + } } diff --git a/_darcs/pristine/actions/showfavorites.php b/_darcs/pristine/actions/showfavorites.php index 4de4b1271..2fd1e586d 100644 --- a/_darcs/pristine/actions/showfavorites.php +++ b/_darcs/pristine/actions/showfavorites.php @@ -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)); + } } diff --git a/_darcs/pristine/actions/showmessage.php b/_darcs/pristine/actions/showmessage.php index c171ffe0b..f35f3eede 100644 --- a/_darcs/pristine/actions/showmessage.php +++ b/_darcs/pristine/actions/showmessage.php @@ -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 diff --git a/_darcs/pristine/actions/shownotice.php b/_darcs/pristine/actions/shownotice.php index 6dea6d7bb..74d197ed1 100644 --- a/_darcs/pristine/actions/shownotice.php +++ b/_darcs/pristine/actions/shownotice.php @@ -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.')); + } } diff --git a/_darcs/pristine/actions/showstream.php b/_darcs/pristine/actions/showstream.php index 61fdec3fe..f8525348d 100644 --- a/_darcs/pristine/actions/showstream.php +++ b/_darcs/pristine/actions/showstream.php @@ -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! diff --git a/_darcs/pristine/actions/smssettings.php b/_darcs/pristine/actions/smssettings.php index 5db26730a..506801e97 100644 --- a/_darcs/pristine/actions/smssettings.php +++ b/_darcs/pristine/actions/smssettings.php @@ -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))); + } } diff --git a/_darcs/pristine/actions/subedit.php b/_darcs/pristine/actions/subedit.php index e7505e3fe..1d095ab9a 100644 --- a/_darcs/pristine/actions/subedit.php +++ b/_darcs/pristine/actions/subedit.php @@ -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'); diff --git a/_darcs/pristine/actions/subscribe.php b/_darcs/pristine/actions/subscribe.php index 64abda004..c94c4d7eb 100644 --- a/_darcs/pristine/actions/subscribe.php +++ b/_darcs/pristine/actions/subscribe.php @@ -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))); } - } + } } diff --git a/_darcs/pristine/actions/subscribers.php b/_darcs/pristine/actions/subscribers.php index ae52526e1..b9ca92af3 100644 --- a/_darcs/pristine/actions/subscribers.php +++ b/_darcs/pristine/actions/subscribers.php @@ -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'; diff --git a/_darcs/pristine/actions/subscriptions.php b/_darcs/pristine/actions/subscriptions.php index f518a1f92..c24f23a07 100644 --- a/_darcs/pristine/actions/subscriptions.php +++ b/_darcs/pristine/actions/subscriptions.php @@ -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; } diff --git a/_darcs/pristine/actions/sup.php b/_darcs/pristine/actions/sup.php index 887017b2a..3c9cbea2c 100644 --- a/_darcs/pristine/actions/sup.php +++ b/_darcs/pristine/actions/sup.php @@ -20,62 +20,62 @@ 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; + } } diff --git a/_darcs/pristine/actions/tag.php b/_darcs/pristine/actions/tag.php index 25cc853c4..1325b85a5 100644 --- a/_darcs/pristine/actions/tag.php +++ b/_darcs/pristine/actions/tag.php @@ -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)); + } } diff --git a/_darcs/pristine/actions/tagother.php b/_darcs/pristine/actions/tagother.php index a4449dd69..832671ae7 100644 --- a/_darcs/pristine/actions/tagother.php +++ b/_darcs/pristine/actions/tagother.php @@ -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'); - } - } + } } diff --git a/_darcs/pristine/actions/tagrss.php b/_darcs/pristine/actions/tagrss.php index 9187bdc87..45639fec4 100644 --- a/_darcs/pristine/actions/tagrss.php +++ b/_darcs/pristine/actions/tagrss.php @@ -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; + } } diff --git a/_darcs/pristine/actions/twitapiaccount.php b/_darcs/pristine/actions/twitapiaccount.php index f6e955828..b1caa3481 100644 --- a/_darcs/pristine/actions/twitapiaccount.php +++ b/_darcs/pristine/actions/twitapiaccount.php @@ -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 diff --git a/_darcs/pristine/actions/twitapiblocks.php b/_darcs/pristine/actions/twitapiblocks.php index 4852ff938..16b2e76bc 100644 --- a/_darcs/pristine/actions/twitapiblocks.php +++ b/_darcs/pristine/actions/twitapiblocks.php @@ -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 diff --git a/_darcs/pristine/actions/twitapidirect_messages.php b/_darcs/pristine/actions/twitapidirect_messages.php index 535795ca4..2e3b50173 100644 --- a/_darcs/pristine/actions/twitapidirect_messages.php +++ b/_darcs/pristine/actions/twitapidirect_messages.php @@ -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 + } } diff --git a/_darcs/pristine/actions/twitapifavorites.php b/_darcs/pristine/actions/twitapifavorites.php index 3eaff327a..ad8c5f18b 100644 --- a/_darcs/pristine/actions/twitapifavorites.php +++ b/_darcs/pristine/actions/twitapifavorites.php @@ -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 diff --git a/_darcs/pristine/actions/twitapifriendships.php b/_darcs/pristine/actions/twitapifriendships.php index e4b49cbe4..d352b933b 100644 --- a/_darcs/pristine/actions/twitapifriendships.php +++ b/_darcs/pristine/actions/twitapifriendships.php @@ -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 diff --git a/_darcs/pristine/actions/twitapihelp.php b/_darcs/pristine/actions/twitapihelp.php index c5d503e11..d268b7c82 100644 --- a/_darcs/pristine/actions/twitapihelp.php +++ b/_darcs/pristine/actions/twitapihelp.php @@ -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 diff --git a/_darcs/pristine/actions/twitapinotifications.php b/_darcs/pristine/actions/twitapinotifications.php index 8d93309a2..26f66d7e5 100644 --- a/_darcs/pristine/actions/twitapinotifications.php +++ b/_darcs/pristine/actions/twitapinotifications.php @@ -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 diff --git a/_darcs/pristine/actions/twitapistatuses.php b/_darcs/pristine/actions/twitapistatuses.php index 7b6598b10..c33643a3c 100644 --- a/_darcs/pristine/actions/twitapistatuses.php +++ b/_darcs/pristine/actions/twitapistatuses.php @@ -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; + } } diff --git a/_darcs/pristine/actions/twitapiusers.php b/_darcs/pristine/actions/twitapiusers.php index 9e06efa64..43f6969f4 100644 --- a/_darcs/pristine/actions/twitapiusers.php +++ b/_darcs/pristine/actions/twitapiusers.php @@ -10,11 +10,11 @@ * * 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); + } } diff --git a/_darcs/pristine/actions/twittersettings.php b/_darcs/pristine/actions/twittersettings.php index ae3aff877..e300e699a 100644 --- a/_darcs/pristine/actions/twittersettings.php +++ b/_darcs/pristine/actions/twittersettings.php @@ -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 diff --git a/_darcs/pristine/actions/unblock.php b/_darcs/pristine/actions/unblock.php index d60cc7088..6a86c2bf0 100644 --- a/_darcs/pristine/actions/unblock.php +++ b/_darcs/pristine/actions/unblock.php @@ -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'); diff --git a/_darcs/pristine/actions/unsubscribe.php b/_darcs/pristine/actions/unsubscribe.php index 98291e897..38fcc21de 100644 --- a/_darcs/pristine/actions/unsubscribe.php +++ b/_darcs/pristine/actions/unsubscribe.php @@ -19,30 +19,30 @@ 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))); } - } + } } diff --git a/_darcs/pristine/actions/updateprofile.php b/_darcs/pristine/actions/updateprofile.php index 921e88e63..4b4bb53a1 100644 --- a/_darcs/pristine/actions/updateprofile.php +++ b/_darcs/pristine/actions/updateprofile.php @@ -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; + } + } } diff --git a/_darcs/pristine/actions/userauthorization.php b/_darcs/pristine/actions/userauthorization.php index ac0a0728c..97809f197 100644 --- a/_darcs/pristine/actions/userauthorization.php +++ b/_darcs/pristine/actions/userauthorization.php @@ -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(); + } } diff --git a/_darcs/pristine/actions/userbyid.php b/_darcs/pristine/actions/userbyid.php index 38bff2ede..4eab8758c 100644 --- a/_darcs/pristine/actions/userbyid.php +++ b/_darcs/pristine/actions/userbyid.php @@ -20,30 +20,30 @@ 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); + } } diff --git a/_darcs/pristine/actions/userrss.php b/_darcs/pristine/actions/userrss.php index e57f86105..b5cb5a40a 100644 --- a/_darcs/pristine/actions/userrss.php +++ b/_darcs/pristine/actions/userrss.php @@ -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 diff --git a/_darcs/pristine/actions/xrds.php b/_darcs/pristine/actions/xrds.php index 1d516aab7..9788c87aa 100644 --- a/_darcs/pristine/actions/xrds.php +++ b/_darcs/pristine/actions/xrds.php @@ -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 diff --git a/_darcs/pristine/classes/Avatar.php b/_darcs/pristine/classes/Avatar.php index 901c47c51..e63668a33 100644 --- a/_darcs/pristine/classes/Avatar.php +++ b/_darcs/pristine/classes/Avatar.php @@ -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); + } } diff --git a/_darcs/pristine/classes/Channel.php b/_darcs/pristine/classes/Channel.php index bcc0c36b5..384fe8bb1 100644 --- a/_darcs/pristine/classes/Channel.php +++ b/_darcs/pristine/classes/Channel.php @@ -20,181 +20,181 @@ 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; + } } diff --git a/_darcs/pristine/classes/Command.php b/_darcs/pristine/classes/Command.php index c2409d140..ff44b9d1e 100644 --- a/_darcs/pristine/classes/Command.php +++ b/_darcs/pristine/classes/Command.php @@ -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")); + } } diff --git a/_darcs/pristine/classes/CommandInterpreter.php b/_darcs/pristine/classes/CommandInterpreter.php index 4e27f8f79..8192fb1a9 100644 --- a/_darcs/pristine/classes/CommandInterpreter.php +++ b/_darcs/pristine/classes/CommandInterpreter.php @@ -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; + } + } } diff --git a/_darcs/pristine/classes/Fave.php b/_darcs/pristine/classes/Fave.php index 7cc3f585e..b70a8a897 100644 --- a/_darcs/pristine/classes/Fave.php +++ b/_darcs/pristine/classes/Fave.php @@ -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); + } } diff --git a/_darcs/pristine/classes/Foreign_link.php b/_darcs/pristine/classes/Foreign_link.php index 7a625a209..7ce0df833 100644 --- a/_darcs/pristine/classes/Foreign_link.php +++ b/_darcs/pristine/classes/Foreign_link.php @@ -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); + } + } diff --git a/_darcs/pristine/classes/Foreign_user.php b/_darcs/pristine/classes/Foreign_user.php index 027fae69d..396680128 100644 --- a/_darcs/pristine/classes/Foreign_user.php +++ b/_darcs/pristine/classes/Foreign_user.php @@ -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; + } - + } diff --git a/_darcs/pristine/classes/Memcached_DataObject.php b/_darcs/pristine/classes/Memcached_DataObject.php index 7a33e158d..7699e1b38 100644 --- a/_darcs/pristine/classes/Memcached_DataObject.php +++ b/_darcs/pristine/classes/Memcached_DataObject.php @@ -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'; diff --git a/_darcs/pristine/classes/Message.php b/_darcs/pristine/classes/Message.php index ef4bd0316..dc527fcb1 100644 --- a/_darcs/pristine/classes/Message.php +++ b/_darcs/pristine/classes/Message.php @@ -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; + } } diff --git a/_darcs/pristine/classes/Notice.php b/_darcs/pristine/classes/Notice.php index ca8283bce..35e03e342 100644 --- a/_darcs/pristine/classes/Notice.php +++ b/_darcs/pristine/classes/Notice.php @@ -10,11 +10,11 @@ * * 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; + } } diff --git a/_darcs/pristine/classes/NoticeWrapper.php b/_darcs/pristine/classes/NoticeWrapper.php index f8c0aa381..edecb3092 100644 --- a/_darcs/pristine/classes/NoticeWrapper.php +++ b/_darcs/pristine/classes/NoticeWrapper.php @@ -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 diff --git a/_darcs/pristine/classes/Notice_tag.php b/_darcs/pristine/classes/Notice_tag.php index 5b75ff13f..84c4a1020 100644 --- a/_darcs/pristine/classes/Notice_tag.php +++ b/_darcs/pristine/classes/Notice_tag.php @@ -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)); + } + } } diff --git a/_darcs/pristine/classes/Profile.php b/_darcs/pristine/classes/Profile.php index b57d7e38d..1f4508bf1 100644 --- a/_darcs/pristine/classes/Profile.php +++ b/_darcs/pristine/classes/Profile.php @@ -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); + } } diff --git a/_darcs/pristine/classes/Profile_tag.php b/_darcs/pristine/classes/Profile_tag.php index dde19aea2..2daabf867 100644 --- a/_darcs/pristine/classes/Profile_tag.php +++ b/_darcs/pristine/classes/Profile_tag.php @@ -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; + } } diff --git a/_darcs/pristine/classes/Queue_item.php b/_darcs/pristine/classes/Queue_item.php index 8ba3281de..e54b4976b 100644 --- a/_darcs/pristine/classes/Queue_item.php +++ b/_darcs/pristine/classes/Queue_item.php @@ -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; + } } diff --git a/_darcs/pristine/classes/Sms_carrier.php b/_darcs/pristine/classes/Sms_carrier.php index 6ecb51346..f6e0791f9 100644 --- a/_darcs/pristine/classes/Sms_carrier.php +++ b/_darcs/pristine/classes/Sms_carrier.php @@ -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); + } } diff --git a/_darcs/pristine/classes/Subscription.php b/_darcs/pristine/classes/Subscription.php index cc174fcce..a3b5e4b90 100644 --- a/_darcs/pristine/classes/Subscription.php +++ b/_darcs/pristine/classes/Subscription.php @@ -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); + } } diff --git a/_darcs/pristine/classes/User.php b/_darcs/pristine/classes/User.php index 32d5bedde..c2c6ad57f 100644 --- a/_darcs/pristine/classes/User.php +++ b/_darcs/pristine/classes/User.php @@ -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(); diff --git a/_darcs/pristine/lib/common.php b/_darcs/pristine/lib/common.php index 5a28c3091..95ba64d0f 100644 --- a/_darcs/pristine/lib/common.php +++ b/_darcs/pristine/lib/common.php @@ -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'); } } diff --git a/_darcs/pristine/lib/deleteaction.php b/_darcs/pristine/lib/deleteaction.php index 5ba0e7e44..335070cc4 100644 --- a/_darcs/pristine/lib/deleteaction.php +++ b/_darcs/pristine/lib/deleteaction.php @@ -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; + } } diff --git a/_darcs/pristine/lib/facebookaction.php b/_darcs/pristine/lib/facebookaction.php index 87a82ba01..67595861f 100644 --- a/_darcs/pristine/lib/facebookaction.php +++ b/_darcs/pristine/lib/facebookaction.php @@ -10,11 +10,11 @@ * * 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}"; + } } diff --git a/_darcs/pristine/lib/oauthstore.php b/_darcs/pristine/lib/oauthstore.php index d7f9c9ff1..aa705be30 100644 --- a/_darcs/pristine/lib/oauthstore.php +++ b/_darcs/pristine/lib/oauthstore.php @@ -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); + } } diff --git a/_darcs/pristine/lib/omb.php b/_darcs/pristine/lib/omb.php index 96736b4d4..94ccc2ecd 100644 --- a/_darcs/pristine/lib/omb.php +++ b/_darcs/pristine/lib/omb.php @@ -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; + } + } } diff --git a/_darcs/pristine/lib/openid.php b/_darcs/pristine/lib/openid.php index 6e501c2b1..ebc5ed168 100644 --- a/_darcs/pristine/lib/openid.php +++ b/_darcs/pristine/lib/openid.php @@ -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('/&/', '&', $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('/&/', '&', $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; } diff --git a/_darcs/pristine/lib/personal.php b/_darcs/pristine/lib/personal.php index 86433b486..1928349a3 100644 --- a/_darcs/pristine/lib/personal.php +++ b/_darcs/pristine/lib/personal.php @@ -20,187 +20,187 @@ 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; + } } diff --git a/_darcs/pristine/lib/profilelist.php b/_darcs/pristine/lib/profilelist.php index 9079ea9d7..e32c5c254 100644 --- a/_darcs/pristine/lib/profilelist.php +++ b/_darcs/pristine/lib/profilelist.php @@ -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 diff --git a/_darcs/pristine/lib/queuehandler.php b/_darcs/pristine/lib/queuehandler.php index 23f295c45..5e3905f59 100644 --- a/_darcs/pristine/lib/queuehandler.php +++ b/_darcs/pristine/lib/queuehandler.php @@ -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 diff --git a/_darcs/pristine/lib/rssaction.php b/_darcs/pristine/lib/rssaction.php index 777511506..b64796888 100644 --- a/_darcs/pristine/lib/rssaction.php +++ b/_darcs/pristine/lib/rssaction.php @@ -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'); + } } diff --git a/_darcs/pristine/lib/search_engines.php b/_darcs/pristine/lib/search_engines.php index 7fcc1ffcb..d53d7d8d8 100644 --- a/_darcs/pristine/lib/search_engines.php +++ b/_darcs/pristine/lib/search_engines.php @@ -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).'\')'); } } diff --git a/_darcs/pristine/lib/searchaction.php b/_darcs/pristine/lib/searchaction.php index f99883b25..8634bd99c 100644 --- a/_darcs/pristine/lib/searchaction.php +++ b/_darcs/pristine/lib/searchaction.php @@ -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); + } } diff --git a/_darcs/pristine/lib/settingsaction.php b/_darcs/pristine/lib/settingsaction.php index 9e783431f..3021eb192 100644 --- a/_darcs/pristine/lib/settingsaction.php +++ b/_darcs/pristine/lib/settingsaction.php @@ -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], diff --git a/_darcs/pristine/lib/stream.php b/_darcs/pristine/lib/stream.php index 27ab78137..2d45df2d3 100644 --- a/_darcs/pristine/lib/stream.php +++ b/_darcs/pristine/lib/stream.php @@ -10,11 +10,11 @@ * * 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); diff --git a/_darcs/pristine/lib/subs.php b/_darcs/pristine/lib/subs.php index 91fc8445d..55e74e0b2 100644 --- a/_darcs/pristine/lib/subs.php +++ b/_darcs/pristine/lib/subs.php @@ -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; } diff --git a/_darcs/pristine/lib/theme.php b/_darcs/pristine/lib/theme.php index 80982aa82..346cff434 100644 --- a/_darcs/pristine/lib/theme.php +++ b/_darcs/pristine/lib/theme.php @@ -20,16 +20,16 @@ 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 diff --git a/_darcs/pristine/lib/twitter.php b/_darcs/pristine/lib/twitter.php index 5c9ef5d6f..c1d2de0ea 100644 --- a/_darcs/pristine/lib/twitter.php +++ b/_darcs/pristine/lib/twitter.php @@ -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; } diff --git a/_darcs/pristine/lib/twitterapi.php b/_darcs/pristine/lib/twitterapi.php index 2eb127525..3122caf12 100644 --- a/_darcs/pristine/lib/twitterapi.php +++ b/_darcs/pristine/lib/twitterapi.php @@ -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 diff --git a/_darcs/pristine/lib/xmppqueuehandler.php b/_darcs/pristine/lib/xmppqueuehandler.php index cfc9642e4..33b987291 100644 --- a/_darcs/pristine/lib/xmppqueuehandler.php +++ b/_darcs/pristine/lib/xmppqueuehandler.php @@ -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'; + } + } } diff --git a/_darcs/pristine/scripts/enjitqueuehandler.php b/_darcs/pristine/scripts/enjitqueuehandler.php index 8538ae09a..cfb253753 100644 --- a/_darcs/pristine/scripts/enjitqueuehandler.php +++ b/_darcs/pristine/scripts/enjitqueuehandler.php @@ -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(); diff --git a/_darcs/pristine/scripts/fixup_hashtags.php b/_darcs/pristine/scripts/fixup_hashtags.php index 88f385798..6f65c78a1 100644 --- a/_darcs/pristine/scripts/fixup_hashtags.php +++ b/_darcs/pristine/scripts/fixup_hashtags.php @@ -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__); + } } diff --git a/_darcs/pristine/scripts/fixup_inboxes.php b/_darcs/pristine/scripts/fixup_inboxes.php index 1715b0bc1..e631a80ed 100644 --- a/_darcs/pristine/scripts/fixup_inboxes.php +++ b/_darcs/pristine/scripts/fixup_inboxes.php @@ -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)); + } } diff --git a/_darcs/pristine/scripts/fixup_notices_rendered.php b/_darcs/pristine/scripts/fixup_notices_rendered.php index c6c925729..1fa9f394e 100644 --- a/_darcs/pristine/scripts/fixup_notices_rendered.php +++ b/_darcs/pristine/scripts/fixup_notices_rendered.php @@ -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__); + } } diff --git a/_darcs/pristine/scripts/getpiddir.php b/_darcs/pristine/scripts/getpiddir.php index b4dda2254..4f5704249 100644 --- a/_darcs/pristine/scripts/getpiddir.php +++ b/_darcs/pristine/scripts/getpiddir.php @@ -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__) . '/..')); diff --git a/_darcs/pristine/scripts/inbox_users.php b/_darcs/pristine/scripts/inbox_users.php index 0543abb2a..f907e1584 100644 --- a/_darcs/pristine/scripts/inbox_users.php +++ b/_darcs/pristine/scripts/inbox_users.php @@ -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)); + } } diff --git a/_darcs/pristine/scripts/jabberqueuehandler.php b/_darcs/pristine/scripts/jabberqueuehandler.php index 59cdb94ad..8e33cfaf0 100644 --- a/_darcs/pristine/scripts/jabberqueuehandler.php +++ b/_darcs/pristine/scripts/jabberqueuehandler.php @@ -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"); diff --git a/_darcs/pristine/scripts/maildaemon.php b/_darcs/pristine/scripts/maildaemon.php index 8b809f646..6d8507514 100644 --- a/_darcs/pristine/scripts/maildaemon.php +++ b/_darcs/pristine/scripts/maildaemon.php @@ -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(); diff --git a/_darcs/pristine/scripts/ombqueuehandler.php b/_darcs/pristine/scripts/ombqueuehandler.php index 1df816d14..31ae20f00 100644 --- a/_darcs/pristine/scripts/ombqueuehandler.php +++ b/_darcs/pristine/scripts/ombqueuehandler.php @@ -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"); diff --git a/_darcs/pristine/scripts/publicqueuehandler.php b/_darcs/pristine/scripts/publicqueuehandler.php index b1ae1d581..2168aade2 100644 --- a/_darcs/pristine/scripts/publicqueuehandler.php +++ b/_darcs/pristine/scripts/publicqueuehandler.php @@ -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"); diff --git a/_darcs/pristine/scripts/sitemap.php b/_darcs/pristine/scripts/sitemap.php index 6b845beae..b49bfe2a5 100644 --- a/_darcs/pristine/scripts/sitemap.php +++ b/_darcs/pristine/scripts/sitemap.php @@ -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('/&/', '&', $url_args['url']); # escape ampersands for XML - $lastmod = $url_args['lastmod']; - $changefreq = $url_args['changefreq']; - $priority = $url_args['priority']; + $url = preg_replace('/&/', '&', $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('/&/', '&', $sitemap_args['url']); # escape ampersands for XML - $lastmod = $sitemap_args['lastmod']; + $url = preg_replace('/&/', '&', $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 diff --git a/_darcs/pristine/scripts/smsqueuehandler.php b/_darcs/pristine/scripts/smsqueuehandler.php index 8f0d02d9b..f17429d96 100644 --- a/_darcs/pristine/scripts/smsqueuehandler.php +++ b/_darcs/pristine/scripts/smsqueuehandler.php @@ -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"); diff --git a/_darcs/pristine/scripts/synctwitterfriends.php b/_darcs/pristine/scripts/synctwitterfriends.php index 070eb9bbb..0ce34c2ae 100644 --- a/_darcs/pristine/scripts/synctwitterfriends.php +++ b/_darcs/pristine/scripts/synctwitterfriends.php @@ -11,17 +11,17 @@ * * 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); + } + } } diff --git a/_darcs/pristine/scripts/update_translations.php b/_darcs/pristine/scripts/update_translations.php index 3eb7b3401..8ad07ccca 100644 --- a/_darcs/pristine/scripts/update_translations.php +++ b/_darcs/pristine/scripts/update_translations.php @@ -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"; diff --git a/_darcs/pristine/scripts/xmppconfirmhandler.php b/_darcs/pristine/scripts/xmppconfirmhandler.php index 8961b0b6e..454616ca0 100644 --- a/_darcs/pristine/scripts/xmppconfirmhandler.php +++ b/_darcs/pristine/scripts/xmppconfirmhandler.php @@ -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"); diff --git a/_darcs/pristine/scripts/xmppdaemon.php b/_darcs/pristine/scripts/xmppdaemon.php index 9a60970a6..cd27a2c14 100644 --- a/_darcs/pristine/scripts/xmppdaemon.php +++ b/_darcs/pristine/scripts/xmppdaemon.php @@ -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"); diff --git a/_darcs/tentative_pristine b/_darcs/tentative_pristine index e09c8fa72..ffadf4b71 100644 --- a/_darcs/tentative_pristine +++ b/_darcs/tentative_pristine @@ -1,3 +1,28057 @@ -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('→'); +- 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('→'); ++ 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('/&/', '&', $form_html); ++ $form_html = preg_replace('/&/', '&', $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('/&/', '&', $url_args['url']); # escape ampersands for XML +- $lastmod = $url_args['lastmod']; +- $changefreq = $url_args['changefreq']; +- $priority = $url_args['priority']; ++ $url = preg_replace('/&/', '&', $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('/&/', '&', $sitemap_args['url']); # escape ampersands for XML +- $lastmod = $sitemap_args['lastmod']; ++ $url = preg_replace('/&/', '&', $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); ++ } diff --git a/actions/accesstoken.php b/actions/accesstoken.php index 4907749ce..a468c33a6 100644 --- a/actions/accesstoken.php +++ b/actions/accesstoken.php @@ -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()); + } + } } diff --git a/actions/all.php b/actions/all.php index 2a26e48d4..066ee77bf 100644 --- a/actions/all.php +++ b/actions/all.php @@ -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)); + } } diff --git a/actions/allrss.php b/actions/allrss.php index e49ac5540..d28fcea49 100644 --- a/actions/allrss.php +++ b/actions/allrss.php @@ -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 diff --git a/actions/api.php b/actions/api.php index 919a515ce..e03961e21 100644 --- a/actions/api.php +++ b/actions/api.php @@ -10,115 +10,115 @@ * * 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; + } } diff --git a/actions/avatarbynickname.php b/actions/avatarbynickname.php index b33cababf..2ca861a66 100644 --- a/actions/avatarbynickname.php +++ b/actions/avatarbynickname.php @@ -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); + } } diff --git a/actions/block.php b/actions/block.php index e6d2b7e49..20ba81edb 100644 --- a/actions/block.php +++ b/actions/block.php @@ -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? '. diff --git a/actions/confirmaddress.php b/actions/confirmaddress.php index 44280e08a..9d97c8205 100644 --- a/actions/confirmaddress.php +++ b/actions/confirmaddress.php @@ -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; } diff --git a/actions/deletenotice.php b/actions/deletenotice.php index 64746283a..ba348c5fa 100644 --- a/actions/deletenotice.php +++ b/actions/deletenotice.php @@ -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); + } } diff --git a/actions/deleteprofile.php b/actions/deleteprofile.php index 418ac998d..29797bc76 100644 --- a/actions/deleteprofile.php +++ b/actions/deleteprofile.php @@ -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], diff --git a/actions/disfavor.php b/actions/disfavor.php index be208f65a..e47e68a8c 100644 --- a/actions/disfavor.php +++ b/actions/disfavor.php @@ -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))); + } + } } diff --git a/actions/doc.php b/actions/doc.php index f3327048f..0cf665d68 100644 --- a/actions/doc.php +++ b/actions/doc.php @@ -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(); + } } diff --git a/actions/emailsettings.php b/actions/emailsettings.php index b35b4d28e..b77817c8e 100644 --- a/actions/emailsettings.php +++ b/actions/emailsettings.php @@ -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; + } + } } diff --git a/actions/facebookhome.php b/actions/facebookhome.php index 8ee2d4cd3..c964f451a 100644 --- a/actions/facebookhome.php +++ b/actions/facebookhome.php @@ -10,11 +10,11 @@ * * 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)); - } + } } diff --git a/actions/facebookinvite.php b/actions/facebookinvite.php index 68b351fb9..3a85a7c5c 100644 --- a/actions/facebookinvite.php +++ b/actions/facebookinvite.php @@ -10,11 +10,11 @@ * * 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(); - } + } } diff --git a/actions/facebookremove.php b/actions/facebookremove.php index 2a7bdd03e..1215f6622 100644 --- a/actions/facebookremove.php +++ b/actions/facebookremove.php @@ -10,11 +10,11 @@ * * 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!'); + } + } } diff --git a/actions/facebooksettings.php b/actions/facebooksettings.php index 4d7000d60..a5ad9d07a 100644 --- a/actions/facebooksettings.php +++ b/actions/facebooksettings.php @@ -10,11 +10,11 @@ * * 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(); - } + } } diff --git a/actions/favor.php b/actions/favor.php index aede32902..c0b0324b5 100644 --- a/actions/favor.php +++ b/actions/favor.php @@ -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 + } + } } diff --git a/actions/favorited.php b/actions/favorited.php index dc8070d06..6a465df96 100644 --- a/actions/favorited.php +++ b/actions/favorited.php @@ -10,11 +10,11 @@ * * 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'); + } } diff --git a/actions/favoritesrss.php b/actions/favoritesrss.php index 25dd3861f..642d4f880 100644 --- a/actions/favoritesrss.php +++ b/actions/favoritesrss.php @@ -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 diff --git a/actions/featured.php b/actions/featured.php index 96fbd89ab..2ff4f7745 100644 --- a/actions/featured.php +++ b/actions/featured.php @@ -10,11 +10,11 @@ * * 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 diff --git a/actions/finishaddopenid.php b/actions/finishaddopenid.php index 54d81b0b4..07024e091 100644 --- a/actions/finishaddopenid.php +++ b/actions/finishaddopenid.php @@ -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(); + } } diff --git a/actions/finishimmediate.php b/actions/finishimmediate.php index 6dbaa3d1c..ea711f5c5 100644 --- a/actions/finishimmediate.php +++ b/actions/finishimmediate.php @@ -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); + } } diff --git a/actions/finishopenidlogin.php b/actions/finishopenidlogin.php index 766a08b20..a2a778f31 100644 --- a/actions/finishopenidlogin.php +++ b/actions/finishopenidlogin.php @@ -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); + } } diff --git a/actions/finishremotesubscribe.php b/actions/finishremotesubscribe.php index 58040683f..c3387cf02 100644 --- a/actions/finishremotesubscribe.php +++ b/actions/finishremotesubscribe.php @@ -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']); + } } diff --git a/actions/foaf.php b/actions/foaf.php index 6811fc05a..310ba2c19 100644 --- a/actions/foaf.php +++ b/actions/foaf.php @@ -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'); + } } diff --git a/actions/imsettings.php b/actions/imsettings.php index 0aa7631dc..d0c47f7fd 100644 --- a/actions/imsettings.php +++ b/actions/imsettings.php @@ -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; + } + } } diff --git a/actions/invite.php b/actions/invite.php index c7d92085c..e5cc6ad01 100644 --- a/actions/invite.php +++ b/actions/invite.php @@ -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); + } } diff --git a/actions/login.php b/actions/login.php index ccec9cf8a..5e4d45149 100644 --- a/actions/login.php +++ b/actions/login.php @@ -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'); + } + } } diff --git a/actions/logout.php b/actions/logout.php index f00fa0ba7..5f7b9d502 100644 --- a/actions/logout.php +++ b/actions/logout.php @@ -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')); + } + } } diff --git a/actions/microsummary.php b/actions/microsummary.php index 104467d29..ced4b0d1e 100644 --- a/actions/microsummary.php +++ b/actions/microsummary.php @@ -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; + } } diff --git a/actions/newmessage.php b/actions/newmessage.php index da48fc7e7..121fc4246 100644 --- a/actions/newmessage.php +++ b/actions/newmessage.php @@ -20,116 +20,116 @@ 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 + } } diff --git a/actions/newnotice.php b/actions/newnotice.php index 42b48923f..7c3ad8815 100644 --- a/actions/newnotice.php +++ b/actions/newnotice.php @@ -10,11 +10,11 @@ * * 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(); - } + } } diff --git a/actions/noticesearch.php b/actions/noticesearch.php index 96e4d777f..53d78e199 100644 --- a/actions/noticesearch.php +++ b/actions/noticesearch.php @@ -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('→'); - 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('→'); + 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; + } } diff --git a/actions/noticesearchrss.php b/actions/noticesearchrss.php index 0f38515a0..a7df62ca0 100644 --- a/actions/noticesearchrss.php +++ b/actions/noticesearchrss.php @@ -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; + } } diff --git a/actions/nudge.php b/actions/nudge.php index 677f58800..6f3b4c95c 100644 --- a/actions/nudge.php +++ b/actions/nudge.php @@ -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 + } + } } diff --git a/actions/openidlogin.php b/actions/openidlogin.php index 1b289dbea..6192dfc34 100644 --- a/actions/openidlogin.php +++ b/actions/openidlogin.php @@ -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(); + } } diff --git a/actions/openidsettings.php b/actions/openidsettings.php index f539d111f..dd575bb73 100644 --- a/actions/openidsettings.php +++ b/actions/openidsettings.php @@ -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; + } } diff --git a/actions/opensearch.php b/actions/opensearch.php index 0f366be4c..707e929fb 100644 --- a/actions/opensearch.php +++ b/actions/opensearch.php @@ -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(); + } } diff --git a/actions/othersettings.php b/actions/othersettings.php index eccf90e91..9b824cea2 100644 --- a/actions/othersettings.php +++ b/actions/othersettings.php @@ -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); + } } diff --git a/actions/peoplesearch.php b/actions/peoplesearch.php index 2e54233ec..f89de53f7 100644 --- a/actions/peoplesearch.php +++ b/actions/peoplesearch.php @@ -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)); + } } diff --git a/actions/peopletag.php b/actions/peopletag.php index c508e0594..f03a3c8af 100644 --- a/actions/peopletag.php +++ b/actions/peopletag.php @@ -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; + } } diff --git a/actions/postnotice.php b/actions/postnotice.php index 243081f12..66e4dc806 100644 --- a/actions/postnotice.php +++ b/actions/postnotice.php @@ -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; + } } diff --git a/actions/profilesettings.php b/actions/profilesettings.php index ed2623c9b..3d92161ab 100644 --- a/actions/profilesettings.php +++ b/actions/profilesettings.php @@ -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); + } } diff --git a/actions/public.php b/actions/public.php index 218f80194..422e4bc98 100644 --- a/actions/public.php +++ b/actions/public.php @@ -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'); + } } diff --git a/actions/publicrss.php b/actions/publicrss.php index 1ab6a8be0..fa86de1d9 100644 --- a/actions/publicrss.php +++ b/actions/publicrss.php @@ -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 diff --git a/actions/publicxrds.php b/actions/publicxrds.php index 951434c87..ffd65c8c9 100644 --- a/actions/publicxrds.php +++ b/actions/publicxrds.php @@ -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 diff --git a/actions/recoverpassword.php b/actions/recoverpassword.php index 38c42f41d..1263fee9b 100644 --- a/actions/recoverpassword.php +++ b/actions/recoverpassword.php @@ -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(); + } } diff --git a/actions/register.php b/actions/register.php index a22ffca28..011aa3f09 100644 --- a/actions/register.php +++ b/actions/register.php @@ -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(); + } } diff --git a/actions/remotesubscribe.php b/actions/remotesubscribe.php index c3a09bcfc..14e8cb068 100644 --- a/actions/remotesubscribe.php +++ b/actions/remotesubscribe.php @@ -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); + } } diff --git a/actions/replies.php b/actions/replies.php index 835871ffc..be80fae79 100644 --- a/actions/replies.php +++ b/actions/replies.php @@ -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)); + } } diff --git a/actions/repliesrss.php b/actions/repliesrss.php index 7369db5e0..3689ea1f8 100644 --- a/actions/repliesrss.php +++ b/actions/repliesrss.php @@ -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 diff --git a/actions/requesttoken.php b/actions/requesttoken.php index 76019a929..4950d93c0 100644 --- a/actions/requesttoken.php +++ b/actions/requesttoken.php @@ -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()); + } + } } diff --git a/actions/showfavorites.php b/actions/showfavorites.php index 4de4b1271..2fd1e586d 100644 --- a/actions/showfavorites.php +++ b/actions/showfavorites.php @@ -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)); + } } diff --git a/actions/showmessage.php b/actions/showmessage.php index c171ffe0b..f35f3eede 100644 --- a/actions/showmessage.php +++ b/actions/showmessage.php @@ -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 diff --git a/actions/shownotice.php b/actions/shownotice.php index 6dea6d7bb..74d197ed1 100644 --- a/actions/shownotice.php +++ b/actions/shownotice.php @@ -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.')); + } } diff --git a/actions/showstream.php b/actions/showstream.php index 61fdec3fe..f8525348d 100644 --- a/actions/showstream.php +++ b/actions/showstream.php @@ -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! diff --git a/actions/smssettings.php b/actions/smssettings.php index 5db26730a..506801e97 100644 --- a/actions/smssettings.php +++ b/actions/smssettings.php @@ -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))); + } } diff --git a/actions/subedit.php b/actions/subedit.php index e7505e3fe..1d095ab9a 100644 --- a/actions/subedit.php +++ b/actions/subedit.php @@ -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'); diff --git a/actions/subscribe.php b/actions/subscribe.php index 64abda004..c94c4d7eb 100644 --- a/actions/subscribe.php +++ b/actions/subscribe.php @@ -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))); } - } + } } diff --git a/actions/subscribers.php b/actions/subscribers.php index ae52526e1..b9ca92af3 100644 --- a/actions/subscribers.php +++ b/actions/subscribers.php @@ -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'; diff --git a/actions/subscriptions.php b/actions/subscriptions.php index f518a1f92..c24f23a07 100644 --- a/actions/subscriptions.php +++ b/actions/subscriptions.php @@ -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; } diff --git a/actions/sup.php b/actions/sup.php index 887017b2a..3c9cbea2c 100644 --- a/actions/sup.php +++ b/actions/sup.php @@ -20,62 +20,62 @@ 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; + } } diff --git a/actions/tag.php b/actions/tag.php index 25cc853c4..1325b85a5 100644 --- a/actions/tag.php +++ b/actions/tag.php @@ -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)); + } } diff --git a/actions/tagother.php b/actions/tagother.php index a4449dd69..832671ae7 100644 --- a/actions/tagother.php +++ b/actions/tagother.php @@ -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'); - } - } + } } diff --git a/actions/tagrss.php b/actions/tagrss.php index 9187bdc87..45639fec4 100644 --- a/actions/tagrss.php +++ b/actions/tagrss.php @@ -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; + } } diff --git a/actions/twitapiaccount.php b/actions/twitapiaccount.php index f6e955828..b1caa3481 100644 --- a/actions/twitapiaccount.php +++ b/actions/twitapiaccount.php @@ -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 diff --git a/actions/twitapiblocks.php b/actions/twitapiblocks.php index 4852ff938..16b2e76bc 100644 --- a/actions/twitapiblocks.php +++ b/actions/twitapiblocks.php @@ -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 diff --git a/actions/twitapidirect_messages.php b/actions/twitapidirect_messages.php index 535795ca4..2e3b50173 100644 --- a/actions/twitapidirect_messages.php +++ b/actions/twitapidirect_messages.php @@ -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 + } } diff --git a/actions/twitapifavorites.php b/actions/twitapifavorites.php index 3eaff327a..ad8c5f18b 100644 --- a/actions/twitapifavorites.php +++ b/actions/twitapifavorites.php @@ -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 diff --git a/actions/twitapifriendships.php b/actions/twitapifriendships.php index e4b49cbe4..d352b933b 100644 --- a/actions/twitapifriendships.php +++ b/actions/twitapifriendships.php @@ -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 diff --git a/actions/twitapihelp.php b/actions/twitapihelp.php index c5d503e11..d268b7c82 100644 --- a/actions/twitapihelp.php +++ b/actions/twitapihelp.php @@ -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 diff --git a/actions/twitapinotifications.php b/actions/twitapinotifications.php index 8d93309a2..26f66d7e5 100644 --- a/actions/twitapinotifications.php +++ b/actions/twitapinotifications.php @@ -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 diff --git a/actions/twitapistatuses.php b/actions/twitapistatuses.php index 7b6598b10..c33643a3c 100644 --- a/actions/twitapistatuses.php +++ b/actions/twitapistatuses.php @@ -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; + } } diff --git a/actions/twitapiusers.php b/actions/twitapiusers.php index 9e06efa64..43f6969f4 100644 --- a/actions/twitapiusers.php +++ b/actions/twitapiusers.php @@ -10,11 +10,11 @@ * * 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); + } } diff --git a/actions/twittersettings.php b/actions/twittersettings.php index ae3aff877..e300e699a 100644 --- a/actions/twittersettings.php +++ b/actions/twittersettings.php @@ -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 diff --git a/actions/unblock.php b/actions/unblock.php index d60cc7088..6a86c2bf0 100644 --- a/actions/unblock.php +++ b/actions/unblock.php @@ -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'); diff --git a/actions/unsubscribe.php b/actions/unsubscribe.php index 98291e897..38fcc21de 100644 --- a/actions/unsubscribe.php +++ b/actions/unsubscribe.php @@ -19,30 +19,30 @@ 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))); } - } + } } diff --git a/actions/updateprofile.php b/actions/updateprofile.php index 921e88e63..4b4bb53a1 100644 --- a/actions/updateprofile.php +++ b/actions/updateprofile.php @@ -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; + } + } } diff --git a/actions/userauthorization.php b/actions/userauthorization.php index ac0a0728c..97809f197 100644 --- a/actions/userauthorization.php +++ b/actions/userauthorization.php @@ -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(); + } } diff --git a/actions/userbyid.php b/actions/userbyid.php index 38bff2ede..4eab8758c 100644 --- a/actions/userbyid.php +++ b/actions/userbyid.php @@ -20,30 +20,30 @@ 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); + } } diff --git a/actions/userrss.php b/actions/userrss.php index e57f86105..b5cb5a40a 100644 --- a/actions/userrss.php +++ b/actions/userrss.php @@ -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 diff --git a/actions/xrds.php b/actions/xrds.php index 1d516aab7..9788c87aa 100644 --- a/actions/xrds.php +++ b/actions/xrds.php @@ -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 diff --git a/classes/Avatar.php b/classes/Avatar.php index 901c47c51..e63668a33 100644 --- a/classes/Avatar.php +++ b/classes/Avatar.php @@ -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); + } } diff --git a/classes/Channel.php b/classes/Channel.php index bcc0c36b5..384fe8bb1 100644 --- a/classes/Channel.php +++ b/classes/Channel.php @@ -20,181 +20,181 @@ 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; + } } diff --git a/classes/Command.php b/classes/Command.php index c2409d140..ff44b9d1e 100644 --- a/classes/Command.php +++ b/classes/Command.php @@ -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")); + } } diff --git a/classes/CommandInterpreter.php b/classes/CommandInterpreter.php index 4e27f8f79..8192fb1a9 100644 --- a/classes/CommandInterpreter.php +++ b/classes/CommandInterpreter.php @@ -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; + } + } } diff --git a/classes/Fave.php b/classes/Fave.php index 7cc3f585e..b70a8a897 100644 --- a/classes/Fave.php +++ b/classes/Fave.php @@ -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); + } } diff --git a/classes/Foreign_link.php b/classes/Foreign_link.php index 7a625a209..7ce0df833 100644 --- a/classes/Foreign_link.php +++ b/classes/Foreign_link.php @@ -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); + } + } diff --git a/classes/Foreign_user.php b/classes/Foreign_user.php index 027fae69d..396680128 100644 --- a/classes/Foreign_user.php +++ b/classes/Foreign_user.php @@ -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; + } - + } diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php index 7a33e158d..7699e1b38 100644 --- a/classes/Memcached_DataObject.php +++ b/classes/Memcached_DataObject.php @@ -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'; diff --git a/classes/Message.php b/classes/Message.php index ef4bd0316..dc527fcb1 100644 --- a/classes/Message.php +++ b/classes/Message.php @@ -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; + } } diff --git a/classes/Notice.php b/classes/Notice.php index ca8283bce..35e03e342 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -10,11 +10,11 @@ * * 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; + } } diff --git a/classes/NoticeWrapper.php b/classes/NoticeWrapper.php index f8c0aa381..edecb3092 100644 --- a/classes/NoticeWrapper.php +++ b/classes/NoticeWrapper.php @@ -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 diff --git a/classes/Notice_tag.php b/classes/Notice_tag.php index 5b75ff13f..84c4a1020 100644 --- a/classes/Notice_tag.php +++ b/classes/Notice_tag.php @@ -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)); + } + } } diff --git a/classes/Profile.php b/classes/Profile.php index b57d7e38d..1f4508bf1 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -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); + } } diff --git a/classes/Profile_tag.php b/classes/Profile_tag.php index dde19aea2..2daabf867 100644 --- a/classes/Profile_tag.php +++ b/classes/Profile_tag.php @@ -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; + } } diff --git a/classes/Queue_item.php b/classes/Queue_item.php index 8ba3281de..e54b4976b 100644 --- a/classes/Queue_item.php +++ b/classes/Queue_item.php @@ -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; + } } diff --git a/classes/Sms_carrier.php b/classes/Sms_carrier.php index 6ecb51346..f6e0791f9 100644 --- a/classes/Sms_carrier.php +++ b/classes/Sms_carrier.php @@ -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); + } } diff --git a/classes/Subscription.php b/classes/Subscription.php index cc174fcce..a3b5e4b90 100644 --- a/classes/Subscription.php +++ b/classes/Subscription.php @@ -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); + } } diff --git a/classes/User.php b/classes/User.php index 32d5bedde..c2c6ad57f 100644 --- a/classes/User.php +++ b/classes/User.php @@ -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(); diff --git a/lib/common.php b/lib/common.php index 5a28c3091..95ba64d0f 100644 --- a/lib/common.php +++ b/lib/common.php @@ -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'); } } diff --git a/lib/deleteaction.php b/lib/deleteaction.php index 5ba0e7e44..335070cc4 100644 --- a/lib/deleteaction.php +++ b/lib/deleteaction.php @@ -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; + } } diff --git a/lib/facebookaction.php b/lib/facebookaction.php index 87a82ba01..67595861f 100644 --- a/lib/facebookaction.php +++ b/lib/facebookaction.php @@ -10,11 +10,11 @@ * * 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}"; + } } diff --git a/lib/oauthstore.php b/lib/oauthstore.php index d7f9c9ff1..aa705be30 100644 --- a/lib/oauthstore.php +++ b/lib/oauthstore.php @@ -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); + } } diff --git a/lib/omb.php b/lib/omb.php index 96736b4d4..94ccc2ecd 100644 --- a/lib/omb.php +++ b/lib/omb.php @@ -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; + } + } } diff --git a/lib/openid.php b/lib/openid.php index 6e501c2b1..ebc5ed168 100644 --- a/lib/openid.php +++ b/lib/openid.php @@ -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('/&/', '&', $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('/&/', '&', $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; } diff --git a/lib/personal.php b/lib/personal.php index 86433b486..1928349a3 100644 --- a/lib/personal.php +++ b/lib/personal.php @@ -20,187 +20,187 @@ 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; + } } diff --git a/lib/profilelist.php b/lib/profilelist.php index 9079ea9d7..e32c5c254 100644 --- a/lib/profilelist.php +++ b/lib/profilelist.php @@ -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 diff --git a/lib/queuehandler.php b/lib/queuehandler.php index 23f295c45..5e3905f59 100644 --- a/lib/queuehandler.php +++ b/lib/queuehandler.php @@ -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 diff --git a/lib/rssaction.php b/lib/rssaction.php index 777511506..b64796888 100644 --- a/lib/rssaction.php +++ b/lib/rssaction.php @@ -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'); + } } diff --git a/lib/search_engines.php b/lib/search_engines.php index 7fcc1ffcb..d53d7d8d8 100644 --- a/lib/search_engines.php +++ b/lib/search_engines.php @@ -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).'\')'); } } diff --git a/lib/searchaction.php b/lib/searchaction.php index f99883b25..8634bd99c 100644 --- a/lib/searchaction.php +++ b/lib/searchaction.php @@ -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); + } } diff --git a/lib/settingsaction.php b/lib/settingsaction.php index 9e783431f..3021eb192 100644 --- a/lib/settingsaction.php +++ b/lib/settingsaction.php @@ -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], diff --git a/lib/stream.php b/lib/stream.php index 27ab78137..2d45df2d3 100644 --- a/lib/stream.php +++ b/lib/stream.php @@ -10,11 +10,11 @@ * * 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); diff --git a/lib/subs.php b/lib/subs.php index 91fc8445d..55e74e0b2 100644 --- a/lib/subs.php +++ b/lib/subs.php @@ -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; } diff --git a/lib/theme.php b/lib/theme.php index 80982aa82..346cff434 100644 --- a/lib/theme.php +++ b/lib/theme.php @@ -20,16 +20,16 @@ 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 diff --git a/lib/twitter.php b/lib/twitter.php index 5c9ef5d6f..c1d2de0ea 100644 --- a/lib/twitter.php +++ b/lib/twitter.php @@ -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; } diff --git a/lib/twitterapi.php b/lib/twitterapi.php index 2eb127525..3122caf12 100644 --- a/lib/twitterapi.php +++ b/lib/twitterapi.php @@ -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 diff --git a/lib/xmppqueuehandler.php b/lib/xmppqueuehandler.php index cfc9642e4..33b987291 100644 --- a/lib/xmppqueuehandler.php +++ b/lib/xmppqueuehandler.php @@ -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'; + } + } } diff --git a/scripts/enjitqueuehandler.php b/scripts/enjitqueuehandler.php index 8538ae09a..cfb253753 100755 --- a/scripts/enjitqueuehandler.php +++ b/scripts/enjitqueuehandler.php @@ -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(); diff --git a/scripts/fixup_hashtags.php b/scripts/fixup_hashtags.php index 88f385798..6f65c78a1 100755 --- a/scripts/fixup_hashtags.php +++ b/scripts/fixup_hashtags.php @@ -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__); + } } diff --git a/scripts/fixup_inboxes.php b/scripts/fixup_inboxes.php index 1715b0bc1..e631a80ed 100755 --- a/scripts/fixup_inboxes.php +++ b/scripts/fixup_inboxes.php @@ -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)); + } } diff --git a/scripts/fixup_notices_rendered.php b/scripts/fixup_notices_rendered.php index c6c925729..1fa9f394e 100755 --- a/scripts/fixup_notices_rendered.php +++ b/scripts/fixup_notices_rendered.php @@ -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__); + } } diff --git a/scripts/getpiddir.php b/scripts/getpiddir.php index b4dda2254..4f5704249 100755 --- a/scripts/getpiddir.php +++ b/scripts/getpiddir.php @@ -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__) . '/..')); diff --git a/scripts/inbox_users.php b/scripts/inbox_users.php index 0543abb2a..f907e1584 100755 --- a/scripts/inbox_users.php +++ b/scripts/inbox_users.php @@ -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)); + } } diff --git a/scripts/jabberqueuehandler.php b/scripts/jabberqueuehandler.php index 59cdb94ad..8e33cfaf0 100755 --- a/scripts/jabberqueuehandler.php +++ b/scripts/jabberqueuehandler.php @@ -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"); diff --git a/scripts/maildaemon.php b/scripts/maildaemon.php index 8b809f646..6d8507514 100755 --- a/scripts/maildaemon.php +++ b/scripts/maildaemon.php @@ -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(); diff --git a/scripts/ombqueuehandler.php b/scripts/ombqueuehandler.php index 1df816d14..31ae20f00 100755 --- a/scripts/ombqueuehandler.php +++ b/scripts/ombqueuehandler.php @@ -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"); diff --git a/scripts/publicqueuehandler.php b/scripts/publicqueuehandler.php index b1ae1d581..2168aade2 100755 --- a/scripts/publicqueuehandler.php +++ b/scripts/publicqueuehandler.php @@ -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"); diff --git a/scripts/sitemap.php b/scripts/sitemap.php index 6b845beae..b49bfe2a5 100644 --- a/scripts/sitemap.php +++ b/scripts/sitemap.php @@ -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('/&/', '&', $url_args['url']); # escape ampersands for XML - $lastmod = $url_args['lastmod']; - $changefreq = $url_args['changefreq']; - $priority = $url_args['priority']; + $url = preg_replace('/&/', '&', $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('/&/', '&', $sitemap_args['url']); # escape ampersands for XML - $lastmod = $sitemap_args['lastmod']; + $url = preg_replace('/&/', '&', $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 diff --git a/scripts/smsqueuehandler.php b/scripts/smsqueuehandler.php index 8f0d02d9b..f17429d96 100755 --- a/scripts/smsqueuehandler.php +++ b/scripts/smsqueuehandler.php @@ -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"); diff --git a/scripts/synctwitterfriends.php b/scripts/synctwitterfriends.php index 070eb9bbb..0ce34c2ae 100755 --- a/scripts/synctwitterfriends.php +++ b/scripts/synctwitterfriends.php @@ -11,17 +11,17 @@ * * 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); + } + } } diff --git a/scripts/update_translations.php b/scripts/update_translations.php index 3eb7b3401..8ad07ccca 100644 --- a/scripts/update_translations.php +++ b/scripts/update_translations.php @@ -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"; diff --git a/scripts/xmppconfirmhandler.php b/scripts/xmppconfirmhandler.php index 8961b0b6e..454616ca0 100755 --- a/scripts/xmppconfirmhandler.php +++ b/scripts/xmppconfirmhandler.php @@ -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"); diff --git a/scripts/xmppdaemon.php b/scripts/xmppdaemon.php index 9a60970a6..cd27a2c14 100755 --- a/scripts/xmppdaemon.php +++ b/scripts/xmppdaemon.php @@ -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"); |