From 0b6994516c91890753a1b18404f77a60de543980 Mon Sep 17 00:00:00 2001 From: Dan Moore Date: Fri, 5 Jun 2009 01:01:25 -0400 Subject: Cleaning up comments at top of favor.php. --- actions/favor.php | 2 -- 1 file changed, 2 deletions(-) (limited to 'actions') diff --git a/actions/favor.php b/actions/favor.php index 3b7d979eb..a7aff87f2 100644 --- a/actions/favor.php +++ b/actions/favor.php @@ -12,8 +12,6 @@ * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 * @link http://laconi.ca/ * - -/* * Laconica - a distributed open-source microblogging tool * Copyright (C) 2008, Controlez-Vous, Inc. * -- cgit v1.2.3-54-g00ecf From 40e05a3e86559bb9bd7094519003d3c7d90501a5 Mon Sep 17 00:00:00 2001 From: Dan Moore Date: Fri, 5 Jun 2009 12:53:17 -0400 Subject: Bringing users/show in line with Twitter as far as specifying user. --- actions/twitapiusers.php | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'actions') diff --git a/actions/twitapiusers.php b/actions/twitapiusers.php index b90bbfa98..0461efcb4 100644 --- a/actions/twitapiusers.php +++ b/actions/twitapiusers.php @@ -35,20 +35,13 @@ class TwitapiusersAction extends TwitterapiAction $user = null; $email = $this->arg('email'); - $user_id = $this->arg('user_id'); // XXX: email field deprecated in Twitter's API - // XXX: Also: need to add screen_name param - if ($email) { $user = User::staticGet('email', $email); - } elseif ($user_id) { - $user = $this->get_user($user_id); - } elseif (isset($apidata['api_arg'])) { + } else { $user = $this->get_user($apidata['api_arg']); - } elseif (isset($apidata['user'])) { - $user = $apidata['user']; } if (!$user) { -- cgit v1.2.3-54-g00ecf From bd9824c8d563bbd2d9f9ed259341f0e2fc1ffdf1 Mon Sep 17 00:00:00 2001 From: Brenda Wallace Date: Thu, 25 Jun 2009 22:35:41 +1200 Subject: added missing conversation column to group by --- actions/favorited.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'actions') diff --git a/actions/favorited.php b/actions/favorited.php index c902d80f5..156c7a700 100644 --- a/actions/favorited.php +++ b/actions/favorited.php @@ -194,7 +194,7 @@ class FavoritedAction extends Action $qry = 'SELECT notice.*, '. $weightexpr . ' as weight ' . 'FROM notice JOIN fave ON notice.id = fave.notice_id ' . - 'GROUP BY id,profile_id,uri,content,rendered,url,created,notice.modified,reply_to,is_local,source ' . + 'GROUP BY id,profile_id,uri,content,rendered,url,created,notice.modified,reply_to,is_local,source,notice.conversation ' . 'ORDER BY weight DESC'; $offset = ($this->page - 1) * NOTICES_PER_PAGE; -- cgit v1.2.3-54-g00ecf From e6c54a59e140c9ee3b6244dbcb92f9ca9d065887 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 5 Jul 2009 14:33:12 -0400 Subject: set/get viewdesigns flag and use it --- actions/othersettings.php | 11 ++++++++--- lib/groupdesignaction.php | 16 +++++++++------- lib/ownerdesignaction.php | 12 ++++++++---- 3 files changed, 25 insertions(+), 14 deletions(-) (limited to 'actions') diff --git a/actions/othersettings.php b/actions/othersettings.php index b542233ca..1277f8052 100644 --- a/actions/othersettings.php +++ b/actions/othersettings.php @@ -83,14 +83,12 @@ class OthersettingsAction extends AccountSettingsAction { $user = common_current_user(); - $this->elementStart('form', array('method' => 'post', 'id' => 'form_settings_other', 'class' => 'form_settings', 'action' => common_local_url('othersettings'))); $this->elementStart('fieldset'); - $this->element('legend', null, _('URL Auto-shortening')); $this->hidden('token', common_session_token()); // I18N @@ -109,10 +107,14 @@ class OthersettingsAction extends AccountSettingsAction $this->elementStart('ul', 'form_data'); $this->elementStart('li'); - $this->dropdown('urlshorteningservice', _('Service'), + $this->dropdown('urlshorteningservice', _('Shorten URLs with'), $services, _('Automatic shortening service to use.'), false, $user->urlshorteningservice); $this->elementEnd('li'); + $this->elementStart('li'); + $this->checkbox('viewdesigns', _('View profile designs'), + $user->viewdesigns, _('Show or hide profile designs.')); + $this->elementEnd('li'); $this->elementEnd('ul'); $this->submit('save', _('Save')); $this->elementEnd('fieldset'); @@ -145,6 +147,8 @@ class OthersettingsAction extends AccountSettingsAction return; } + $viewdesigns = $this->boolean('viewdesigns'); + $user = common_current_user(); assert(!is_null($user)); // should already be checked @@ -154,6 +158,7 @@ class OthersettingsAction extends AccountSettingsAction $original = clone($user); $user->urlshorteningservice = $urlshorteningservice; + $user->viewdesigns = $viewdesigns; $result = $user->update($original); diff --git a/lib/groupdesignaction.php b/lib/groupdesignaction.php index bc95921f1..58777c283 100644 --- a/lib/groupdesignaction.php +++ b/lib/groupdesignaction.php @@ -34,7 +34,7 @@ if (!defined('LACONICA')) { /** * Base class for actions that use a group's design * - * Pages related to groups can be themed with a design. + * Pages related to groups can be themed with a design. * This superclass returns that design. * * @category Action @@ -48,7 +48,7 @@ class GroupDesignAction extends Action { /** The group in question */ var $group = null; - + /** * Show the groups's design stylesheet * @@ -58,10 +58,14 @@ class GroupDesignAction extends Action { { parent::showStylesheets(); - $design = $this->getDesign(); + $user = common_current_user(); + + if (empty($user) || $user->viewdesigns) { + $design = $this->getDesign(); - if (!empty($design)) { - $design->showCSS($this); + if (!empty($design)) { + $design->showCSS($this); + } } } @@ -76,12 +80,10 @@ class GroupDesignAction extends Action { function getDesign() { - if (empty($this->group)) { return null; } return $this->group->getDesign(); } - } diff --git a/lib/ownerdesignaction.php b/lib/ownerdesignaction.php index 424474f42..785b8a93d 100644 --- a/lib/ownerdesignaction.php +++ b/lib/ownerdesignaction.php @@ -61,11 +61,15 @@ class OwnerDesignAction extends Action { { parent::showStylesheets(); - $design = $this->getDesign(); + $user = common_current_user(); - if (!empty($design)) { - $design->showCSS($this); - } + if (empty($user) || $user->viewdesigns) { + $design = $this->getDesign(); + + if (!empty($design)) { + $design->showCSS($this); + } + } } /** -- cgit v1.2.3-54-g00ecf From d40075ae9c7c2b920a5e9a7cd436aff96f94d8f8 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 6 Jul 2009 11:57:21 -0700 Subject: Support undocumented 'id' parameter in /statuses/show API method --- actions/twitapistatuses.php | 15 ++++++++++++--- lib/router.php | 2 +- 2 files changed, 13 insertions(+), 4 deletions(-) (limited to 'actions') diff --git a/actions/twitapistatuses.php b/actions/twitapistatuses.php index 555c746cb..c9943698d 100644 --- a/actions/twitapistatuses.php +++ b/actions/twitapistatuses.php @@ -373,9 +373,19 @@ class TwitapistatusesAction extends TwitterapiAction return; } + // 'id' is an undocumented parameter in Twitter's API. Several + // clients make use of it, so we support it too. + + // show.json?id=12345 takes precedence over /show/12345.json + $this->auth_user = $apidata['user']; - $notice_id = $apidata['api_arg']; - $notice = Notice::staticGet($notice_id); + $notice_id = $this->trimmed('id'); + + if (empty($notice_id)) { + $notice_id = $apidata['api_arg']; + } + + $notice = Notice::staticGet((int)$notice_id); if ($notice) { if ($apidata['content-type'] == 'xml') { @@ -389,7 +399,6 @@ class TwitapistatusesAction extends TwitterapiAction $this->clientError(_('No status with that ID found.'), 404, $apidata['content-type']); } - } function destroy($args, $apidata) diff --git a/lib/router.php b/lib/router.php index 50b733453..75e72f932 100644 --- a/lib/router.php +++ b/lib/router.php @@ -261,7 +261,7 @@ class Router $m->connect('api/statuses/:method', array('action' => 'api', 'apiaction' => 'statuses'), - array('method' => '(public_timeline|friends_timeline|user_timeline|update|replies|mentions|friends|followers|featured)(\.(atom|rss|xml|json))?')); + array('method' => '(public_timeline|friends_timeline|user_timeline|update|replies|mentions|show|friends|followers|featured)(\.(atom|rss|xml|json))?')); $m->connect('api/statuses/:method/:argument', array('action' => 'api', -- cgit v1.2.3-54-g00ecf From 5e067c2c813cb51c1162761aaf3a7efd883ba731 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 6 Jul 2009 13:21:16 -0700 Subject: Add special basic auth handling for friendships/show. Other fixups. --- actions/api.php | 63 +++++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 48 insertions(+), 15 deletions(-) (limited to 'actions') diff --git a/actions/api.php b/actions/api.php index 08f5fadad..18c3b68d4 100644 --- a/actions/api.php +++ b/actions/api.php @@ -75,14 +75,14 @@ class ApiAction extends Action } } else { - # Caller might give us a username even if not required - if (isset($_SERVER['PHP_AUTH_USER'])) { - $user = User::staticGet('nickname', $_SERVER['PHP_AUTH_USER']); - if ($user) { - $this->user = $user; - } - # Twitter doesn't throw an error if the user isn't found - } + // Caller might give us a username even if not required + if (isset($_SERVER['PHP_AUTH_USER'])) { + $user = User::staticGet('nickname', $_SERVER['PHP_AUTH_USER']); + if ($user) { + $this->user = $user; + } + # Twitter doesn't throw an error if the user isn't found + } $this->process_command(); } @@ -117,7 +117,7 @@ class ApiAction extends Action } } - # Whitelist of API methods that don't need authentication + // Whitelist of API methods that don't need authentication function requires_auth() { static $noauth = array( 'statuses/public_timeline', @@ -135,28 +135,61 @@ class ApiAction extends Action 'statuses/replies', 'statuses/mentions', 'statuses/followers', - 'favorites/favorites'); + 'favorites/favorites', + 'friendships/show'); $fullname = "$this->api_action/$this->api_method"; // If the site is "private", all API methods except laconica/config // need authentication + if (common_config('site', 'private')) { return $fullname != 'laconica/config' || false; } + // bareauth: only needs auth if without an argument or query param specifying user + if (in_array($fullname, $bareauth)) { - # bareauth: only needs auth if without an argument or query param specifying user - if ($this->api_arg || $this->arg('id') || is_numeric($this->arg('user_id')) || $this->arg('screen_name')) { + + // Special case: friendships/show only needs auth if source_id or + // source_screen_name is not specified as a param + + if ($fullname == 'friendships/show') { + + $source_id = $this->arg('source_id'); + $source_screen_name = $this->arg('source_screen_name'); + + if (empty($source_id) && empty($source_screen_name)) { + return true; + } + return false; - } else { + } + + // if all of these are empty, auth is required + + $id = $this->arg('id'); + $user_id = $this->arg('user_id'); + $screen_name = $this->arg('screen_name'); + + if (empty($this->api_arg) && + empty($id) && + empty($user_id) && + empty($screen_name)) { return true; + } else { + return false; } + } else if (in_array($fullname, $noauth)) { - # noauth: never needs auth + + // noauth: never needs auth + return false; } else { - # everybody else needs auth + + // everybody else needs auth + return true; } } -- cgit v1.2.3-54-g00ecf From 91684830e55dd0e6a9e069ff140e17a929dd2364 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 6 Jul 2009 15:49:26 -0700 Subject: fix bad function call --- actions/twitapiusers.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'actions') diff --git a/actions/twitapiusers.php b/actions/twitapiusers.php index 0461efcb4..a47fdfbc3 100644 --- a/actions/twitapiusers.php +++ b/actions/twitapiusers.php @@ -45,7 +45,7 @@ class TwitapiusersAction extends TwitterapiAction } if (!$user) { - $this->client_error(_('Not found.'), 404, $apidata['content-type']); + $this->clientError(_('Not found.'), 404, $apidata['content-type']); return; } -- cgit v1.2.3-54-g00ecf From a9c1e665701d5f5f20940143aa413faaec1a8c78 Mon Sep 17 00:00:00 2001 From: Dan Moore Date: Fri, 5 Jun 2009 12:53:17 -0400 Subject: Bringing users/show in line with Twitter as far as specifying user. --- actions/twitapiusers.php | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'actions') diff --git a/actions/twitapiusers.php b/actions/twitapiusers.php index 4057b63e7..ee01c2a43 100644 --- a/actions/twitapiusers.php +++ b/actions/twitapiusers.php @@ -37,20 +37,13 @@ class TwitapiusersAction extends TwitterapiAction $user = null; $email = $this->arg('email'); - $user_id = $this->arg('user_id'); // XXX: email field deprecated in Twitter's API - // XXX: Also: need to add screen_name param - if ($email) { $user = User::staticGet('email', $email); - } elseif ($user_id) { - $user = $this->get_user($user_id); - } elseif (isset($apidata['api_arg'])) { + } else { $user = $this->get_user($apidata['api_arg']); - } elseif (isset($apidata['user'])) { - $user = $apidata['user']; } if (empty($user)) { -- cgit v1.2.3-54-g00ecf From 195ec6820bf0c7fa60bca0f112a2ff8f98345a3c Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 6 Jul 2009 15:56:10 -0700 Subject: fix bad function call Conflicts: actions/twitapiusers.php --- actions/twitapiusers.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'actions') diff --git a/actions/twitapiusers.php b/actions/twitapiusers.php index ee01c2a43..e9fcccbde 100644 --- a/actions/twitapiusers.php +++ b/actions/twitapiusers.php @@ -47,7 +47,7 @@ class TwitapiusersAction extends TwitterapiAction } if (empty($user)) { - $this->client_error(_('Not found.'), 404, $apidata['content-type']); + $this->clientError(_('Not found.'), 404, $apidata['content-type']); return; } -- cgit v1.2.3-54-g00ecf From 4fffe1874f7db6239a42d5a9acdc4279fdde08f8 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 6 Jul 2009 16:44:35 -0700 Subject: Fix redundant page display for group design settings --- actions/groupdesignsettings.php | 32 -------------------------------- 1 file changed, 32 deletions(-) (limited to 'actions') diff --git a/actions/groupdesignsettings.php b/actions/groupdesignsettings.php index 6c1c052cb..bb01243c6 100644 --- a/actions/groupdesignsettings.php +++ b/actions/groupdesignsettings.php @@ -312,36 +312,4 @@ class GroupDesignSettingsAction extends DesignSettingsAction $this->showForm(_('Design preferences saved.'), true); } - /** - * Handle input and output a page (overrided) - * - * @param array $args $_REQUEST arguments - * - * @return void - */ - - function handle($args) - { - parent::handle($args); - if (!common_logged_in()) { - $this->clientError(_('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 - common_set_returnto($this->selfUrl()); - $user = common_current_user(); - if ($user->hasOpenID()) { - common_redirect(common_local_url('openidlogin'), 303); - } else { - common_redirect(common_local_url('login'), 303); - } - } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { - $this->handlePost(); - } else { - $this->showForm(); - } - } - } -- cgit v1.2.3-54-g00ecf From 5f72423523c0d95800460cd3342461d3c72eafa1 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Tue, 7 Jul 2009 15:55:10 -0400 Subject: File classes does not use the $FILES array directly, as users of this class aren't necessarily from the web --- actions/newnotice.php | 2 +- classes/File.php | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) (limited to 'actions') diff --git a/actions/newnotice.php b/actions/newnotice.php index 5f44a32a9..e254eac49 100644 --- a/actions/newnotice.php +++ b/actions/newnotice.php @@ -135,7 +135,7 @@ class NewnoticeAction extends Action function isRespectsQuota($user) { $file = new File; - $ret = $file->isRespectsQuota($user); + $ret = $file->isRespectsQuota($user,$_FILES['attach']['size']); if (true === $ret) return true; $this->clientError($ret); } diff --git a/classes/File.php b/classes/File.php index 5dd7cd865..533cc6e71 100644 --- a/classes/File.php +++ b/classes/File.php @@ -122,17 +122,17 @@ class File extends Memcached_DataObject return $x; } - function isRespectsQuota($user) { - if ($_FILES['attach']['size'] > common_config('attachments', 'file_quota')) { + function isRespectsQuota($user,$fileSize) { + if ($fileSize > common_config('attachments', 'file_quota')) { return sprintf(_('No file may be larger than %d bytes ' . 'and the file you sent was %d bytes. Try to upload a smaller version.'), - common_config('attachments', 'file_quota'), $_FILES['attach']['size']); + common_config('attachments', 'file_quota'), $fileSize); } $query = "select sum(size) as total from file join file_to_post on file_to_post.file_id = file.id join notice on file_to_post.post_id = notice.id where profile_id = {$user->id} and file.url like '%/notice/%/file'"; $this->query($query); $this->fetch(); - $total = $this->total + $_FILES['attach']['size']; + $total = $this->total + $fileSize; if ($total > common_config('attachments', 'user_quota')) { return sprintf(_('A file this large would exceed your user quota of %d bytes.'), common_config('attachments', 'user_quota')); } @@ -140,7 +140,7 @@ class File extends Memcached_DataObject $query .= ' month(modified) = month(now()) and year(modified) = year(now())'; $this->query($query); $this->fetch(); - $total = $this->total + $_FILES['attach']['size']; + $total = $this->total + $fileSize; if ($total > common_config('attachments', 'monthly_quota')) { return sprintf(_('A file this large would exceed your monthly quota of %d bytes.'), common_config('attachments', 'monthly_quota')); } -- cgit v1.2.3-54-g00ecf From 802b9095188d51fd64d459291ca8828530220e83 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 7 Jul 2009 14:21:44 -0700 Subject: user/show API method needs to fall back to basic auth so that verify_credentials works correctly. --- actions/twitapiusers.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'actions') diff --git a/actions/twitapiusers.php b/actions/twitapiusers.php index e9fcccbde..de8326e3a 100644 --- a/actions/twitapiusers.php +++ b/actions/twitapiusers.php @@ -43,7 +43,7 @@ class TwitapiusersAction extends TwitterapiAction if ($email) { $user = User::staticGet('email', $email); } else { - $user = $this->get_user($apidata['api_arg']); + $user = $this->get_user($apidata['api_arg'], $apidata); } if (empty($user)) { -- cgit v1.2.3-54-g00ecf From 8250006fbfdc120a4766f85ff5d6ee79798d626d Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Thu, 9 Jul 2009 18:42:19 -0400 Subject: When a notice is posted with an attachment, the facebook stream update has media displayed inline, or as links. http://laconi.ca/trac/ticket/1685 --- actions/facebookhome.php | 4 +-- actions/facebooklogin.php | 4 +-- actions/facebooksettings.php | 4 +-- lib/facebookaction.php | 15 ++--------- lib/facebookutil.php | 61 +++++++++++++++++++++++++++++++++++++++++--- 5 files changed, 65 insertions(+), 23 deletions(-) (limited to 'actions') diff --git a/actions/facebookhome.php b/actions/facebookhome.php index 34989c978..6d8d0745d 100644 --- a/actions/facebookhome.php +++ b/actions/facebookhome.php @@ -57,7 +57,7 @@ class FacebookhomeAction extends FacebookAction // If this is the first time the user has started the app // prompt for Facebook status update permission - if (!$this->facebook->api_client->users_hasAppPermission('status_update')) { + if (!$this->facebook->api_client->users_hasAppPermission('publish_stream')) { if ($this->facebook->api_client->data_getUserPreference( FACEBOOK_PROMPTED_UPDATE_PREF) != 'true') { @@ -203,7 +203,7 @@ class FacebookhomeAction extends FacebookAction $api_key = common_config('facebook', 'apikey'); $auth_url = 'http://www.facebook.com/authorize.php?api_key=' . - $api_key . '&v=1.0&ext_perm=status_update&next=' . $next . + $api_key . '&v=1.0&ext_perm=publish_stream&next=' . $next . '&next_cancel=' . $next . '&submit=skip'; $this->elementStart('span', array('class' => 'facebook-button')); diff --git a/actions/facebooklogin.php b/actions/facebooklogin.php index 22007da4f..aa86cfbc0 100644 --- a/actions/facebooklogin.php +++ b/actions/facebooklogin.php @@ -31,7 +31,7 @@ class FacebookinviteAction extends FacebookAction $this->error = $error; if ($this->flink) { - if (!$this->facebook->api_client->users_hasAppPermission('status_update') && + if (!$this->facebook->api_client->users_hasAppPermission('publish_stream') && $this->facebook->api_client->data_getUserPreference( FACEBOOK_PROMPTED_UPDATE_PREF) == 'true') { @@ -60,7 +60,7 @@ class FacebookinviteAction extends FacebookAction // If this is the first time the user has started the app // prompt for Facebook status update permission - if (!$this->facebook->api_client->users_hasAppPermission('status_update')) { + if (!$this->facebook->api_client->users_hasAppPermission('publish_stream')) { if ($this->facebook->api_client->data_getUserPreference( FACEBOOK_PROMPTED_UPDATE_PREF) != 'true') { diff --git a/actions/facebooksettings.php b/actions/facebooksettings.php index ee2c279ab..c3b364743 100644 --- a/actions/facebooksettings.php +++ b/actions/facebooksettings.php @@ -78,7 +78,7 @@ class FacebooksettingsAction extends FacebookAction } } - if ($this->facebook->api_client->users_hasAppPermission('status_update')) { + if ($this->facebook->api_client->users_hasAppPermission('publish_stream')) { $this->elementStart('form', array('method' => 'post', 'id' => 'facebook_settings')); @@ -131,7 +131,7 @@ class FacebooksettingsAction extends FacebookAction $this->elementStart('ul', array('id' => 'fb-permissions-list')); $this->elementStart('li', array('id' => 'fb-permissions-item')); - $this->elementStart('fb:prompt-permission', array('perms' => 'status_update', + $this->elementStart('fb:prompt-permission', array('perms' => 'publish_stream', 'next_fbjs' => 'document.setLocation(\'' . "$this->app_uri/settings.php" . '\')')); $this->element('span', array('class' => 'facebook-button'), sprintf(_('Allow %s to update my Facebook status'), common_config('site', 'name'))); diff --git a/lib/facebookaction.php b/lib/facebookaction.php index 1ae90d53b..5be2f2fe6 100644 --- a/lib/facebookaction.php +++ b/lib/facebookaction.php @@ -460,16 +460,6 @@ class FacebookAction extends Action } } - function updateFacebookStatus($notice) - { - $prefix = $this->facebook->api_client->data_getUserPreference(FACEBOOK_NOTICE_PREFIX, $this->fbuid); - $content = "$prefix $notice->content"; - - if ($this->facebook->api_client->users_hasAppPermission('status_update', $this->fbuid)) { - $this->facebook->api_client->users_setStatus($content, $this->fbuid, false, true); - } - } - function saveNewNotice() { @@ -504,7 +494,7 @@ class FacebookAction extends Action $replyto = $this->trimmed('inreplyto'); $notice = Notice::saveNew($user->id, $content, - 'Facebook', 1, ($replyto == 'false') ? null : $replyto); + 'web', 1, ($replyto == 'false') ? null : $replyto); if (is_string($notice)) { $this->showPage($notice); @@ -514,8 +504,7 @@ class FacebookAction extends Action common_broadcast_notice($notice); // Also update the user's Facebook status - $this->updateFacebookStatus($notice); - $this->updateProfileBox($notice); + facebookBroadcastNotice($notice); } diff --git a/lib/facebookutil.php b/lib/facebookutil.php index 632ec4bad..85077c254 100644 --- a/lib/facebookutil.php +++ b/lib/facebookutil.php @@ -86,13 +86,17 @@ function isFacebookBound($notice, $flink) { // Check to see if the user has given the FB app status update perms $result = $facebook->api_client-> - users_hasAppPermission('status_update', $fbuid); + users_hasAppPermission('publish_stream', $fbuid); + if ($result != 1) { + $result = $facebook->api_client-> + users_hasAppPermission('status_update', $fbuid); + } if ($result != 1) { $user = $flink->getUser(); $msg = "Not sending notice $notice->id to Facebook " . "because user $user->nickname hasn't given the " . - 'Facebook app \'status_update\' permission.'; + 'Facebook app \'status_update\' or \'publish_stream\' permission.'; common_debug($msg); $success = false; } @@ -138,7 +142,56 @@ function facebookBroadcastNotice($notice) // Okay, we're good to go, update the FB status try { - $facebook->api_client->users_setStatus($status, $fbuid, false, true); + $result = $facebook->api_client-> + users_hasAppPermission('publish_stream', $fbuid); + if($result == 1){ + // authorized to use the stream api, so use it + $fbattachment = null; + $attachments = $notice->attachments(); + if($attachments){ + $fbattachment=array(); + $fbattachment['media']=array(); + //facebook only supports one attachment per item + $attachment = $attachments[0]; + $fbmedia=array(); + if(strncmp($attachment->mimetype,'image/',strlen('image/'))==0){ + $fbmedia['type']='image'; + $fbmedia['src']=$attachment->url; + $fbmedia['href']=$attachment->url; + $fbattachment['media'][]=$fbmedia; +/* Video doesn't seem to work. The notice never makes it to facebook, and no error is reported. + }else if(strncmp($attachment->mimetype,'video/',strlen('image/'))==0 || $attachment->mimetype="application/ogg"){ + $fbmedia['type']='video'; + $fbmedia['video_src']=$attachment->url; + // http://wiki.developers.facebook.com/index.php/Attachment_%28Streams%29 + // says that preview_img is required... but we have no value to put in it + // $fbmedia['preview_img']=$attachment->url; + if($attachment->title){ + $fbmedia['video_title']=$attachment->title; + } + $fbmedia['video_type']=$attachment->mimetype; + $fbattachment['media'][]=$fbmedia; +*/ + }else if($attachment->mimetype=='audio/mpeg'){ + $fbmedia['type']='mp3'; + $fbmedia['src']=$attachment->url; + $fbattachment['media'][]=$fbmedia; + }else if($attachment->mimetype=='application/x-shockwave-flash'){ + $fbmedia['type']='flash'; + // http://wiki.developers.facebook.com/index.php/Attachment_%28Streams%29 + // says that imgsrc is required... but we have no value to put in it + // $fbmedia['imgsrc']=''; + $fbmedia['swfsrc']=$attachment->url; + $fbattachment['media'][]=$fbmedia; + }else{ + $fbattachment['name']=($attachment->title?$attachment->title:$attachment->url); + $fbattachment['href']=$attachment->url; + } + } + $facebook->api_client->stream_publish($status, $fbattachment, null, null, $fbuid); + }else{ + $facebook->api_client->users_setStatus($status, $fbuid, false, true); + } } catch(FacebookRestClientException $e) { common_log(LOG_ERR, $e->getMessage()); common_log(LOG_ERR, @@ -150,7 +203,7 @@ function facebookBroadcastNotice($notice) if ($code >= 200) { // 200 The application does not have permission to operate on the passed in uid parameter. - // 250 Updating status requires the extended permission status_update. + // 250 Updating status requires the extended permission status_update or publish_stream. // see: http://wiki.developers.facebook.com/index.php/Users.setStatus#Example_Return_XML remove_facebook_app($flink); -- cgit v1.2.3-54-g00ecf From 08d50655f3a220b1fe970b0917a6ecbcae019b04 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Fri, 10 Jul 2009 17:00:27 -0400 Subject: added group status api, located at /api/statuses/group_timeline/ID.rss http://laconi.ca/trac/ticket/1702 --- actions/showgroup.php | 23 +++++++++++++++--- actions/twitapistatuses.php | 58 +++++++++++++++++++++++++++++++++++++++++++++ lib/router.php | 2 +- lib/twitterapi.php | 28 ++++++++++++++++++++++ 4 files changed, 107 insertions(+), 4 deletions(-) (limited to 'actions') diff --git a/actions/showgroup.php b/actions/showgroup.php index ce11d574e..f803840ff 100644 --- a/actions/showgroup.php +++ b/actions/showgroup.php @@ -317,8 +317,25 @@ class ShowgroupAction extends GroupDesignAction common_local_url('grouprss', array('nickname' => $this->group->nickname)); - return array(new Feed(Feed::RSS1, $url, sprintf(_('Notice feed for %s group'), - $this->group->nickname))); + return array(new Feed(Feed::RSS1, + common_local_url('grouprss', + array('nickname' => $this->group->nickname)), + sprintf(_('Notice feed for %s group (RSS 1.0)'), + $this->group->nickname)), + new Feed(Feed::RSS2, + common_local_url('api', + array('apiaction' => 'statuses', + 'method' => 'group_timeline', + 'argument' => $this->group->nickname.'.rss')), + sprintf(_('Notice feed for %s group (RSS 2.0)'), + $this->group->nickname)), + new Feed(Feed::ATOM, + common_local_url('api', + array('apiaction' => 'statuses', + 'method' => 'group_timeline', + 'argument' => $this->group->nickname.'.atom')), + sprintf(_('Notice feed for %s group (Atom)'), + $this->group->nickname))); } /** @@ -466,4 +483,4 @@ class GroupAdminSection extends ProfileSection { return null; } -} \ No newline at end of file +} diff --git a/actions/twitapistatuses.php b/actions/twitapistatuses.php index c9943698d..ec5d378f0 100644 --- a/actions/twitapistatuses.php +++ b/actions/twitapistatuses.php @@ -136,6 +136,64 @@ class TwitapistatusesAction extends TwitterapiAction } + function group_timeline($args, $apidata) + { + parent::handle($args); + + $this->auth_user = $apidata['user']; + $group = $this->get_group($apidata['api_arg'], $apidata); + + if (empty($group)) { + $this->clientError('Not Found', 404, $apidata['content-type']); + return; + } + + $sitename = common_config('site', 'name'); + $title = sprintf(_("%s timeline"), $group->nickname); + $taguribase = common_config('integration', 'taguri'); + $id = "tag:$taguribase:GroupTimeline:".$group->id; + $link = common_local_url('showstream', + array('nickname' => $group->nickname)); + $subtitle = sprintf(_('Updates from %1$s on %2$s!'), + $group->nickname, $sitename); + + $page = (int)$this->arg('page', 1); + $count = (int)$this->arg('count', 20); + $max_id = (int)$this->arg('max_id', 0); + $since_id = (int)$this->arg('since_id', 0); + $since = $this->arg('since'); + + $notice = $group->getNotices(($page-1)*$count, + $count, $since_id, $max_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': + if (isset($apidata['api_arg'])) { + $selfuri = common_root_url() . + 'api/statuses/group_timeline/' . + $apidata['api_arg'] . '.atom'; + } else { + $selfuri = common_root_url() . + 'api/statuses/group_timeline.atom'; + } + $this->show_atom_timeline($notice, $title, $id, $link, + $subtitle, $suplink, $selfuri); + break; + case 'json': + $this->show_json_timeline($notice); + break; + default: + $this->clientError(_('API method not found!'), $code = 404); + } + } + function user_timeline($args, $apidata) { parent::handle($args); diff --git a/lib/router.php b/lib/router.php index 75e72f932..bc063038f 100644 --- a/lib/router.php +++ b/lib/router.php @@ -266,7 +266,7 @@ class Router $m->connect('api/statuses/:method/:argument', array('action' => 'api', 'apiaction' => 'statuses'), - array('method' => '(user_timeline|friends_timeline|replies|mentions|show|destroy|friends|followers)')); + array('method' => '(group_timeline|user_timeline|friends_timeline|replies|mentions|show|destroy|friends|followers)')); // users diff --git a/lib/twitterapi.php b/lib/twitterapi.php index f48513e67..d2515070d 100644 --- a/lib/twitterapi.php +++ b/lib/twitterapi.php @@ -774,6 +774,34 @@ class TwitterapiAction extends Action } } + function get_group($id, $apidata=null) + { + if (empty($id)) { + + if (is_numeric($this->arg('id'))) { + return User::staticGet($this->arg('id')); + } else if ($this->arg('id')) { + $nickname = common_canonical_nickname($this->arg('id')); + return User_group::staticGet('nickname', $nickname); + } else if ($this->arg('user_id')) { + // This is to ensure that a non-numeric user_id still + // overrides screen_name even if it doesn't get used + if (is_numeric($this->arg('user_id'))) { + return User_group::staticGet('id', $this->arg('user_id')); + } + } else if ($this->arg('screen_name')) { + $nickname = common_canonical_nickname($this->arg('screen_name')); + return User::staticGet('nickname', $nickname); + } + + } else if (is_numeric($id)) { + return User_group::staticGet($id); + } else { + $nickname = common_canonical_nickname($id); + return User_group::staticGet('nickname', $nickname); + } + } + function get_profile($id) { if (is_numeric($id)) { -- cgit v1.2.3-54-g00ecf From 544a14d290cc6c08950b2d4a6faf324704e90c6c Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 10 Jul 2009 17:56:01 -0700 Subject: Move groups timeline API method into groups API action --- actions/twitapigroups.php | 114 ++++++++++++++++++++++++++++++++++++++++++++ actions/twitapistatuses.php | 58 ---------------------- lib/router.php | 7 ++- 3 files changed, 120 insertions(+), 59 deletions(-) create mode 100644 actions/twitapigroups.php (limited to 'actions') diff --git a/actions/twitapigroups.php b/actions/twitapigroups.php new file mode 100644 index 000000000..c8aae173f --- /dev/null +++ b/actions/twitapigroups.php @@ -0,0 +1,114 @@ +. + * + * @category Twitter + * @package Laconica + * @author Craig Andrews + * @author Zach Copley + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +require_once INSTALLDIR.'/lib/twitterapi.php'; + +/** + * Group-specific API methods + * + * This class handles Laconica group API methods. + * + * @category Twitter + * @package Laconica + * @author Craig Andrews + * @author Zach Copley + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + + class TwitapigroupsAction extends TwitterapiAction + { + + function timeline($args, $apidata) + { + parent::handle($args); + + common_debug("in groups api action"); + + $this->auth_user = $apidata['user']; + $group = $this->get_group($apidata['api_arg'], $apidata); + + if (empty($group)) { + $this->clientError('Not Found', 404, $apidata['content-type']); + return; + } + + $sitename = common_config('site', 'name'); + $title = sprintf(_("%s timeline"), $group->nickname); + $taguribase = common_config('integration', 'taguri'); + $id = "tag:$taguribase:GroupTimeline:".$group->id; + $link = common_local_url('showstream', + array('nickname' => $group->nickname)); + $subtitle = sprintf(_('Updates from %1$s on %2$s!'), + $group->nickname, $sitename); + + $page = (int)$this->arg('page', 1); + $count = (int)$this->arg('count', 20); + $max_id = (int)$this->arg('max_id', 0); + $since_id = (int)$this->arg('since_id', 0); + $since = $this->arg('since'); + + $notice = $group->getNotices(($page-1)*$count, + $count, $since_id, $max_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': + if (isset($apidata['api_arg'])) { + $selfuri = common_root_url() . + 'api/statuses/group_timeline/' . + $apidata['api_arg'] . '.atom'; + } else { + $selfuri = common_root_url() . + 'api/statuses/group_timeline.atom'; + } + $this->show_atom_timeline($notice, $title, $id, $link, + $subtitle, $suplink, $selfuri); + break; + case 'json': + $this->show_json_timeline($notice); + break; + default: + $this->clientError(_('API method not found!'), $code = 404); + } + } + +} \ No newline at end of file diff --git a/actions/twitapistatuses.php b/actions/twitapistatuses.php index ec5d378f0..c9943698d 100644 --- a/actions/twitapistatuses.php +++ b/actions/twitapistatuses.php @@ -136,64 +136,6 @@ class TwitapistatusesAction extends TwitterapiAction } - function group_timeline($args, $apidata) - { - parent::handle($args); - - $this->auth_user = $apidata['user']; - $group = $this->get_group($apidata['api_arg'], $apidata); - - if (empty($group)) { - $this->clientError('Not Found', 404, $apidata['content-type']); - return; - } - - $sitename = common_config('site', 'name'); - $title = sprintf(_("%s timeline"), $group->nickname); - $taguribase = common_config('integration', 'taguri'); - $id = "tag:$taguribase:GroupTimeline:".$group->id; - $link = common_local_url('showstream', - array('nickname' => $group->nickname)); - $subtitle = sprintf(_('Updates from %1$s on %2$s!'), - $group->nickname, $sitename); - - $page = (int)$this->arg('page', 1); - $count = (int)$this->arg('count', 20); - $max_id = (int)$this->arg('max_id', 0); - $since_id = (int)$this->arg('since_id', 0); - $since = $this->arg('since'); - - $notice = $group->getNotices(($page-1)*$count, - $count, $since_id, $max_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': - if (isset($apidata['api_arg'])) { - $selfuri = common_root_url() . - 'api/statuses/group_timeline/' . - $apidata['api_arg'] . '.atom'; - } else { - $selfuri = common_root_url() . - 'api/statuses/group_timeline.atom'; - } - $this->show_atom_timeline($notice, $title, $id, $link, - $subtitle, $suplink, $selfuri); - break; - case 'json': - $this->show_json_timeline($notice); - break; - default: - $this->clientError(_('API method not found!'), $code = 404); - } - } - function user_timeline($args, $apidata) { parent::handle($args); diff --git a/lib/router.php b/lib/router.php index bc063038f..cd2143d13 100644 --- a/lib/router.php +++ b/lib/router.php @@ -266,7 +266,7 @@ class Router $m->connect('api/statuses/:method/:argument', array('action' => 'api', 'apiaction' => 'statuses'), - array('method' => '(group_timeline|user_timeline|friends_timeline|replies|mentions|show|destroy|friends|followers)')); + array('method' => '(|user_timeline|friends_timeline|replies|mentions|show|destroy|friends|followers)')); // users @@ -394,6 +394,11 @@ class Router array('action' => 'api', 'apiaction' => 'laconica')); + // Groups + $m->connect('api/laconica/groups/:method/:argument', + array('action' => 'api', + 'apiaction' => 'groups')); + // search $m->connect('api/search.atom', array('action' => 'twitapisearchatom')); $m->connect('api/search.json', array('action' => 'twitapisearchjson')); -- cgit v1.2.3-54-g00ecf From c13dd856c8c11f13129a45e25356678f5ae76971 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 10 Jul 2009 18:08:10 -0700 Subject: Fix alternate link for groups API feed --- actions/twitapigroups.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'actions') diff --git a/actions/twitapigroups.php b/actions/twitapigroups.php index c8aae173f..db15b2cd3 100644 --- a/actions/twitapigroups.php +++ b/actions/twitapigroups.php @@ -69,7 +69,7 @@ require_once INSTALLDIR.'/lib/twitterapi.php'; $title = sprintf(_("%s timeline"), $group->nickname); $taguribase = common_config('integration', 'taguri'); $id = "tag:$taguribase:GroupTimeline:".$group->id; - $link = common_local_url('showstream', + $link = common_local_url('showgroup', array('nickname' => $group->nickname)); $subtitle = sprintf(_('Updates from %1$s on %2$s!'), $group->nickname, $sitename); @@ -94,11 +94,11 @@ require_once INSTALLDIR.'/lib/twitterapi.php'; case 'atom': if (isset($apidata['api_arg'])) { $selfuri = common_root_url() . - 'api/statuses/group_timeline/' . + 'api/statuses/groups/timeline/' . $apidata['api_arg'] . '.atom'; } else { $selfuri = common_root_url() . - 'api/statuses/group_timeline.atom'; + 'api/statuses/groups/timeline.atom'; } $this->show_atom_timeline($notice, $title, $id, $link, $subtitle, $suplink, $selfuri); -- cgit v1.2.3-54-g00ecf From 7308203065e595dee947702682620f64b6d8ea1f Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 10 Jul 2009 18:11:54 -0700 Subject: Update showgroup action RSS 2.0 feed link --- actions/showgroup.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'actions') diff --git a/actions/showgroup.php b/actions/showgroup.php index f803840ff..5d9ee26a2 100644 --- a/actions/showgroup.php +++ b/actions/showgroup.php @@ -324,8 +324,8 @@ class ShowgroupAction extends GroupDesignAction $this->group->nickname)), new Feed(Feed::RSS2, common_local_url('api', - array('apiaction' => 'statuses', - 'method' => 'group_timeline', + array('apiaction' => 'groups', + 'method' => 'timeline', 'argument' => $this->group->nickname.'.rss')), sprintf(_('Notice feed for %s group (RSS 2.0)'), $this->group->nickname)), -- cgit v1.2.3-54-g00ecf From 6b0468358bd1148adfcf11a18cbb19ab4e80a799 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 10 Jul 2009 18:15:18 -0700 Subject: Group timeline API method doesn't require auth --- actions/api.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'actions') diff --git a/actions/api.php b/actions/api.php index 18c3b68d4..4a00b77e8 100644 --- a/actions/api.php +++ b/actions/api.php @@ -127,7 +127,8 @@ class ApiAction extends Action 'help/downtime_schedule', 'laconica/version', 'laconica/config', - 'laconica/wadl'); + 'laconica/wadl', + 'groups/timeline'); static $bareauth = array('statuses/user_timeline', 'statuses/friends_timeline', -- cgit v1.2.3-54-g00ecf From 7621e0e38467349a89f71e814941932fbacecfa1 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 10 Jul 2009 20:13:12 -0700 Subject: Fix link for atom feed in showgroup action --- actions/showgroup.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'actions') diff --git a/actions/showgroup.php b/actions/showgroup.php index 5d9ee26a2..32ec674a9 100644 --- a/actions/showgroup.php +++ b/actions/showgroup.php @@ -331,8 +331,8 @@ class ShowgroupAction extends GroupDesignAction $this->group->nickname)), new Feed(Feed::ATOM, common_local_url('api', - array('apiaction' => 'statuses', - 'method' => 'group_timeline', + array('apiaction' => 'groups', + 'method' => 'timeline', 'argument' => $this->group->nickname.'.atom')), sprintf(_('Notice feed for %s group (Atom)'), $this->group->nickname))); -- cgit v1.2.3-54-g00ecf