From 0e49b3525d81a62a21e94e656c0ee5f2d38409eb Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 1 Feb 2010 20:31:56 +0100 Subject: [PATCH 01/20] Sentence case for app statistics --- actions/showapplication.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/showapplication.php b/actions/showapplication.php index a6ff425c7c..090e11882e 100644 --- a/actions/showapplication.php +++ b/actions/showapplication.php @@ -201,7 +201,7 @@ class ShowApplicationAction extends OwnerDesignAction $userCnt = $appUsers->count(); $this->raw(sprintf( - _('created by %1$s - %2$s access by default - %3$d users'), + _('Created by %1$s - %2$s access by default - %3$d users'), $profile->getBestName(), $defaultAccess, $userCnt From d40e72becaa7b0b1a51de8edb634d2ed5a953875 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 1 Feb 2010 20:32:18 +0100 Subject: [PATCH 02/20] Prevents app statistic text from wrapping around avatar --- theme/base/css/display.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 0d6395d057..2240e42afc 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -632,7 +632,8 @@ margin-bottom:18px; .entity_profile .entity_url, .entity_profile .entity_note, .entity_profile .entity_tags, -.entity_profile .entity_aliases { +.entity_profile .entity_aliases, +.entity_profile .entity_statistics { margin-left:113px; margin-bottom:4px; } From 803c6d954c92582520bed4ff4397f53b581fdc34 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 1 Feb 2010 23:10:44 +0000 Subject: [PATCH 03/20] Revert "Removed hAtom pattern from registration page." This reverts commit d6fe865133511ac64565a583106b3233b70a0b1e. Screws up list rendering when registration is complete. --- actions/register.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/actions/register.php b/actions/register.php index 063bbe2cc6..6981373467 100644 --- a/actions/register.php +++ b/actions/register.php @@ -303,6 +303,27 @@ class RegisterAction extends Action return ($user !== false); } + // overrrided to add entry-title class + function showPageTitle() { + if (Event::handle('StartShowPageTitle', array($this))) { + $this->element('h1', array('class' => 'entry-title'), $this->title()); + } + } + + // overrided to add hentry, and content-inner class + function showContentBlock() + { + $this->elementStart('div', array('id' => 'content', 'class' => 'hentry')); + $this->showPageTitle(); + $this->showPageNoticeBlock(); + $this->elementStart('div', array('id' => 'content_inner', + 'class' => 'entry-content')); + // show the actual content (forms, lists, whatever) + $this->showContent(); + $this->elementEnd('div'); + $this->elementEnd('div'); + } + /** * Instructions or a notice for the page * From dabfe19098e6d2d5d12ba4a980bc42f40d365a97 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 1 Feb 2010 23:17:12 +0000 Subject: [PATCH 04/20] Fixed margin-left on lists inside .hentry and .form_settings --- theme/base/css/display.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 2240e42afc..b5cfab7e9c 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -1412,6 +1412,9 @@ margin-bottom:18px; .hentry .entry-content li li { margin-left:18px; } +.hentry .entry-content .form_settings ul { +margin-left:0; +} #content #plugin_authors { min-width:122px; From df2a08126510445f93eddbebc0551ee44c945fd5 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 1 Feb 2010 20:58:29 +0000 Subject: [PATCH 05/20] OAuth app names should be unique. --- actions/editapplication.php | 24 ++++++++++++++++++++++++ actions/newapplication.php | 20 ++++++++++++++++++++ classes/statusnet.ini | 3 ++- db/statusnet.sql | 2 +- 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/actions/editapplication.php b/actions/editapplication.php index 9cc3e3cead..029b622e84 100644 --- a/actions/editapplication.php +++ b/actions/editapplication.php @@ -179,6 +179,9 @@ class EditApplicationAction extends OwnerDesignAction } elseif (mb_strlen($name) > 255) { $this->showForm(_('Name is too long (max 255 chars).')); return; + } else if ($this->nameExists($name)) { + $this->showForm(_('Name already in use. Try another one.')); + return; } elseif (empty($description)) { $this->showForm(_('Description is required.')); return; @@ -260,5 +263,26 @@ class EditApplicationAction extends OwnerDesignAction common_redirect(common_local_url('oauthappssettings'), 303); } + /** + * Does the app name already exist? + * + * Checks the DB to see someone has already registered and app + * with the same name. + * + * @param string $name app name to check + * + * @return boolean true if the name already exists + */ + + function nameExists($name) + { + $newapp = Oauth_application::staticGet('name', $name); + if (!$newapp) { + return false; + } else { + return $newapp->id != $this->app->id; + } + } + } diff --git a/actions/newapplication.php b/actions/newapplication.php index c499fe7c76..ba1cca5c92 100644 --- a/actions/newapplication.php +++ b/actions/newapplication.php @@ -158,6 +158,9 @@ class NewApplicationAction extends OwnerDesignAction if (empty($name)) { $this->showForm(_('Name is required.')); return; + } else if ($this->nameExists($name)) { + $this->showForm(_('Name already in use. Try another one.')); + return; } elseif (mb_strlen($name) > 255) { $this->showForm(_('Name is too long (max 255 chars).')); return; @@ -273,5 +276,22 @@ class NewApplicationAction extends OwnerDesignAction } + /** + * Does the app name already exist? + * + * Checks the DB to see someone has already registered and app + * with the same name. + * + * @param string $name app name to check + * + * @return boolean true if the name already exists + */ + + function nameExists($name) + { + $app = Oauth_application::staticGet('name', $name); + return ($app !== false); + } + } diff --git a/classes/statusnet.ini b/classes/statusnet.ini index 6203650a69..4ace4407b1 100644 --- a/classes/statusnet.ini +++ b/classes/statusnet.ini @@ -353,7 +353,7 @@ notice_id = K id = 129 owner = 129 consumer_key = 130 -name = 130 +name = 2 description = 2 icon = 130 source_url = 2 @@ -367,6 +367,7 @@ modified = 384 [oauth_application__keys] id = N +name = U [oauth_application_user] profile_id = 129 diff --git a/db/statusnet.sql b/db/statusnet.sql index 17de4fd0d4..71a6e724ca 100644 --- a/db/statusnet.sql +++ b/db/statusnet.sql @@ -214,7 +214,7 @@ create table oauth_application ( id integer auto_increment primary key comment 'unique identifier', owner integer not null comment 'owner of the application' references profile (id), consumer_key varchar(255) not null comment 'application consumer key' references consumer (consumer_key), - name varchar(255) not null comment 'name of the application', + name varchar(255) unique key comment 'name of the application', description varchar(255) comment 'description of the application', icon varchar(255) not null comment 'application icon', source_url varchar(255) comment 'application homepage - used for source link', From f0875ceea1bd6940bb30deab0f6a0f38a752a2c6 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 2 Feb 2010 06:26:03 +0000 Subject: [PATCH 06/20] Allow developers to delete OAuth applications --- actions/deleteapplication.php | 176 ++++++++++++++++++++++++++++++++++ actions/showapplication.php | 19 +++- classes/Consumer.php | 30 ++++++ classes/Oauth_application.php | 17 ++++ lib/router.php | 4 + 5 files changed, 244 insertions(+), 2 deletions(-) create mode 100644 actions/deleteapplication.php diff --git a/actions/deleteapplication.php b/actions/deleteapplication.php new file mode 100644 index 0000000000..17526e1118 --- /dev/null +++ b/actions/deleteapplication.php @@ -0,0 +1,176 @@ +. + * + * @category Action + * @package StatusNet + * @author Zach Copley + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +/** + * Delete an OAuth appliction + * + * @category Action + * @package StatusNet + * @author Zach Copley + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + */ + +class DeleteapplicationAction extends Action +{ + var $app = null; + + /** + * Take arguments for running + * + * @param array $args $_REQUEST args + * + * @return boolean success flag + */ + + function prepare($args) + { + if (!parent::prepare($args)) { + return false; + } + + if (!common_logged_in()) { + $this->clientError(_('You must be logged in to delete an application.')); + return false; + } + + $id = (int)$this->arg('id'); + $this->app = Oauth_application::staticGet('id', $id); + + if (empty($this->app)) { + $this->clientError(_('Application not found.')); + return false; + } + + $cur = common_current_user(); + + if ($cur->id != $this->app->owner) { + $this->clientError(_('You are not the owner of this application.'), 401); + return false; + } + + return true; + } + + /** + * Handle request + * + * Shows a page with list of favorite notices + * + * @param array $args $_REQUEST args; handled in prepare() + * + * @return void + */ + + function handle($args) + { + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + + // CSRF protection + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->clientError(_('There was a problem with your session token.')); + return; + } + + if ($this->arg('no')) { + common_redirect(common_local_url('showapplication', + array('id' => $this->app->id)), 303); + } elseif ($this->arg('yes')) { + $this->handlePost(); + common_redirect(common_local_url('oauthappssettings'), 303); + } else { + $this->showPage(); + } + } + } + + function showContent() { + $this->areYouSureForm(); + } + + function title() { + return _('Delete application'); + } + + function showNoticeForm() { + // nop + } + + /** + * Confirm with user. + * + * Shows a confirmation form. + * + * @return void + */ + function areYouSureForm() + { + $id = $this->app->id; + $this->elementStart('form', array('id' => 'deleteapplication-' . $id, + 'method' => 'post', + 'class' => 'form_settings form_entity_block', + 'action' => common_local_url('deleteapplication', + array('id' => $this->app->id)))); + $this->elementStart('fieldset'); + $this->hidden('token', common_session_token()); + $this->element('legend', _('Delete application')); + $this->element('p', null, + _('Are you sure you want to delete this application? '. + 'This will clear all data about the application from the '. + 'database, including all existing user connections.')); + $this->submit('form_action-no', + _('No'), + 'submit form_action-primary', + 'no', + _("Do not delete this application")); + $this->submit('form_action-yes', + _('Yes'), + 'submit form_action-secondary', + 'yes', _('Delete this application')); + $this->elementEnd('fieldset'); + $this->elementEnd('form'); + } + + /** + * Actually delete the app + * + * @return void + */ + + function handlePost() + { + $this->app->delete(); + } +} + diff --git a/actions/showapplication.php b/actions/showapplication.php index 090e11882e..020d62480a 100644 --- a/actions/showapplication.php +++ b/actions/showapplication.php @@ -222,18 +222,33 @@ class ShowApplicationAction extends OwnerDesignAction $this->elementStart('li', 'entity_reset_keysecret'); $this->elementStart('form', array( - 'id' => 'forma_reset_key', + 'id' => 'form_reset_key', 'class' => 'form_reset_key', 'method' => 'POST', 'action' => common_local_url('showapplication', array('id' => $this->application->id)))); - $this->elementStart('fieldset'); $this->hidden('token', common_session_token()); $this->submit('reset', _('Reset key & secret')); $this->elementEnd('fieldset'); $this->elementEnd('form'); $this->elementEnd('li'); + + $this->elementStart('li', 'entity_delete'); + $this->elementStart('form', array( + 'id' => 'form_delete_application', + 'class' => 'form_delete_application', + 'method' => 'POST', + 'action' => common_local_url('deleteapplication', + array('id' => $this->application->id)))); + + $this->elementStart('fieldset'); + $this->hidden('token', common_session_token()); + $this->submit('delete', _('Delete')); + $this->elementEnd('fieldset'); + $this->elementEnd('form'); + $this->elementEnd('li'); + $this->elementEnd('ul'); $this->elementEnd('div'); diff --git a/classes/Consumer.php b/classes/Consumer.php index ad64a8491b..ce399f2783 100644 --- a/classes/Consumer.php +++ b/classes/Consumer.php @@ -36,4 +36,34 @@ class Consumer extends Memcached_DataObject return $cons; } + /** + * Delete a Consumer and related tokens and nonces + * + * XXX: Should this happen in an OAuthDataStore instead? + * + */ + function delete() + { + // XXX: Is there any reason NOT to do this kind of cleanup? + + $this->_deleteTokens(); + $this->_deleteNonces(); + + parent::delete(); + } + + function _deleteTokens() + { + $token = new Token(); + $token->consumer_key = $this->consumer_key; + $token->delete(); + } + + function _deleteNonces() + { + $nonce = new Nonce(); + $nonce->consumer_key = $this->consumer_key; + $nonce->delete(); + } + } diff --git a/classes/Oauth_application.php b/classes/Oauth_application.php index a6b5390872..748b642200 100644 --- a/classes/Oauth_application.php +++ b/classes/Oauth_application.php @@ -137,4 +137,21 @@ class Oauth_application extends Memcached_DataObject } } + function delete() + { + $this->_deleteAppUsers(); + + $consumer = $this->getConsumer(); + $consumer->delete(); + + parent::delete(); + } + + function _deleteAppUsers() + { + $oauser = new Oauth_application_user(); + $oauser->application_id = $this->id; + $oauser->delete(); + } + } diff --git a/lib/router.php b/lib/router.php index b046b240c9..987d0152e4 100644 --- a/lib/router.php +++ b/lib/router.php @@ -152,6 +152,10 @@ class Router array('action' => 'editapplication'), array('id' => '[0-9]+') ); + $m->connect('settings/oauthapps/delete/:id', + array('action' => 'deleteapplication'), + array('id' => '[0-9]+') + ); // search From 819127307896c3aee43f0f009f6ff636eb227b4c Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 2 Feb 2010 07:35:54 +0000 Subject: [PATCH 07/20] Better token revocation --- actions/apioauthauthorize.php | 22 ++++++---------------- actions/oauthconnectionssettings.php | 24 +++++++++++++++--------- db/statusnet.sql | 2 +- lib/apioauthstore.php | 27 +++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 26 deletions(-) diff --git a/actions/apioauthauthorize.php b/actions/apioauthauthorize.php index 15c3a9dad5..05d925d261 100644 --- a/actions/apioauthauthorize.php +++ b/actions/apioauthauthorize.php @@ -99,24 +99,17 @@ class ApiOauthAuthorizeAction extends ApiOauthAction } else { - // XXX: make better error messages - if (empty($this->oauth_token)) { - - common_debug("No request token found."); - - $this->clientError(_('Bad request.')); + $this->clientError(_('No oauth_token parameter provided.')); return; } if (empty($this->app)) { - common_debug('No app for that token.'); - $this->clientError(_('Bad request.')); + $this->clientError(_('Invalid token.')); return; } $name = $this->app->name; - common_debug("Requesting auth for app: " . $name); $this->showForm(); } @@ -124,8 +117,6 @@ class ApiOauthAuthorizeAction extends ApiOauthAction function handlePost() { - common_debug("handlePost()"); - // check session token for CSRF protection. $token = $this->trimmed('token'); @@ -210,13 +201,9 @@ class ApiOauthAuthorizeAction extends ApiOauthAction if (!empty($this->callback)) { - // XXX: Need better way to build this redirect url. - $target_url = $this->getCallback($this->callback, array('oauth_token' => $this->oauth_token)); - common_debug("Doing callback to $target_url"); - common_redirect($target_url, 303); } else { common_debug("callback was empty!"); @@ -236,9 +223,12 @@ class ApiOauthAuthorizeAction extends ApiOauthAction } else if ($this->arg('deny')) { + $datastore = new ApiStatusNetOAuthDataStore(); + $datastore->revoke_token($this->oauth_token, 0); + $this->elementStart('p'); - $this->raw(sprintf(_("The request token %s has been denied."), + $this->raw(sprintf(_("The request token %s has been denied and revoked."), $this->oauth_token)); $this->elementEnd('p'); diff --git a/actions/oauthconnectionssettings.php b/actions/oauthconnectionssettings.php index c2e8d441b0..b1467f0d04 100644 --- a/actions/oauthconnectionssettings.php +++ b/actions/oauthconnectionssettings.php @@ -33,6 +33,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { require_once INSTALLDIR . '/lib/connectsettingsaction.php'; require_once INSTALLDIR . '/lib/applicationlist.php'; +require_once INSTALLDIR . '/lib/apioauthstore.php'; /** * Show connected OAuth applications @@ -71,11 +72,6 @@ class OauthconnectionssettingsAction extends ConnectSettingsAction return _('Connected applications'); } - function isReadOnly($args) - { - return true; - } - /** * Instructions for use * @@ -153,6 +149,13 @@ class OauthconnectionssettingsAction extends ConnectSettingsAction } } + /** + * Revoke access to an authorized OAuth application + * + * @param int $appId the ID of the application + * + */ + function revokeAccess($appId) { $cur = common_current_user(); @@ -164,6 +167,8 @@ class OauthconnectionssettingsAction extends ConnectSettingsAction return false; } + // XXX: Transaction here? + $appUser = Oauth_application_user::getByKeys($cur, $app); if (empty($appUser)) { @@ -171,12 +176,13 @@ class OauthconnectionssettingsAction extends ConnectSettingsAction return false; } - $orig = clone($appUser); - $appUser->access_type = 0; // No access - $result = $appUser->update(); + $datastore = new ApiStatusNetOAuthDataStore(); + $datastore->revoke_token($appUser->token, 1); + + $result = $appUser->delete(); if (!$result) { - common_log_db_error($orig, 'UPDATE', __FILE__); + common_log_db_error($orig, 'DELETE', __FILE__); $this->clientError(_('Unable to revoke access for app: ' . $app->id)); return false; } diff --git a/db/statusnet.sql b/db/statusnet.sql index 71a6e724ca..8946f4d7e2 100644 --- a/db/statusnet.sql +++ b/db/statusnet.sql @@ -230,7 +230,7 @@ create table oauth_application ( create table oauth_application_user ( profile_id integer not null comment 'user of the application' references profile (id), application_id integer not null comment 'id of the application' references oauth_application (id), - access_type tinyint default 0 comment 'access type, bit 1 = read, bit 2 = write, bit 3 = revoked', + access_type tinyint default 0 comment 'access type, bit 1 = read, bit 2 = write', token varchar(255) comment 'request or access token', created datetime not null comment 'date this record was created', modified timestamp comment 'date this record was modified', diff --git a/lib/apioauthstore.php b/lib/apioauthstore.php index 32110d0575..1bb11cbca5 100644 --- a/lib/apioauthstore.php +++ b/lib/apioauthstore.php @@ -159,5 +159,32 @@ class ApiStatusNetOAuthDataStore extends StatusNetOAuthDataStore } } + /** + * Revoke specified access token + * + * Revokes the token specified by $token_key. + * Throws exceptions in case of error. + * + * @param string $token_key the token to be revoked + * @param int $type type of token (0 = req, 1 = access) + * + * @access public + * + * @return void + */ + + public function revoke_token($token_key, $type = 0) { + $rt = new Token(); + $rt->tok = $token_key; + $rt->type = $type; + $rt->state = 0; + if (!$rt->find(true)) { + throw new Exception('Tried to revoke unknown token'); + } + if (!$rt->delete()) { + throw new Exception('Failed to delete revoked token'); + } + } + } From 3906713b2aec17d889d79dcf526ae05e284b5b33 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 2 Feb 2010 07:59:28 +0000 Subject: [PATCH 08/20] Suppress notice input box on OAuth authorization page --- actions/apioauthauthorize.php | 36 +++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/actions/apioauthauthorize.php b/actions/apioauthauthorize.php index 05d925d261..2caa8d20b3 100644 --- a/actions/apioauthauthorize.php +++ b/actions/apioauthauthorize.php @@ -67,8 +67,6 @@ class ApiOauthAuthorizeAction extends ApiOauthAction { parent::prepare($args); - common_debug("apioauthauthorize"); - $this->nickname = $this->trimmed('nickname'); $this->password = $this->arg('password'); $this->oauth_token = $this->arg('oauth_token'); @@ -193,8 +191,6 @@ class ApiOauthAuthorizeAction extends ApiOauthAction // A callback specified in the app setup overrides whatever // is passed in with the request. - common_debug("Req token is authorized - doing callback"); - if (!empty($this->app->callback_url)) { $this->callback = $this->app->callback_url; } @@ -295,12 +291,15 @@ class ApiOauthAuthorizeAction extends ApiOauthAction $msg = _('The application %1$s by ' . '%2$s would like the ability ' . - 'to %3$s your account data.'); + 'to %3$s your %4$s account data. ' . + 'You should only give access to your %4$s account ' . + 'to third parties you trust.'); $this->raw(sprintf($msg, $this->app->name, $this->app->organization, - $access)); + $access, + common_config('site', 'name'))); $this->elementEnd('p'); $this->elementEnd('li'); $this->elementEnd('ul'); @@ -362,6 +361,31 @@ class ApiOauthAuthorizeAction extends ApiOauthAction function showLocalNav() { + // NOP + } + + /** + * Show site notice. + * + * @return nothing + */ + + function showSiteNotice() + { + // NOP + } + + /** + * Show notice form. + * + * Show the form for posting a new notice + * + * @return nothing + */ + + function showNoticeForm() + { + // NOP } } From dae28d98d1958b1d7ba6572f72efc3e6cdbff276 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 2 Feb 2010 08:47:14 +0000 Subject: [PATCH 09/20] Linkify notice source when posting from registered OAuth apps --- lib/api.php | 19 ++++++++++++++++++- lib/noticelist.php | 20 ++++++++++++++++++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/lib/api.php b/lib/api.php index 10a2fae28c..f819752167 100644 --- a/lib/api.php +++ b/lib/api.php @@ -1249,10 +1249,27 @@ class ApiAction extends Action case 'api': break; default: + + $name = null; + $url = null; + $ns = Notice_source::staticGet($source); + if ($ns) { - $source_name = '' . $ns->name . ''; + $name = $ns->name; + $url = $ns->url; + } else { + $app = Oauth_application::staticGet('name', $source); + if ($app) { + $name = $app->name; + $url = $app->source_url; + } } + + if (!empty($name) && !empty($url)) { + $source_name = '' . $name . ''; + } + break; } return $source_name; diff --git a/lib/noticelist.php b/lib/noticelist.php index 85c169716a..a4a0f2651a 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -486,12 +486,28 @@ class NoticeListItem extends Widget $this->out->element('span', 'device', $source_name); break; default: + + $name = null; + $url = null; + $ns = Notice_source::staticGet($this->notice->source); + if ($ns) { + $name = $ns->name; + $url = $ns->url; + } else { + $app = Oauth_application::staticGet('name', $this->notice->source); + if ($app) { + $name = $app->name; + $url = $app->source_url; + } + } + + if (!empty($name) && !empty($url)) { $this->out->elementStart('span', 'device'); - $this->out->element('a', array('href' => $ns->url, + $this->out->element('a', array('href' => $url, 'rel' => 'external'), - $ns->name); + $name); $this->out->elementEnd('span'); } else { $this->out->element('span', 'device', $source_name); From cc256aaa67a2fe009f818874a79901d921085905 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 2 Feb 2010 13:12:03 +0100 Subject: [PATCH 10/20] Updated StatusNet logos --- theme/base/logo.png | Bin 4988 -> 10107 bytes theme/default/css/display.css | 2 +- theme/default/logo.png | Bin 6389 -> 10107 bytes theme/default/mobilelogo.png | Bin 2238 -> 4017 bytes theme/identica/mobilelogo.png | Bin 2238 -> 4017 bytes 5 files changed, 1 insertion(+), 1 deletion(-) diff --git a/theme/base/logo.png b/theme/base/logo.png index 7c68b34f61008753d12394806c3cf46f7b04effd..cf1839194a6d8e91d3ec988abe7d5be227143d28 100644 GIT binary patch literal 10107 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
    * zz)8~hd?6of{CPCgH3vLB`GHty?)Rgip0lX7@iqY8IjIRo-2MQ7PXVaQNI4e)*y*Zk z{IQhs5P-8|y*;-9Sj!472XIL~-(yCsux-U(+H1G$0sxh0awgRChZ8QGyQZ-YfPo{A zhh<;S!{@Usq84{7vHw)Qw{+AteC8O>lNRi11J4wmsYL;>XNmm_?yynfJJ0Q`4GbU0 z`L^do-;IGa0FuXeT-U0G2FE;a`F9Jh#n-qPznPj>SH~?pJL(!60gN9*IcGB>^xU!4 z^%Y1DQ7uyUjX!#`z$bg{mg`);z~dPWWU)e}9KOJJmvZMtn;JF%=v?f${6TA=Mac{n zFFIK2s11DD>1*7P`5bfCH7pSH92>U=oW8~o77m(5QFVcBkxE|-h_g;#V-V?KBnI$& zM(NI@2Mt#^e1TsANG(xb-Q^4Xz+GQoGQW)WOt`h{_wFEFbj|n`-C<=N(@?tPGL_=L=4qxL87`s`er{*i=i=D$&+jt?9 zY+!;}uozHu?8qbng{E4E@Qwqh%` dVt;h@{{aI2UN-lbZ!iD=002ovPDHLkV1o7ph)@6k literal 4988 zcmV-?6NBuDP)Px|Hc3Q5RCwC$oq2o|Rkp{!x4W}L5<`$3kq~eY0bx``WDyV{Ac}z7_y!ea=FL+9 zmj}LizNj-SBj7SV9dJR>LB&zT1Y|%75M+@>0YOAr5?K;3kdTnItM2?!6-k=zs!G#I zDw+CyKK1z|)%V`Ib?aB>o^$TGrv!}%G~PPKfgqXM3~ zKV|*G#y*`iNJ1=JKCq=%m9HV>$U44srWESL2U9lecL-qd(To_nn!+7 zHYW@Aaq7$gsG+_nkrN7{bHk+Mp2nhV+FnAuzP$e=DfwGX>O_Ra(z)Gml3EWTF|MWFU(=%uNlx|I?<7dA-TRP z6?Px|fbHMEfhxULs^kmd={YfFO_pP2)B?QW>P%~75cEo(z)e>_7cw#cxP+S?Np~@_ z?_Y_ENU%~RUd6k>kr1_j`OEuVgVZPaFvm%1%k~Co6sHd-=n)P6mM3=++FsdM=US@#d<85OY&A26`Mqgi1Q34eSSE zh*`PL?MBeG!HlmCOJ(XGr>n=2PAAK23=(tbClA z&!J^P585`ry59Qec7@X``CfD7Qk8c(gt$y5 z04!ND&J7GSDia;ij5hTs9nR@F9y+xiYG!|SS-5;)ONS6a;&e=IS0K))O#2pnaS69A z`g>`s0j6cVs?yIPM6lBZ{K~9M>%`u+8MtP#$%K1ijI9lqxXd9$u!NAZi&>e3rb#x^ zcU&}!OExZ~%FYfUf>$V;nff1M+SqFF;$n=KT7*lqcL)(Aq$JAd_b^Y4ZS;pqM1;kf zNIfDQLIlkSni&1;afjP(@WMP%CbvYiLx|v&$_Qf#V!sVk72Xmvl6xIO1S=q1oHY8q zw7dXCt+3VLl~oj&Y03o-A%dPUIBHg=s3g}`gI93&i19rMSH44tV5baKm=fY-{$Bg2 zJW}OU;X#v9>VAh1!4kr4K6p8&cG_m(P8A-Yto)4e;7YOAAw-ZUrpY$IP)p0s-GnOb zu_xwmPNumOQRLSRjS#kqseCQ1{}%{uFe)>o_p@|p*}vYWiw`pHIH%J{Q1%v}e3Os* zLm|r15;$EhWvL>7v%t>+4ocXrLPjBco(ko5B!tIi^jrhRgvdUzson{3@OTDACAr8# zFBNG=saTzZJXsd#Ws3n~BwPXva=~M9kpDcq4ZJi34%+Dv*eV`Eku1SvKi$RgUF)@v zs`RpB-$Kei`ibKEwotw}%O4rc5Dz>8eD?y(nGH>yDI?Idk$(MZqafQmZdgK-sQTOd zy=m=SwmtYX$`6I1Z1#YFyC=hzP&S&n^y~PDup$xTDlC3@#E7znNr<%T$0Eds{(ehn z+L1B+7uH+f_O4pYs@r}GMc&$YGfRO9li`D4+nBdC~ytuB##&P5#$!B z%7xQMUAtZgAsYlCUj1xf2alp2^7mVhq`SH5vIpy>UxzaP$*03cB1>x38?ES)qDG`h z&B%z1ERK9yO7RC>XEEirkW893s?P>n>kt58suFOzXxsd%dg;^gJzGh;d30@)0l+O` z(TiX?(rU(v&0QnTMs1f`?u;0V)w)W-x>?IN&6ZLMTN6UX<##JqxF?1d30Ks4e@^Co z&qrg1q2`y>)g{AK_~2zQjSrczd`oAc@&yo#rtOkaJTY_mmRGBi!d7PI{B6C%M2_?; zA=)&*3YVzM?n?G%EhF=($MNnzZMjxl$Brb89?eBvx)7O=KzUIS`TO^iwQ3b7cI>d) zOzR4m0|bospS^5DQ&q}Uzy$^J3YauAee-@`p6zsqH_`_TQju%?{ibc|t(&BCxu*|?Dn)24AWGt&|yRk-p|@awOinZEh| zf&UDVN?RsW(R

    SMRZvgiw(wfq2}mc^~7^lPWoRszU(w|PVLgpr603IhU9VM7`A8;o=D>WsaAdaGBzWFjeqx{NNsLP-F|G@-F>ML=#2|z~QOYSQJ;9l?N60TIdW z)FH>rUa`5YZ3rgt0?5B6Pq}klgW{jU*T1ZZ?xcSHU($1IdJTY zn%RH5^N|I{0XcC=Neq4SP0M7citA>~;K=&*9N)OnP{CASH1K+LX(+}Uv$>ez6H+8b&seEl7+j4Dc zD&b9o^g0W{fO+$HzfT{tl0&N!V#bQ~&4nrh?ng+7iDcYWU2waq8<4#&X+c488Cwnp zmU=?c&o+dR$do|uS;p7T)OmlD{l>28$bljn?}RA ztY^|?=oBgU298cYQ&NtiszzeE&=!PH;X)Hdl|YCy$*RW91+6>yAR^v8Z&gGU2~k>l zHVgcR_lJAjT-GXZ#=I>DkC|QSTYI>!1vds!D^DQaLdaVRiz}Kbk}kkp;8+NHlqcN6 zP;)KK%L~b^msn^=aPF%jz9~NdkEN#aMC)Jo?;`|5kz5b-#C%;K zAJ`2t(zHzQjv#&)`2RV+P5zx_y6-w)4*XR0)Bate@@%f3xVH_(c2E?u#tW2wSLb#-2GF^y0AU^?h>BN)`JIs=dYv0IPzY*AY z&c`t@5tQ~Ww}=;tj8%nD!BvbZ3#1T-CXHJAvu``k!#*QIWUpRLMNtu9O)fz7k&?qJ zSDKYNG6{Zhh`5EAE-f`JIeNM#K|J!UspI>W)H@-hlsAg=R0_5TDL(Ncm;P?lx*sZk zcp%7Y=nwqo8dlqZL42pTq=elI7SL=%sNmp17F~Y1 zRWe8y`~|f23k0_d*dY;1ByxsCOc1EodBT(y(?|Acicp6O_{KuJMIc|6uJS8<$>2x` zD|!w*E#N7u<=x@ov>!5r5lfa37E?XMann;zvE|ukt&;KGsc;WKYDR`9b3;JPc(5ZUbth^nUlwJM4M$&2!VrrcIW}0F*0mSACGd zA%sOthVOw}fa03e%XsJ^^7ib}2=eZ`*0g?@^r-foF&skJ7*k*^+9I4~2bZ_FnC0Wf zQI?<2{v}JyikAT6r@&kFd7q9BQA0cr9f6O~)<`U&S+{QFefzCZk%Pc*rog89zCVW$ zL0~?FmB3`FSsxb?$KeHDh=%{0RKw}WA%qR_99$d*4@&qQ&?bn%UpyJ^w$nX1ga`pr z!4n5pNw`VCAF!|uPxmzpp9(7-LNsE`g%K`Dw=lLR3ZP9Y_DXK*SQ#P4qp(7oO-!Z3 z`*tIPLx@^J0sIf}rAe{B+p+J?lu=7~5!$O-kc~fm;`=FJ%a5x#5~7yy2xJSGfS+h^ z0gLV0Z-)@Ih{=#HwLA~i)CURgI)wN)MU19TRP{h^wp(sWhY)p$Nl>A{oxmyGx_H;l z{SB2;`2tk?MAA}h=5VQR%!5$^{-Hpd$7&t{UZ+R|K1R#QyblN_%sXFKo+^)NjqG_w zqixAA0Dc03%HA>;Ml^(*{n+PWmH}NHLR7p`JWm&A$I9XUghz=NqK)`bfmEk&P`}*@s*-5JqYWgp-mZCKK)HM zDc=Lgt5SYD*0aVoD0p;hpexWHI1YSHsBt6@b43xt-&i~?WE4@FJSVi@)`^&1_Z=fVfoNlghc$KqfHBE&_y^G*0@Q!n;ywIVZ4#oj0VAyvVnz+>54S*w zlO}Dv-zVc{kfe`(I9PcMAj)CfDD(|FElUC}N0yX{?l~wcdTF%cU zu??82zjapN>)9&@{tUeAr>qsnSRzn}mJ$9@KU%-Py_hfP57&3I>puN_<&jg1dfT;r z#^D9dkDwC3^?qCgZl80T^(o{>pYsuZoQ{^Q3^PRdIX3~=gSMl|%7-ALeExqO_@n-J zSE{G)vAWmcZQxb??|#6oLEKwi!&f(008G*UF4dL%Bf4VvoljYR<8q5`0d4c6l*iT< zA^f2-qgAl^`GR7w4~nY%U1Bouc12Z-U}BKwFrkua_4yXvuOGFAXdKiSPJoO9+enDb z1`e3b&ZDsxA)+mK;VPBHxFE0nO%?OBFL0^ur^un~T|pGbVMahUwo4 zbU;hboTDr2W{E@Mb*m}9HVF~t$29WA-_YF6R==$3+s3`X0bMD52B@0C?RkAL8xne= zEu*`u=tv5hd$}rna}57pe-WaA|Mk&*CZc&QsbYor;w}BUQ)`nDzVMgaV4!{g>_>CQ z8X*(t?PFyG+VZxk0ZNCVetZP}Lgsb>qpJKL1H2fZP2X>U@Agw>w0?k=?>qTIZo;Zk zxewT2@cUmeUoxL%(KPxJEv&Dh!QV9JFEjs3Sj!)^*w2f&4%ll@XKr0u8TaCU6>Te; zbLfBtdwH-w?lk z3p5X3S3m45@>9MA@VG7>C0a1epLC_>CbabifUgLgL^A>{NyZpmk*v@~;d{Vm29l-; zaF-v&^eg@E8_<0Hl_(-`{K8#S_xfdHyltQ-aJA35PyI+dk51@BG_T=dgEnJz9U%p{ z1Z|=2Yh7nBOFGsXZB66`ef&PtC2$cil5<)7H<(D2^YAatj^1`Jt + * @author Sarven Capadisli * @copyright 2009 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ diff --git a/theme/default/logo.png b/theme/default/logo.png index 550d373fef4005342c4e1daa7cb2c115db54f46c..cf1839194a6d8e91d3ec988abe7d5be227143d28 100644 GIT binary patch literal 10107 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

      * zz)8~hd?6of{CPCgH3vLB`GHty?)Rgip0lX7@iqY8IjIRo-2MQ7PXVaQNI4e)*y*Zk z{IQhs5P-8|y*;-9Sj!472XIL~-(yCsux-U(+H1G$0sxh0awgRChZ8QGyQZ-YfPo{A zhh<;S!{@Usq84{7vHw)Qw{+AteC8O>lNRi11J4wmsYL;>XNmm_?yynfJJ0Q`4GbU0 z`L^do-;IGa0FuXeT-U0G2FE;a`F9Jh#n-qPznPj>SH~?pJL(!60gN9*IcGB>^xU!4 z^%Y1DQ7uyUjX!#`z$bg{mg`);z~dPWWU)e}9KOJJmvZMtn;JF%=v?f${6TA=Mac{n zFFIK2s11DD>1*7P`5bfCH7pSH92>U=oW8~o77m(5QFVcBkxE|-h_g;#V-V?KBnI$& zM(NI@2Mt#^e1TsANG(xb-Q^4Xz+GQoGQW)WOt`h{_wFEFbj|n`-C<=N(@?tPGL_=L=4qxL87`s`er{*i=i=D$&+jt?9 zY+!;}uozHu?8qbng{E4E@Qwqh%` dVt;h@{{aI2UN-lbZ!iD=002ovPDHLkV1o7ph)@6k literal 6389 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 N002ovPDHLkV1hV-vbO*L delta 2214 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 N002ovPDHLkV1hV-vbO*L delta 2214 zcmV;X2wC^BAHETgFn5Xzd7eS&-32j@4yAQAb%I+BQ5$*7p$(D;R(AO zvoD!cCYWGm1waa@N7^UsuVy@LsAgWp=G6ZLfyXzLMGZ<#_Ct&^Bm|gQaHINeH3JFE z_@iVG0ej}&xFzvlBd}&e*>GgvHdq|M#zNo%8)yp)Nh##_ePlno=f*83K6C&`k z_yusidXbwXmw$+th3Cd_$lQ)Vn6MjjewA3fDC(9raR_V zY;H{#0k7xBs;X%*neH=s!26P1h7G=glCiflYS@(1Zhy{*=8+#C%Y;!C964Ieu7gie z-?SSulO)6RMX*XiW^TonSJFYi0q~NZC)0OL))TEN$Q?)N<=-TpRXAYg>D55EW@ZeE zt=k#t$W0q`AvjLAM5CQ8L3Ib1$!Ho4g&2h{q2rVIcxD5HR@ z$KQn`H(18N_{{3{Ge)O{!0M{$GTHSq_2$a>pb?C_r2PH+V@P!Lu&E5r85@ua{M3_d zc6uyefHB3wRPH)4F3Ky$aon@k{;4qmP&906K!3^upKYsjMu|n@r&=bSwjh?&(d#PalSs9H;ElVJ z?Wej`SGouo@OIBa%1_YTTHDW`&qbPA4h1%Jg(8lxO!rWFTqpqf4})@mWU7;QkH31x zynlZ-K`e=y#;uU);Mca1I?yVA-^q9-+~U9+3t{_tt;DOV$|lKd8wxe1itT8iVDFq4Rw7Lc5S&HM5CAWJL4M z8GOo5u<bR^1&WFYBH^Dw27iwTX03qv3t{J(_We;+^+Yp$T4IPnt<0W# zpkngzegqUuS8o6lJvW2lLrTsGJiv3aE2w|I8uR_rI$rBlhb<{I-a4}i2g8u0;(Zb=Q zo7uVTmo)x*BP3FUz=#(WQU26Z6n{?XYsEVn8rXc_ee8YmNrfb2Fx}v*z{=24_exwB zD#tw6kt2~z`7(OCWxj>+thcIay3Cjb;K);6_9&8mg8Jh-sCjn_bw{gdZmUCp=Vp+X zJ(`@%i;+ZYM?J?|4v~tc@c;BS>hQzP1Y$Wk+_Y&ExtCtruba&rI+W{Hu7AW*DfX;g zD>t}2S1=t|`RJxS6KHS!R7k`!Bc4jf7E+j(&5oLPIe4_0lo^JQ>>HkAa*^F&p^;9s zzRA-s-EPgTN94Lu9LFQ-W%bU*O)WJ#-jm}Il51WxLmm5Cpvw zhpQGWVBgxcy{=|3Y6X0(J%1J}RC~*C5Q$_`W#cd5+A+g%9fy%aa#*=(C#{{`A_$5S z2PiTaE6IF6MRQv%ZC#CuMRV|+SeI}b!YV32j^pAw5gd6qju#wONZ7G%%zFKr5oKj( z9Do2~g9npeT#O&M5Q1DF-(nfvm{MkjBN5Mt;W|!OWc^e7F5ffRtbe|a5gc-)Y@o9{86<#U+}q~KxE0Z6rZ)tKO!iN~X1wIKd&;YO`sF*ct$YWz;%GbRaIOzXHGv7?u2?}5i1fM8{(sKZ&t$5z;}(pJFzktW zu6o?gkx(!tCBT0CV8!IEI$u3WB@73)3dREXV0mN4=$a)<7%^i8`NhSU87FIMczNMM z_OD-$+h6+&+Fx&~)q&R+f!ZW{3mA-1YSMT?3^<9g+hos@O#S@9+0&9bpPgYPED%&0 zxB^Q7kw`>^Q-7y2ec3XGU3)Ftmo4MP`|l^CuLdAk2h3}K<(-)7YVr)d^PP&))}K^u zi6+du+R$YZnPzrEXwL%`rF+l%aQFSl@}SpQDp+ED=@B0oIdv+Zd*TT;%$Z|H_w2z9 z!2??aUta`!&gGfz`6TcH_~k)s-XJIiG87VNt*f(!U4Oe&zkNHQ+jIlJ72LlF_NMK4 z{TwY3Gq?(vqhQV`vA#oW1PS2x26r!pmbAVf_<%8yBPakKGPv_Sz0Xl#-eUMe+Fx*- zCn6UCe-T^}7OmY~@QDY4HvWST_34(ya8&R$3tXoQc=3FI|Ii48vRiN$kQDsxBl$wE o60$4d4j(Sa1-T#> Date: Tue, 2 Feb 2010 13:16:30 +0100 Subject: [PATCH 11/20] Minor alignment notice form alignment for default theme --- theme/default/css/display.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/theme/default/css/display.css b/theme/default/css/display.css index c31d13d007..07aa5325fc 100644 --- a/theme/default/css/display.css +++ b/theme/default/css/display.css @@ -18,7 +18,7 @@ font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; font-size:1em; } address { -margin-right:5.7%; +margin-right:5.3%; } input, textarea, select { border-width:2px; From 5f14301c55477e9989039bc04747608fdc7c932c Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 2 Feb 2010 06:15:01 -0800 Subject: [PATCH 12/20] setconfig.php: list all current settings if no parameters given --- scripts/setconfig.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) mode change 100644 => 100755 scripts/setconfig.php diff --git a/scripts/setconfig.php b/scripts/setconfig.php old mode 100644 new mode 100755 index b102f99b1f..fe0e46d65e --- a/scripts/setconfig.php +++ b/scripts/setconfig.php @@ -28,6 +28,7 @@ setconfig.php [options] [section] [setting] With three args, set the setting to the value. With two args, just show the setting. With -d, delete the setting. +With no args, lists all currently set values. [section] section to use (required) [setting] setting to use (required) @@ -39,6 +40,21 @@ END_OF_SETCONFIG_HELP; require_once INSTALLDIR.'/scripts/commandline.inc'; +if (empty($args)) { + $count = 0; + $config = new Config(); + $config->find(); + while ($config->fetch()) { + $count++; + printf("%-20s %-20s %s\n", $config->section, $config->setting, + var_export($config->value, true)); + } + if ($count == 0) { + print "No configuration set in database for this site.\n"; + } + exit(0); +} + if (count($args) < 2 || count($args) > 3) { show_help(); exit(1); From 65c5d7813b6e4add186e7e8bf7e476c262c2c4cd Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 2 Feb 2010 16:06:22 +0100 Subject: [PATCH 13/20] Added icon to Clear label for UserFlag plugin --- plugins/UserFlag/clearflagform.php | 2 +- theme/base/images/icons/icons-01.gif | Bin 3650 -> 3696 bytes theme/default/css/display.css | 6 +++++- theme/identica/css/display.css | 8 ++++++-- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/plugins/UserFlag/clearflagform.php b/plugins/UserFlag/clearflagform.php index 5ad6055d33..eefd15c368 100644 --- a/plugins/UserFlag/clearflagform.php +++ b/plugins/UserFlag/clearflagform.php @@ -54,7 +54,7 @@ class ClearFlagForm extends ProfileActionForm function formClass() { - return 'form_entity_clearflag'; + return 'form_user_clearflag'; } /** diff --git a/theme/base/images/icons/icons-01.gif b/theme/base/images/icons/icons-01.gif index f93d33d79bce50e1e407c98d534c6cbff24d4366..980fa0c0ddb09444117815a8f2a1d95952cd7af5 100644 GIT binary patch delta 1365 zcmV-b1*-bO9Pk_rM@dFFIbj+A3<&2>kqk_+Tdx9tUz8AEln^2L1OW;F{{Soi0000Q z01OBK2>t;7{d-lTLx&o#1pdRu!@>XyJg_O8C~(S)E`9oRc`@bR9|%B3nHmLz!5@kO zRlS%r>ChpT93>!{c1+l@W{4!5IB)<)!hbQk972;3&7m#`lr&Q$Nth%>&6JohXATsJ zjvWqvrE$Q7Nr4Rn05mGLfC4ZI3yL*raPOYJbtY7G=yQlkpBWK;G!f9KS(!4&{x)lr z;N3f4`C73Ey6BLQ2wAvr8KLx8P0LXMFk%G2+PecPTW$!##YmMM4`2M*>kWyKTP2EK=4)2+)KJ4k=P_3>g97A&U>|@)?J#Y9b5L zT&(_BksKs>MH8T?TJ1Pd6=cbhvqb2wP!$ZGFz8d9lDCPJ9}%#J(tz#3lSu?Tf9Ql3 zVu-QE8gk@;M;?L{LP;JB-l&BZUYH>VExJGg2`8zzg32HZYH}K=^NlO1P_keig+PJ{pZ)yuOF!~}GfOJ|oD?$Z zlc|7{=`zOb6AwACLL$h5f=qnU0xOE=v>QV5X>QW7OO+JJNs~>W-52cu^=U2 z{`n0%+gzhgHg|d=#~Rz#GK;FSTmud`$UNyu9cGBJEtu+}f{QxsxN=7we{|xw;2@}g z2`eVLAoK4UULd&zgM(1Q2_=OHl1Coru94%zHFoUr#~_C+^2j8YZ1Tw{r>yeIEVu0P z%P=o^#u;p|LC4K}@Bs)QY&aMP7GIFjMjLzhVTd7>WRl4x44#379?}paO3_Crok=H^ z^sFEoUue?L*Z4qliPcyef5OLtY><(NH}3EQb}m;}V#pqJEJ(-DMPKp^{yzQilZ@PZ zv{AQ$cZ)I)I)9(yPT#o%PKMS5(y<3DU-vVQEuk!q4;^HD0r`M@`0+?C+VIVfESK=D z%okY1u^=B+XQH^}fCSSw7Ep}wI?~aM!^$aq^P+~^kszVFf_zjWf6LeB7y?Z{>3kth zKfM^gARw~yt<4^y^n(u;%=F`o^;=)f3M_%Eu}UdWz+uT8MI5i-*mJkhIqpd0AHRb( z(^0b;Y8Zn6$8d(28SsDzOrQc6$iN0V@PQDFpadsKK@C0Of*8zT1{tKm4r*{g9t`0V zKq$fvlCXpuR8R-M85Y75Ua)d4R3Qc{N5g)kkU$x%Aq+9-!Y8vC2R;RVkO2y)0SwrH z4LAV|G65QZ0Tplo7tnwukOLgR0V2Qw5U3y-fB_g_ff>+%IlvEuzyTp30vfO&8Bl>2 zP=Xo&0wAyg@X!w_$N?<~f+XmGC_oLBLkJ$Qg9M@h3#b7!5C&jS4V6<4{9pq_I3Pw? zf+}!>G_(sSU;`i!g(!i4gg)Q`8qfpvP&vC$0$a#{F6apTP!F*n17i3!Nic&A=z@e$ zIbgs6Z@2^w$b}T40d?39ZomOYumV014q!Ni{(LwQe#j4jNCo}i2pWI_4445VxF8x3 z2>oyaN#Hi&Py&-^ffbMemUsj8;5L=h0!C}P9IE5LLYz?UaSd$hGC^9qIlur4S=vI@=2$B#PdRaz$qla}_N0K+jXI;6K XM|qISCvQk6bcQySe&&%35)c48g8)37 delta 1319 zcmV+?1=#xV9Ksw7M@dFFIbj+A$_MBFkqk@%wE(eKumXSo|NkNR1OW;F{{Soi0000Q z0Lljd2>t;7{exx0g9jV11pdp`!@>XyJ+djBD3A&aFMj-ZfkEXTAP7N7ogx*40U(M3 zSHYk}2@xWe93>>8hHMxzXNe@BIB+0F!hbTnAWD-l4I(cHmN;89Y1pJi&X$}wcP>`2M+Q+ayRE*&EmGPD;G{uIjww@e5Fr8JVG9uK^cjb{YGMo0 zU9SFIkt`&6#S@{ZTJ1P-6=cbhwM6Kya8(SRG3ZmIlGn);AQ7;K(tz#7lSu?TfB3`} zV~oKD8*}K9haQ6%Qi&c6-nhjUUz{;VExSY#Nhhkjk_sUUZh-}oY}nDsI_uB^B`vhz z(#e8jAo)oth7jXTIM{#*OfIyfvLG90u(6Ij;jDuVHuAJ1k37uSGNyt&+Tl$y#MCp- zJooHb4lrIW2!|bm5EG6n^6}N_1I{a|RI;ERhD4GHpZ)*?j6d^)LyIc@oftCe zld6Q1DKp3LBTqT7Ml#5PgFwm6qnU0>i#OgxVhE86RuW}7-GHO3JN$H`rYd;Mv0x=& z{s~Sy++eegHg|q92OHbkLW`=jU=vO_$vpXq9cPTOEtu-2lFK^oyn=@ve{|xwAR(!M z32P?1B=avDUm(c^gM?JlNhO91qK6*mvXSG%HFoUr#~_C+^2j8YZ1Tw{r>yeIEVu0P z%P=p91{!U&QOC`F^btrPZ8#`L7GRX&h8ukRamXQ-Xrc)w45E?69@7*vO3_Crt%)a= z^sHbTU~J;g*ZD+)iPcyif6~W-ZIq$NH}CWVwk}s&atI%FELg|TMPmX@{yzTnqm0~q zxKX!)caK6(I)9_`PT#r&UWV2L*1<aC+v0xunYofU2fe6!g7EzG#I?~dR(+Vnl_p*lDk|d$Kf_+#rf6LeC91@K`>VPqh zKfV~hU?8&dy$v6u_>)f-&G_?-^;=)vN-Tk|!HOwS#Bm87MjWr;*mJwlIqpg1AHRb( z*HQBtYaoLF$$*BK8SsDzOrQc6$iN0V@PQDFpadsKK@CCSf*8zT1{tKm4r*{g9t5U3y;fB_g_ff~?&I?xY=&;cSa0voU(8c=~3 zP=Xr}0wKTx@!$_B*a0mFf+XmGDNqfSQwSfhg9Nex3%CI_AO>Mz4V7aK{crP&vF{0$a#{F8B!kU=Ok|17i3!N-%>B=z@h% zIbqNNZ^#4=$b}TK0d?pPZ_oiqzyd!Y4q!Ni{(LwQe%KFzSOxy@2pfyTrO5ir)U;>k9ffb+umWTuP;5L=x0!C}P9IE5OMYz?UaDw7rtC + * @author Sarven Capadisli * @copyright 2009 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ @@ -189,7 +189,8 @@ button.close, .notice-options .repeated, .form_notice label[for=notice_data-geo], button.minimize, -.form_reset_key input.submit { +.form_reset_key input.submit, +.entity_clear input.submit { background-image:url(../../base/images/icons/icons-01.gif); background-repeat:no-repeat; background-color:transparent; @@ -337,6 +338,9 @@ background-position: 5px -1511px; .form_reset_key input.submit { background-position: 5px -1973px; } +.entity_clear input.submit { +background-position: 5px -2039px; +} /* NOTICES */ .notice .attachment { From 7cecd7f722b152f34ff8e82fb5a93bb596a9a3dc Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 2 Feb 2010 16:09:39 +0100 Subject: [PATCH 14/20] Added single icon for Clear --- theme/base/images/icons/twotone/green/clear.gif | Bin 0 -> 82 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 theme/base/images/icons/twotone/green/clear.gif diff --git a/theme/base/images/icons/twotone/green/clear.gif b/theme/base/images/icons/twotone/green/clear.gif new file mode 100644 index 0000000000000000000000000000000000000000..2666430efd631964c4a4feae674730fe6a904edc GIT binary patch literal 82 zcmZ?wbhEHb6krfwSjfN-KSdyUn%MvU|A7p}pDc`A49pBV3_t*qXJAs6>6^LiEq~(- ik#i-{$NXGWS>%QK+S9!>uCHC?n)`B%!Q%i125SJl_8EHs literal 0 HcmV?d00001 From a1f55c3f80f9a08ca7b2ed24faf4e148b09d4bb2 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 2 Feb 2010 16:14:37 +0100 Subject: [PATCH 15/20] Added flag icon to core --- theme/base/images/icons/icons-01.gif | Bin 3696 -> 3758 bytes .../base/images/icons/twotone/green/flag.gif | Bin 0 -> 80 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 theme/base/images/icons/twotone/green/flag.gif diff --git a/theme/base/images/icons/icons-01.gif b/theme/base/images/icons/icons-01.gif index 980fa0c0ddb09444117815a8f2a1d95952cd7af5..01a729c10b92b7669ed745051227990269f70fe2 100644 GIT binary patch delta 120 zcmV-;0EhqZ9IhP+M@dFFIbj+APO%C80v7-O|6i04A^8LW3IP8AEC2ui02%;JvmFEY z3IUdr77kTIP`Q?D*_Og4m1pTf{@@QJ`2=%mmvm{DrFNHd*_V4smwkDcWhR(-*=&Rv aZ-)tSiD{U536hJcjCt3QYPlc*0RTIsCokUs delta 58 zcmZ1{`$2}&-P6s&GEs_wXCvo7Cb9S_0zjnrlZBCs;Xi{80}ueEHp?>q;9`uJEXEhg K$|EGeU=0Ay77eEW diff --git a/theme/base/images/icons/twotone/green/flag.gif b/theme/base/images/icons/twotone/green/flag.gif new file mode 100644 index 0000000000000000000000000000000000000000..68c8aee2598d4c470b1c60c36232fea6b52dbef6 GIT binary patch literal 80 zcmZ?wbhEHb6krfwn8?KN|NsB^DFQ%}fq_BsCkrD30~3P|kPVa-0J0TB`erVB%g@;0 g#a2CkYK(uMX`+Uoh*MBz%DnK`$BZ6xu`*Z#0Jqf`MF0Q* literal 0 HcmV?d00001 From 245610d2e18e2df26b8b2095ab3092855a272096 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 2 Feb 2010 16:27:58 +0100 Subject: [PATCH 16/20] Removed entity flag stylesheet and icons from plugin to core. --- plugins/UserFlag/UserFlagPlugin.php | 15 --------------- plugins/UserFlag/icon_flag.gif | Bin 80 -> 0 bytes plugins/UserFlag/userflag.css | 4 ---- theme/default/css/display.css | 8 +++++++- theme/identica/css/display.css | 8 +++++++- 5 files changed, 14 insertions(+), 21 deletions(-) delete mode 100644 plugins/UserFlag/icon_flag.gif delete mode 100644 plugins/UserFlag/userflag.css diff --git a/plugins/UserFlag/UserFlagPlugin.php b/plugins/UserFlag/UserFlagPlugin.php index 8728e57034..ae3dfe0365 100644 --- a/plugins/UserFlag/UserFlagPlugin.php +++ b/plugins/UserFlag/UserFlagPlugin.php @@ -182,21 +182,6 @@ class UserFlagPlugin extends Plugin return true; } - /** - * Add our plugin's CSS to page output - * - * @param Action $action action being shown - * - * @return boolean hook result - */ - - function onEndShowStatusNetStyles($action) - { - $action->cssLink(common_path('plugins/UserFlag/userflag.css'), - null, 'screen, projection, tv'); - return true; - } - /** * Initialize any flagging buttons on the page * diff --git a/plugins/UserFlag/icon_flag.gif b/plugins/UserFlag/icon_flag.gif deleted file mode 100644 index 68c8aee2598d4c470b1c60c36232fea6b52dbef6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80 zcmZ?wbhEHb6krfwn8?KN|NsB^DFQ%}fq_BsCkrD30~3P|kPVa-0J0TB`erVB%g@;0 g#a2CkYK(uMX`+Uoh*MBz%DnK`$BZ6xu`*Z#0Jqf`MF0Q* diff --git a/plugins/UserFlag/userflag.css b/plugins/UserFlag/userflag.css deleted file mode 100644 index 98da24cc94..0000000000 --- a/plugins/UserFlag/userflag.css +++ /dev/null @@ -1,4 +0,0 @@ -.entity_flag input.submit, -.entity_flag p { -background:url(icon_flag.gif) 5px 5px no-repeat; -} diff --git a/theme/default/css/display.css b/theme/default/css/display.css index 3c05420ef6..6954de7bad 100644 --- a/theme/default/css/display.css +++ b/theme/default/css/display.css @@ -190,7 +190,9 @@ button.close, .form_notice label[for=notice_data-geo], button.minimize, .form_reset_key input.submit, -.entity_clear input.submit { +.entity_clear input.submit, +.entity_flag input.submit, +.entity_flag p { background-image:url(../../base/images/icons/icons-01.gif); background-repeat:no-repeat; background-color:transparent; @@ -342,6 +344,10 @@ background-position: 5px -1973px; .entity_clear input.submit { background-position: 5px -2039px; } +.entity_flag input.submit, +.entity_flag p { +background-position: 5px -2105px; +} /* NOTICES */ .notice .attachment { diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css index e195553789..9ac2730bda 100644 --- a/theme/identica/css/display.css +++ b/theme/identica/css/display.css @@ -190,7 +190,9 @@ button.close, .form_notice label[for=notice_data-geo], button.minimize, .form_reset_key input.submit, -.entity_clear input.submit { +.entity_clear input.submit, +.entity_flag input.submit, +.entity_flag p { background-image:url(../../base/images/icons/icons-01.gif); background-repeat:no-repeat; background-color:transparent; @@ -341,6 +343,10 @@ background-position: 5px -1973px; .entity_clear input.submit { background-position: 5px -2039px; } +.entity_flag input.submit, +.entity_flag p { +background-position: 5px -2105px; +} /* NOTICES */ .notice .attachment { From 027c7e61fd6ecbb866a4f18111662902942d046e Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 2 Feb 2010 09:30:15 -0800 Subject: [PATCH 17/20] Fix regression breaking file attachments. This is what I get for rushing fixes and not properly testing them. :P --- classes/File.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/File.php b/classes/File.php index 6dd9e0c06e..ee418a8024 100644 --- a/classes/File.php +++ b/classes/File.php @@ -181,7 +181,7 @@ class File extends Memcached_DataObject */ static function validFilename($filename) { - return preg_match('^/[A-Za-z0-9._-]+$/', $filename); + return preg_match('/^[A-Za-z0-9._-]+$/', $filename); } /** From 2085b506d4d4e6291156662f5930596bc657f270 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 2 Feb 2010 23:16:44 +0000 Subject: [PATCH 18/20] Always check for an OAuth request. This allows OAuth clients to set an auth user, similar to how they can set one via http basic auth, even if one is not required. I think I finally got this right. --- lib/apiauth.php | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/lib/apiauth.php b/lib/apiauth.php index 99500404f9..25e2196cf2 100644 --- a/lib/apiauth.php +++ b/lib/apiauth.php @@ -55,6 +55,7 @@ class ApiAuthAction extends ApiAction { var $auth_user_nickname = null; var $auth_user_password = null; + var $oauth_source = null; /** * Take arguments for running, looks for an OAuth request, @@ -73,20 +74,18 @@ class ApiAuthAction extends ApiAction // NOTE: $this->auth_user has to get set in prepare(), not handle(), // because subclasses do stuff with it in their prepares. - if ($this->requiresAuth()) { + $oauthReq = $this->getOAuthRequest(); - $oauthReq = $this->getOAuthRequest(); - - if (!$oauthReq) { + if (!$oauthReq) { + if ($this->requiresAuth()) { $this->checkBasicAuthUser(true); } else { - $this->checkOAuthRequest($oauthReq); + // Check to see if a basic auth user is there even + // if one's not required + $this->checkBasicAuthUser(false); } } else { - - // Check to see if a basic auth user is there even - // if one's not required - $this->checkBasicAuthUser(false); + $this->checkOAuthRequest($oauthReq); } // Reject API calls with the wrong access level @@ -108,7 +107,6 @@ class ApiAuthAction extends ApiAction * This is to avoid doign any unnecessary DB lookups. * * @return mixed the OAuthRequest or false - * */ function getOAuthRequest() @@ -137,7 +135,6 @@ class ApiAuthAction extends ApiAction * @param OAuthRequest $request the OAuth Request * * @return nothing - * */ function checkOAuthRequest($request) From ac8a4a7e56cc2535b0d1c30e4619db5994a1ecd4 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Wed, 3 Feb 2010 01:43:59 +0000 Subject: [PATCH 19/20] Confirm dialog for reset OAuth consumer key and secret button --- actions/editapplication.php | 2 +- actions/newapplication.php | 2 +- actions/showapplication.php | 54 +++++++++++++++++++++++++++++++++---- 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/actions/editapplication.php b/actions/editapplication.php index 029b622e84..ca5dba1e49 100644 --- a/actions/editapplication.php +++ b/actions/editapplication.php @@ -266,7 +266,7 @@ class EditApplicationAction extends OwnerDesignAction /** * Does the app name already exist? * - * Checks the DB to see someone has already registered and app + * Checks the DB to see someone has already registered an app * with the same name. * * @param string $name app name to check diff --git a/actions/newapplication.php b/actions/newapplication.php index ba1cca5c92..c0c5207979 100644 --- a/actions/newapplication.php +++ b/actions/newapplication.php @@ -279,7 +279,7 @@ class NewApplicationAction extends OwnerDesignAction /** * Does the app name already exist? * - * Checks the DB to see someone has already registered and app + * Checks the DB to see someone has already registered an app * with the same name. * * @param string $name app name to check diff --git a/actions/showapplication.php b/actions/showapplication.php index 020d62480a..fa44844816 100644 --- a/actions/showapplication.php +++ b/actions/showapplication.php @@ -149,7 +149,6 @@ class ShowApplicationAction extends OwnerDesignAction function showContent() { - $cur = common_current_user(); $consumer = $this->application->getConsumer(); @@ -229,7 +228,13 @@ class ShowApplicationAction extends OwnerDesignAction array('id' => $this->application->id)))); $this->elementStart('fieldset'); $this->hidden('token', common_session_token()); - $this->submit('reset', _('Reset key & secret')); + + $this->element('input', array('type' => 'submit', + 'id' => 'reset', + 'name' => 'reset', + 'class' => 'submit', + 'value' => _('Reset key & secret'), + 'onClick' => 'return confirmReset()')); $this->elementEnd('fieldset'); $this->elementEnd('form'); $this->elementEnd('li'); @@ -291,14 +296,53 @@ class ShowApplicationAction extends OwnerDesignAction $this->elementEnd('p'); } + /** + * Add a confirm script for Consumer key/secret reset + * + * @return void + */ + + function showScripts() + { + parent::showScripts(); + + $msg = _('Are you sure you want to reset your consumer key and secret?'); + + $js = 'function confirmReset() { '; + $js .= ' var agree = confirm("' . $msg . '"); '; + $js .= ' return agree;'; + $js .= '}'; + + $this->inlineScript($js); + } + + /** + * Reset an application's Consumer key and secret + * + * XXX: Should this be moved to its own page with a confirm? + * + */ + function resetKey() { $this->application->query('BEGIN'); + $oauser = new Oauth_application_user(); + $oauser->application_id = $this->application->id; + $result = $oauser->delete(); + + if ($result === false) { + common_log_db_error($oauser, 'DELETE', __FILE__); + $this->success = false; + $this->msg = ('Unable to reset consumer key and secret.'); + $this->showPage(); + return; + } + $consumer = $this->application->getConsumer(); $result = $consumer->delete(); - if (!$result) { + if ($result === false) { common_log_db_error($consumer, 'DELETE', __FILE__); $this->success = false; $this->msg = ('Unable to reset consumer key and secret.'); @@ -310,7 +354,7 @@ class ShowApplicationAction extends OwnerDesignAction $result = $consumer->insert(); - if (!$result) { + if (empty($result)) { common_log_db_error($consumer, 'INSERT', __FILE__); $this->application->query('ROLLBACK'); $this->success = false; @@ -323,7 +367,7 @@ class ShowApplicationAction extends OwnerDesignAction $this->application->consumer_key = $consumer->consumer_key; $result = $this->application->update($orig); - if (!$result) { + if ($result === false) { common_log_db_error($application, 'UPDATE', __FILE__); $this->application->query('ROLLBACK'); $this->success = false; From efa930ab000e1e022f0754d9f421e8859024142c Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Feb 2010 18:13:21 +0100 Subject: [PATCH 20/20] Added right margin for notice text. Helps Conversation notices look better. --- theme/base/css/display.css | 1 + 1 file changed, 1 insertion(+) diff --git a/theme/base/css/display.css b/theme/base/css/display.css index b5cfab7e9c..8490fb5803 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -1024,6 +1024,7 @@ float:none; } #content .notice .entry-title { margin-left:59px; +margin-right:7px; } .vcard .url {