From f964357de944e79ffbca062c60240f7784d98f08 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 1 Feb 2010 13:44:06 -0500 Subject: [PATCH 01/18] readme and version for beta5 --- README | 80 ++++++++++++++++++++++++++++++++++++++++++++++++-- lib/common.php | 2 +- 2 files changed, 79 insertions(+), 3 deletions(-) diff --git a/README b/README index 4e576dcdd3..9b4147645b 100644 --- a/README +++ b/README @@ -2,8 +2,8 @@ README ------ -StatusNet 0.9.0 ("Stand") Beta 4 -27 Jan 2010 +StatusNet 0.9.0 ("Stand") Beta 5 +1 Feb 2010 This is the README file for StatusNet (formerly Laconica), the Open Source microblogging platform. It includes installation instructions, @@ -78,6 +78,11 @@ New this version ================ This is a major feature release since version 0.8.2, released Nov 1 2009. +It is also a security release since 0.9.0beta4 January 27 2010. Beta +users are strongly encouraged to upgrade to deal with a security alert. + +http://status.net/wiki/Security_alert_0000002 + Notable changes this version: - Records of deleted notices are stored without the notice content. @@ -198,6 +203,77 @@ Notable changes this version: - Major refactoring of queue handlers to manage very large hosting site (like status.net) - SubscriptionThrottle plugin to prevent subscription spamming +- Don't enqueue into plugin or SMS queues when disabled (breaks unqueuehandler if SMS queue isn't attached) +- Improve name validation checks on local File references +- fix local file include vulnerability in doc.php +- Reusing fixed selector name for 'processing' in util.js +- Removed hAtom pattern from registration page. +- restructuring of User::registerNew() lost password munging +- Add a script to clear the cache for a given key +- buggy fetch for site owner +- Added missing concat of in Realtime response +- Updated XHR binded events to work better in jQuery 1.4.1. Using .live() for event delegation instead of jQuery.data() and checking to see if an element was previously binded. +- Updated jQuery Form Plugin from v2.17 to v2.36 +- Updated jQuery JavaScript Library from v1.3.2 to v1.4.1 +- move schema.type.php to typeschema.php like other files +- Add Really Simple Discovery (RSD) support +- Add a robots.txt URL to the site root +- error clearing tags for profiles from memcached +- on exceptions, stomp logs the error and reenqueues +- add lat, lon, location and remove closing tag from geocode.php +- Use passed-in lat long in geocode.php +- better handling of null responses from geonames.org +- Globalized form notice data geo values +- Using jQuery chaining in FormNoticeXHR +- Using form object instead of form_id and find(). Slightly faster and easier to read. +- removed describeTable from base class, and fixed it up in pgsql +- getTableDef() mostly working in postgres +- move the schema DDL sql off into seperate files for each db we support +- plugin to limit number of registered users +- add hooks for user registration +- live fast, die young in bash scripts +- for single-user mode, retrieve either site owner or defined nickname +- method to get the site owner +- define a constant for the 'owner' role of a site +- add simple cache getter/setter static functions to Memcached_DataObject +- Adds notice author's name to @title in Realtime response +- Hides .author from XHR response in showstream +- Hides .author from XHR response in showstream +- Fix more fatal errors in queue edge cases +- Don't attempt to resend XMPP messages that can't be broadcast due to the profile being deleted. +- Wrap each bit of distrib queue handler's saving operation in a try/catch; log exceptions but let everything else continue. +- Log exceptions from queuedaemon.php if they're not already caught +- Move sessions settings to its own panel +- Fixes for status_network db object .ini and tag setter script +- Add a script to set tags for sites +- Adjust API authentication to also check for OAuth protocol params in the HTTP Authorization header, as defined in OAuth HTTP Authorization Scheme. +- Last-chance distribution if enqueueing fails +- Manual failover for stomp queues. +- lost config in index.php made all traffic go to master +- "Revert "move RW setup above user get in index.php so remember_me works"" +- Revert "move RW setup above user get in index.php so remember_me works" +- move RW setup above user get in index.php so remember_me works +- hide most DB_DataObject errors +- always set up database_rw, regardless, so cached sessions work +- update mysqltimestamps on insert and update +- additional debugging data for Sessions +- 'Sign in with Twitter' button img +- Update to biz theme +- Remove redundant session token field from form (was already being added by base class). +- 'Sign in with Twitter' button img +- Can now set $config['queue']['stomp_persistent'] = false; to explicitly disable persistence when we queue items +- Showing processing indicator for form_repeat on submit instead of form +- Removed avatar from repeat of username (matches noticelist) +- Removed unused variable assignment for avatar URL and added missing fn +- Don't preemptively close existing DB connections for web views (needed to keep # of conns from going insane on multi-site queue daemons, so just doing for CLI) May, or may not, help with mystery session problems +- dropping the setcookie() call from common_ensure_session() since we're pretty sure it's unnecessary +- append '/' on cookie path for now (may still need some refactoring) +- set session cookie correctly +- Fix for Mapstraction plugin's zoomed map links +- debug log line for control channel sub +- Move faceboookapp.js to the Facebook plugin +- fix for fix for bad realtime JS load +- default 24-hour expiry on Memcached objects where not specified. Prerequisites ============= diff --git a/lib/common.php b/lib/common.php index b482464aac..b95cd11752 100644 --- a/lib/common.php +++ b/lib/common.php @@ -22,7 +22,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } //exit with 200 response, if this is checking fancy from the installer if (isset($_REQUEST['p']) && $_REQUEST['p'] == 'check-fancy') { exit; } -define('STATUSNET_VERSION', '0.9.0beta4'); +define('STATUSNET_VERSION', '0.9.0beta5'); define('LACONICA_VERSION', STATUSNET_VERSION); // compatibility define('STATUSNET_CODENAME', 'Stand'); From 0e49b3525d81a62a21e94e656c0ee5f2d38409eb Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 1 Feb 2010 20:31:56 +0100 Subject: [PATCH 02/18] 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 03/18] 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 04/18] 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 05/18] 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 06/18] 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 07/18] 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 08/18] 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 09/18] 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 10/18] 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 11/18] 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 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 + * @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 zcmVEX>4Tx0C?J+Q)g6D=@vcr-tj1^HV42lZa2jn55j)S9!ipu-pd!uXCy!YnK{> z2n?1;Gf_2w45>mM5#WQz#Kz&|EGkvK~TfD`~gdX7S-06<0ofSs5oQvjd@0AR~wV&ec% zEdXFAf9BHwfSvf6djSAjlpz%XppgI|6J>}*0BAb^tj|`8MF3bZ02F3R#5n-iEdVe{ zS7t~6u(trf&JYW-00;~KFj0twDF6g}0AR=?BX|IWnE(_<@>e|ZE3OddDgXd@nX){& zBsoQaTL>+22Uk}v9w^R97b_GtVFF>AKrX_0nHe&HG!NkO%m4tOkrff(gY*4(&JM25 z&Nhy=4qq+mzXtyzVq)X|<DpKGaQJ>aJVl|9x!Kv}EM4F8AGNmGkLXs)P zCDQ+7;@>R$13uq10I+I40eg`xs9j?N_Dd%aSaiVR_W%I$yKlkNCzL=651DUOSSq$Ed=-((3YAKgCY2j1FI1_jrmEhm z3sv(~%T$l4UQ>OpMpZLYTc&xiMv2YpRx)mRPGut5K^*>%BIv?Wdil zy+ylO`+*KY$4Vz$Cr4+G&IO(4Q`uA9rwXSQO+7mGt}d!;r5mBUM0dY#r|y`ZzFvTy zOmC;&dA;ZQ9DOhSRQ+xGr}ak+SO&8UBnI0I&KNw!HF0k|9WTe*@liuv!$3o&VU=N* z;e?U7(LAHoMvX=fjA_PP<0Rv4#%;!P6gpNq-kQ#w?mvCS^p@!_XIRe=&)75LwiC-K#A%&Vo6|>U7iYP1 zgY$@siA#dZE|)$on;XX6$i3uBboFsv;d;{botv|p!tJQrukJSPY3_&IpUgC$DV|v~ zbI`-cL*P;6(LW2Hl`w1HtbR{JPl0E(=OZs;FOgTR*RZ#xcdGYc?-xGyK60PqKI1$$ z-ZI`wBrnsy*W_HW0Wrec-#cqqYFCLW#$!oKa ztOZ#u3bsO~=u}!L*D43HXJuDrzs-rtIhL!QE6wf9v&!3$H=OUE|LqdO65*1zrG`sa zEge|qy{u|EvOIBl+X~|q1uKSD2CO`|inc0k)laMKSC_7Sy(W51Yk^+D%7VeQ0c-0E zRSM;Wee2xU?Ojh;FInHUVfu!h8$K0@imnvf7nc=(*eKk1(e4|2y!JHg)!SRV_x(P}zS~s+RZZ1q)n)rh`?L2yu8FGY z_?G)^U9C=SaqY(g(gXbmBM!FLxzyDi(mhmCkJc;eM-ImyzW$x>cP$Mz4ONYt#^NJz zM0w=t_X*$k9t}F$c8q(h;Rn+nb{%IOFKR-X@|s4QQ=0o*Vq3aT%s$c9>fU<%N829{ zoHRUHc}nwC$!Xf@g42^{^3RN&m7RTlF8SPG+oHC6=VQ*_Y7cMkx)5~X(nbG^=R3SR z&Rp`ibn>#>OB6F(@)2{oV%K?xm;_x?s~noduI3P8=g1L-SoYA z@fQEq)t)&$-M#aAZ}-Lb_1_lVesU-M&da;mcPH+xyidGe^g!)F*+boj)jwPQ+}Q8j ze`>&Yp!3n(NB0JWgU|kv^^Xrj1&^7J%Z3ex>z+71IXU7#a{cN2r$f(V&nBK1{-XZN zt``^}my^G3e5L*B!0Q>W+s4Ai9=^$VGcjKDR{QP2cieX!@1x%j zPvm?ce<=TG`LXp=(5L&88IzO$1Ou4!{O>iCf&c&xYe_^wRCwC$U0ZMy*BSn7FOp3h zENl`BOvVBxA%zZzAx%8f#E6&lfs5fG&GaFSc%aihVY!{@_{sRCJhWrO^r20e)}noA zNgj~7JmfNCK}d!&PzxqbFigT4Y$7K%tiZM|mP8+P)>*Cha#mhRtM&P2c3`aCbNSD= z|No!=obzuL7#48yLc0rq4}cfIF7mHS1`9>5I%p~HJF@yk_qRg6Bs$qVg%0384h zEU_paKnTEzIBeJBm&710uZpfhN@a- z1o8qHAihs2ArS3!oDs<$e$YUfn-KF0Gu&OAa~=oCDohGBrx&)Rq)?l zGUR|C-g9X;Ba-z<TB^Ym+R?*^WI-a;*SRg#;Ad9q#*~cdKZ)#A zTJ5ngd0|d2YnifXOPNZ}uf#}1V$WEn^I{OgwpFN>{)JLw)K6eWb zptmbJ5oD&#e4Ns|;hB}?UvC>9yMmdM_b~hWF(V|B!vkQT&)ssj&)s5~O>nk3AgO2G ze!A^HFZP6EcUN>mD3Cl}82jBO{pnVg&I=k7$b$0Ble* zam1Y6g*h30c>p`Q_qGX~O-Q7wo=dr3Tg;Di@5|2+JA0d&KwCQYp-x615sjNRV$1%0 z;6J^LJ0E|7`FNa0Tl51sr1JX!%u5UHLGFZez%G&Pe&mv`7c}ipq+$?e#xO06qRF+{ zaK^SoDu&62H!%L)RirZsB>wRoRh($c{(bPg@jAWF_22<+p8f!jA3UJBeYIRGk*WRN zA`HO>yF|7Rs7?FT2$4v|FcllcmwQH(-Ahh!oZ!|YrX!pzvBZ6WF5S^Zb} zjn@s42mn^CTZf(gU*dBA2^!7h2O!VueMIk}m5vp7p=njl&&y#TwOjfrp&Ia1Z z1C?#5Yh3xWH8Izt(%>(0G-k$VR_Pa;x8Yeloy+PHV$1%*{IY{kMs+ns!6cIU zRjbym(=%~C6`w{`6Uj*g04r*$@smyK@W~gN7SU^m>A&i^|LeC-;>MkSVf_26B_R<2 zWbUPOHA>^AjZ3a){VO|l@9A^5_$2<3Pfr_Zk!;PgD>dt?Xd+3zuVxuMou1eHy~zX; ziL*J%cuz@C=^DvrwFYVIDavW2#zs@>S+#B*&23&;d`T56YO0qtkvhOYh3>s=5iJtE z(4>AEITlZ1N;^U?ELV*b0T2MN0l;qL79xdZz$ZmAZG3(;R@77@7Edmk>c`?qe17}B zUb*3lowboJZuQ^U$yG}YH(dM2)?i9`%?Hr7Vs01p!K=xUt9doG0t8Kh)& zk;^M7R~(>-yj-#sR+UH(zxf99@i(UB2al8ZP(^T2#2i>W7bv;-3C2vstX zI@CG^V33evNsyg(r7iEG7Rl%1aZHYUNi}`f!sHkFMCyu8go!rtpm@0{0~NbyE1UN7 z67qzt>W4`2)!B1s-nyk=t#s$(PiS@nNM%v1{N17My=_6Da!-+XkPH8xvf3H>uINOl z&)p(u#c<~1as2nMf5Yp6BZkYL92vo#k3OdITO``ZU!)giVTVCQ5{Zz<%1IW2P}z;J z;B-HDfXn?S@Y=6`MXi~}uU*H@)9=&zEx{scqabA4ZI|We+KY`ocZ&y<+cj3y)!|3` z_v!jfH&4Hh@oU#sKAt3%_)jo9|~TZ=T5sJ#r#qBe9zCxm0?ueju!^wn_e{1q|u;g$HGA^{@+ z2D|sRsrsOdNW~+P3%Qt*p)>sJU)hOmZ|8rvAw zh%;&^Vm^ND`XUoXGu0P;mvWGZ5vllO%A48H;;Xag7WNuVj!k90*R4wb8~j7TL2 z2LL!|L^I9DNkF=)`I(^@$Ow{G<}&H+}=83YOEc zW<;_+q0Ug=zS}A$O+*bFLTli|nJ2e?R=>&xpiSpi-ps^WZ2E7{P(c9ti_sw~ww)2l zdeDnGonk~{pwUV^)T7}MtENY0M6xECLRfrm-?G|>5vlV0r4S<$!&3dF5HWjJgVWyiS>F!M;+v|PHGOj zh7abE{T7s#L0%B~OA<_{lDwop@<~HbjXY4;>Bu>pJZXDyiRAQ4Ws*)Mg9_uMIz9?= z?ga3zq)ah;i=LcYDdY@r4(9>R;e4dvP)V-=N+(S5(s1Im>U~6nN#kUzT|T*B)b62i zDy1(Th0KPQqM^w1((<(G^lOykiCBZ`K)|dR+hpENW)Y zP{_;&bCWn|)j2>kq~dSTKk>UHIdi15v~Nuh=WrfRr;>ui1oaZtCuejRxujF7Wf`b< z0J(gRQuIp7$umXBUnMs^mPK9y59RHhoWps-q?npsod+P>H9#~C?XmHG06P@qtTeuP za^_Sj2?IDm3YItCOMV9t&QZc-c|{l1{31!G}J{O;ij-(y8P@LXKe= zOuk?t1d1%PKsuESaSmq~xg-^ZV0Su|6v$-Cj5BuNh!*HquDTjH9)2np)(}(=jyTzCZmD+?F zu8+iQJVYLXL}oq(CwRN;*}QCS#Bn}Y$?S%LR;P*gm;qkJ-}O?;hT7RS@)n4Td}iQ80RwIZ z!a5EzO}%0!Sds#1014Y&eQ^7?8C8kd82U zoiZZGrP`yBSwKN%y$bjBqIlS?LnZ;hp`}csY5*Xc$=s^0;obvK3&1V2=>mZN0Qf~Z zmAs|M#u^R)V#uwniB~wA$!HEpHj^2wuHnXrT6dGqzL!oVyQ^!ssI<&%CKFbvyGmB? z#cU=M(W&=Vbq#ls^z&tjraF{PCBxM({-h{#kd=O?iJYLng-dA#IV#8hx1Qjp5{?=`L zRvNHr>mFt+cDxY}Ox2SwvdF$gBl$xHJr%F+V5OaWp^~-+^7(?f;v0|hSrtORcl%Mw z_Z+tqGmVu?hJT7b=*>mLwM5{dfGWHwoEMavadoEIdUr91eq1-HfAH$da6+m65Mdfj#Dml9Dgg2)3y>A7zNRFsRCIBn(Y{WwQeEK?acxJrkg1~{*yg$ z9;i0k0DtfrG}C;Xp~`QR#J6r+&jY2{Ag6(^*M^&Iw;}Q2KZhp2J)h}6nhpAniv+vN zm6`8OmCM(;c5R>#Xi%V*`P|k^Px@}qVmdaHE+gW|d4czejm!IRUT+ST2>}xZa{>PJ zm5VSwRfY2c0GXI^X*LP4cJ$|T#yjwpdtOZ@Nq^W-V6>WKgVOwO4W6^)jj9PHQb(FL z(MYBs3gmk7`QE-|iy-!m&gmD9mnZIE@tX^Qnfdb8SGhWl=zaCS!=b4*JUCNp#UKKl z^9W1{L;!(60EmE0K=3k~vxc;W7pVv*88CY1S~7t%HiWgl^o}`;Mn+?u%vIyD&WBZ@ zB7YDCR1_^ggGM|95rGIyG1t2>^|?3AOdb6L8<;JI`&?i4Zke_lk+g$-?O1)i6&nDU zYV<)=!QB8CRUB_7CnF5Y0eHcV8!kDm8RpqPw`{qbvcuLCgLXKSTX|oxH@dN$>f;m;*b95tNMa4x@F4>s`ZAc!l=@F9M$m($u3-O>VTA=wA=aT;Lz&_kVFM z$*t0tz%T z5e?s>wsu)NsdQ{pbQD(wBLevzs1_0UEDU8(OZG#k4CNRgfQUfa$u}ZG5b~#7v--oq z%$|dTvR^!{+Leg>Fc+AsnyE+Z5`R?U^n_EGfZ?79Gp+QmL&8(dBrE%GT=#-mU_ZBY zDX9;5vWEHREzs+mX}ObBP-w>nkn2H?F2O5ab{z`2IUwpNsj3)1wi6GJeGN154p_q- zgF7DpGZ#JV7cDp5wlMvfOkp6Utg$u|*zedVId?Y7J4&=_2A40t8LO9UKqe}J$%4p$$biY9n4gE`3tx{~ zwS}XVU%(oMbZLQi0_Su|n)pXJs6AC~oGY;%o@zN=OGL{Qz`Q~R=k#V~j@IM9LCb$2 z3Tantja!h<>D||?c~Jv6Fn=vl7ABiquJ9eC(awAAro+n@e-!fuR)fic$$*GYzSw{{ zz!j@+#EN;>LcBl~P(e2@JfQMc>zX`}IRNKl?^U;{DvFWSYT|F%J5fEqX!Wz1Flo+j z?(T6JcAG|bqMx`#%Lpv5A|5Rt=GhE$>E*)^22*{J`SURDsA}v zH_$O30}W`aeh63nU`$VK09&%w{tg@NcwPVy!^IwJ7QX`ob6Vw3HiKbJ2CEidjqPJ! zKg1Pw|0PY>Nv_+vX-f-3BtB$ z+>FKee!1(4i-Zd;eZC>AUO1ZzUZW~qSnMQclCUlse#IFm-!-9IRp$<_Mv|mxHQmV% zc)c*=tCTl0sss(G`R8lK?w7Ydd>79f+Zolyj=nb)za{DmpMNgQ&sDQ?a+92;?ag}n znTfsSH3nheYbEoeRjcTEAp}5Wsdxo*X9Ji4Lm?6KugAEFkcokH!-1B(nQ;_yWcx`8%#%eSb&ToNq-y2gh3ZnUw9`Jouaqz$o&W- z3z2SRcHKKF-l$;iu4gbf#XM83zH0v5{!diLs$^7Qh+#uUkPV>RVE{f&(QZ08=g>Uf zf>Rl>iTO5?_Qi2vJtiJu3QhNB=vo zh7Thc;!ch!5E@=uH^EJY$jt5QBb(N}MnU$`RwEUFI1q(+0~08onf{3;ZZkze0kg#S zSADOl5cL?Jd>B*p$6=UeA(k0l^{K!IM{{L|e1DlZHvGxZ^9U2e7y=Vvc+)1F|3^21 zYzMM?7B9lk#cQzan)l-V4}J*lvByEwA$o@CBh7?vlU(izHc_l1t{NxqfmSm{qn4mr zZJ}Cjp;oQYT@P$VoK~UYp(B<@$bjNg?7O;-TUolEO=h-3RZ)o!dVICry9|OxhuK zo&FY1bX%a1@R*>LIBSU)Je#bdiq(JrcYk1OL54xhT}3Ufq-OfzA`V*d80+<<= z(#0lHk`mx!|75BHCmvn}TB$+e1YHVnYIqjKv4?+-ikq$OnPN0?l8nE@l z{ljy}=M1cwTsr@ioz6hD!!Dn=g}aw{4@pz}@*Cg8;qBW`=-I!ph~{MD zR%=O48GYZ|b{!jSGsxN}_U^p2w={gs!jTK!W(@Uv6{rflcMugMae~yja;;Y0QEnXm zdE(>oz(f}YLG)TOZaI)Z6i5@f*;eT0-1pk5yVG^qQglx|-9|tLxqn=MY$=EH-v2=? zf6u#NqX>YaIXQ&~{_!91)SY)CZKr?&VNZa07Y>b8Ch8YO&L^i$pRe3=EtR~GGc6Xd zF#zv5_}EJFet{5rL?}nBNl4K{gM;(;s(N)Ukybl~s3W1+G#kw~8>YXopgo$t@waOCmHlYi)n2|8`5KBpzNfx$VK zjJWYfCSKn^lE2^Nvu@+vJLK1zPLGbRrFh{S6ed~#fZA{t(VSza9O_;_x|Wt@Q>d?U z$`QlMuoHX>gj<6N|MkIbA;L)t$nckX2C|zD>^O4T5w5X>xhsbJ5hyJgR*MCPx*V2)=LWm+RFhzB4-^^;hl-V6UIq-mzNzyQfa4>#ETDzO5>?5Og|64b{STb~Xf16V^d{GK zVGCvpnBFvfxOURmt#>G|K9)a5#G}Zju2j#-#$CJgw|{=b^yxo2q`Q4aE0u=i3eEex zucaHmy-Sm{>SHlUrk%c%Vt;S85S@6ZSj@mzlD`D>UnGrPYs#FY{7ZI9`Fy#3)i9-T z&bBLX4~$8k@m_A)zh6%~+O& 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 12/18] 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 13/18] 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 14/18] 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 15/18] 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 16/18] 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 17/18] 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 18/18] 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); } /**