diff --git a/actions/apiaccountupdateprofilebackgroundimage.php b/actions/apiaccountupdateprofilebackgroundimage.php deleted file mode 100644 index bb0cef52a4..0000000000 --- a/actions/apiaccountupdateprofilebackgroundimage.php +++ /dev/null @@ -1,215 +0,0 @@ -. - * - * @category API - * @package StatusNet - * @author Zach Copley - * @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/ - */ - -if (!defined('STATUSNET')) { - exit(1); -} - -require_once INSTALLDIR . '/lib/apiauth.php'; - -/** - * Update the authenticating user's profile background image - * - * @category API - * @package StatusNet - * @author Zach Copley - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ -class ApiAccountUpdateProfileBackgroundImageAction extends ApiAuthAction -{ - var $tile = false; - - /** - * Take arguments for running - * - * @param array $args $_REQUEST args - * - * @return boolean success flag - * - */ - function prepare($args) - { - parent::prepare($args); - - $this->user = $this->auth_user; - $this->tile = $this->arg('tile'); - - return true; - } - - /** - * Handle the request - * - * Check whether the credentials are valid and output the result - * - * @param array $args $_REQUEST data (unused) - * - * @return void - */ - function handle($args) - { - parent::handle($args); - - if ($_SERVER['REQUEST_METHOD'] != 'POST') { - $this->clientError( - // TRANS: Client error. POST is a HTTP command. It should not be translated. - _('This method requires a POST.'), - 400, $this->format - ); - return; - } - - if (!in_array($this->format, array('xml', 'json'))) { - $this->clientError( - // TRANS: Client error displayed when coming across a non-supported API method. - _('API method not found.'), - 404, - $this->format - ); - return; - } - - // Workaround for PHP returning empty $_POST and $_FILES when POST - // length > post_max_size in php.ini - - if (empty($_FILES) - && empty($_POST) - && ($_SERVER['CONTENT_LENGTH'] > 0) - ) { - // TRANS: Client error displayed when the number of bytes in a POST request exceeds a limit. - // TRANS: %s is the number of bytes of the CONTENT_LENGTH. - $msg = _m('The server was unable to handle that much POST data (%s byte) due to its current configuration.', - 'The server was unable to handle that much POST data (%s bytes) due to its current configuration.', - intval($_SERVER['CONTENT_LENGTH'])); - - $this->clientError(sprintf($msg, $_SERVER['CONTENT_LENGTH'])); - return; - } - - if (empty($this->user)) { - // TRANS: Client error when user not found updating a profile background image. - $this->clientError(_('No such user.'), 404, $this->format); - return; - } - - $design = $this->user->getDesign(); - - // XXX: This is kinda gross, but before we can add a background - // img we have to make sure there's a Design because design ID - // is part of the img filename. - - if (empty($design)) { - $this->user->query('BEGIN'); - - // save new design - $design = new Design(); - $id = $design->insert(); - - if (empty($id)) { - common_log_db_error($id, 'INSERT', __FILE__); - // TRANS: Client error displayed when saving design settings fails because of an empty id. - $this->clientError(_('Unable to save your design settings.')); - return; - } - - $original = clone($this->user); - $this->user->design_id = $id; - $result = $this->user->update($original); - - if (empty($result)) { - common_log_db_error($original, 'UPDATE', __FILE__); - // TRANS: Client error displayed when saving design settings fails because of an empty result. - $this->clientError(_('Unable to save your design settings.')); - $this->user->query('ROLLBACK'); - return; - } - - $this->user->query('COMMIT'); - } - - // Okay, now get the image and add it to the design - - try { - $imagefile = ImageFile::fromUpload('image'); - } catch (Exception $e) { - $this->clientError($e->getMessage(), 400, $this->format); - return; - } - - $filename = Design::filename( - $design->id, - image_type_to_extension($imagefile->type), - common_timestamp() - ); - - $filepath = Design::path($filename); - - move_uploaded_file($imagefile->filepath, $filepath); - - // delete any old backround img laying around - - if (isset($design->backgroundimage)) { - @unlink(Design::path($design->backgroundimage)); - } - - $original = clone($design); - $design->backgroundimage = $filename; - $design->setDisposition(true, false, ($this->tile == 'true')); - - $result = $design->update($original); - - if ($result === false) { - common_log_db_error($design, 'UPDATE', __FILE__); - // TRANS: Error displayed when updating design settings fails. - $this->showForm(_('Could not update your design.')); - return; - } - - $profile = $this->user->getProfile(); - - if (empty($profile)) { - // TRANS: Error message displayed when referring to a user without a profile. - $this->clientError(_('User has no profile.')); - return; - } - - $twitter_user = $this->twitterUserArray($profile, true); - - if ($this->format == 'xml') { - $this->initDocument('xml'); - $this->showTwitterXmlUser($twitter_user, 'user', true); - $this->endDocument('xml'); - } elseif ($this->format == 'json') { - $this->initDocument('json'); - $this->showJsonObjects($twitter_user); - $this->endDocument('json'); - } - } -} diff --git a/actions/apiaccountupdateprofilecolors.php b/actions/apiaccountupdateprofilecolors.php deleted file mode 100644 index 4fa85c6877..0000000000 --- a/actions/apiaccountupdateprofilecolors.php +++ /dev/null @@ -1,242 +0,0 @@ -. - * - * @category API - * @package StatusNet - * @author Zach Copley - * @copyright 2009-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')) { - exit(1); -} - -require_once INSTALLDIR . '/lib/apiauth.php'; - -/** - * Sets one or more hex values that control the color scheme of the - * authenticating user's design - * - * @category API - * @package StatusNet - * @author Zach Copley - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ -class ApiAccountUpdateProfileColorsAction extends ApiAuthAction -{ - var $profile_background_color = null; - var $profile_text_color = null; - var $profile_link_color = null; - var $profile_sidebar_fill_color = null; - var $profile_sidebar_border_color = null; - - /** - * Take arguments for running - * - * @param array $args $_REQUEST args - * - * @return boolean success flag - */ - function prepare($args) - { - parent::prepare($args); - - $this->user = $this->auth_user; - - $this->profile_background_color - = $this->trimmed('profile_background_color'); - $this->profile_text_color - = $this->trimmed('profile_text_color'); - $this->profile_link_color - = $this->trimmed('profile_link_color'); - $this->profile_sidebar_fill_color - = $this->trimmed('profile_sidebar_fill_color'); - - // XXX: we don't support changing the sidebar border color - // in our designs. - - $this->profile_sidebar_border_color - = $this->trimmed('profile_sidebar_border_color'); - - // XXX: Unlike Twitter, we do allow people to change the 'content color' - - $this->profile_content_color = $this->trimmed('profile_content_color'); - - return true; - } - - /** - * Handle the request - * - * Try to save the user's colors in her design. Create a new design - * if the user doesn't already have one. - * - * @param array $args $_REQUEST data (unused) - * - * @return void - */ - function handle($args) - { - parent::handle($args); - - if ($_SERVER['REQUEST_METHOD'] != 'POST') { - $this->clientError( - // TRANS: Client error. POST is a HTTP command. It should not be translated. - _('This method requires a POST.'), - 400, $this->format - ); - return; - } - - if (!in_array($this->format, array('xml', 'json'))) { - $this->clientError( - // TRANS: Client error displayed when coming across a non-supported API method. - _('API method not found.'), - 404, - $this->format - ); - return; - } - - $design = $this->user->getDesign(); - - if (!empty($design)) { - $original = clone($design); - - try { - $this->setColors($design); - } catch (WebColorException $e) { - $this->clientError($e->getMessage(), 400, $this->format); - return false; - } - - $result = $design->update($original); - - if ($result === false) { - common_log_db_error($design, 'UPDATE', __FILE__); - // TRANS: Client error displayed when a database error occurs updating profile colours. - $this->clientError(_('Could not update your design.')); - return; - } - } else { - $this->user->query('BEGIN'); - - // save new design - $design = new Design(); - - try { - $this->setColors($design); - } catch (WebColorException $e) { - $this->clientError($e->getMessage(), 400, $this->format); - return false; - } - - $id = $design->insert(); - - if (empty($id)) { - common_log_db_error($id, 'INSERT', __FILE__); - // TRANS: Client error displayed when a database error occurs inserting profile colours. - $this->clientError(_('Unable to save your design settings.')); - return; - } - - $original = clone($this->user); - $this->user->design_id = $id; - $result = $this->user->update($original); - - if (empty($result)) { - common_log_db_error($original, 'UPDATE', __FILE__); - // TRANS: Client error displayed when a database error occurs updating profile colours. - $this->clientError(_('Unable to save your design settings.')); - $this->user->query('ROLLBACK'); - return; - } - - $this->user->query('COMMIT'); - } - - $profile = $this->user->getProfile(); - - if (empty($profile)) { - // TRANS: Error message displayed when referring to a user without a profile. - $this->clientError(_('User has no profile.')); - return; - } - - $twitter_user = $this->twitterUserArray($profile, true); - - if ($this->format == 'xml') { - $this->initDocument('xml'); - $this->showTwitterXmlUser($twitter_user, 'user', true); - $this->endDocument('xml'); - } elseif ($this->format == 'json') { - $this->initDocument('json'); - $this->showJsonObjects($twitter_user); - $this->endDocument('json'); - } - } - - /** - * Sets the user's design colors based on the request parameters - * - * @param Design $design the user's Design - * - * @return void - */ - function setColors($design) - { - $bgcolor = empty($this->profile_background_color) ? - null : new WebColor($this->profile_background_color); - $tcolor = empty($this->profile_text_color) ? - null : new WebColor($this->profile_text_color); - $sbcolor = empty($this->profile_sidebar_fill_color) ? - null : new WebColor($this->profile_sidebar_fill_color); - $lcolor = empty($this->profile_link_color) ? - null : new WebColor($this->profile_link_color); - $ccolor = empty($this->profile_content_color) ? - null : new WebColor($this->profile_content_color); - - if (!empty($bgcolor)) { - $design->backgroundcolor = $bgcolor->intValue(); - } - - if (!empty($ccolor)) { - $design->contentcolor = $ccolor->intValue(); - } - - if (!empty($sbcolor)) { - $design->sidebarcolor = $sbcolor->intValue(); - } - - if (!empty($tcolor)) { - $design->textcolor = $tcolor->intValue(); - } - - if (!empty($lcolor)) { - $design->linkcolor = $lcolor->intValue(); - } - - return true; - } -} diff --git a/actions/blockedfromgroup.php b/actions/blockedfromgroup.php index dd916b170a..07ed41e414 100644 --- a/actions/blockedfromgroup.php +++ b/actions/blockedfromgroup.php @@ -40,7 +40,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class BlockedfromgroupAction extends GroupDesignAction +class BlockedfromgroupAction extends GroupAction { var $page = null; diff --git a/actions/designadminpanel.php b/actions/designadminpanel.php deleted file mode 100644 index a77b842fe3..0000000000 --- a/actions/designadminpanel.php +++ /dev/null @@ -1,738 +0,0 @@ -. - * - * @category Settings - * @package StatusNet - * @author Evan Prodromou - * @author Zach Copley - * @author Sarven Capadisli - * @copyright 2008-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/ - */ - -if (!defined('STATUSNET')) { - exit(1); -} - -/** - * Administer design settings - * - * @category Admin - * @package StatusNet - * @author Evan Prodromou - * @author Zach Copley - * @author Sarven Capadisli - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ -class DesignadminpanelAction extends AdminPanelAction -{ - /* The default site design */ - var $design = null; - - /** - * Returns the page title - * - * @return string page title - */ - function title() - { - // TRANS: Message used as title for design settings for the site. - return _('Design'); - } - - /** - * Instructions for using this form. - * - * @return string instructions - */ - function getInstructions() - { - // TRANS: Instructions for design adminsitration panel. - return _('Design settings for this StatusNet site'); - } - - /** - * Get the default design and show the design admin panel form - * - * @return void - */ - function showForm() - { - $this->design = Design::siteDesign(); - $form = new DesignAdminPanelForm($this); - $form->show(); - return; - } - - /** - * Save settings from the form - * - * @return void - */ - function saveSettings() - { - if ($this->arg('save')) { - $this->saveDesignSettings(); - } else if ($this->arg('defaults')) { - $this->restoreDefaults(); - } else { - // TRANS: Client error displayed when the submitted form contains unexpected data. - $this->clientError(_('Unexpected form submission.')); - } - } - - /** - * Save the new design settings - * - * @return void - */ - function saveDesignSettings() - { - // Workaround for PHP returning empty $_POST and $_FILES when POST - // length > post_max_size in php.ini - - if (empty($_FILES) - && empty($_POST) - && ($_SERVER['CONTENT_LENGTH'] > 0) - ) { - // TRANS: Client error displayed when the number of bytes in a POST request exceeds a limit. - // TRANS: %s is the number of bytes of the CONTENT_LENGTH. - $msg = _m('The server was unable to handle that much POST data (%s byte) due to its current configuration.', - 'The server was unable to handle that much POST data (%s bytes) due to its current configuration.', - intval($_SERVER['CONTENT_LENGTH'])); - $this->clientException(sprintf($msg, $_SERVER['CONTENT_LENGTH'])); - return; - } - - // check for file uploads - - $bgimage = $this->saveBackgroundImage(); - $customTheme = $this->saveCustomTheme(); - - $oldtheme = common_config('site', 'theme'); - if ($customTheme) { - // This feels pretty hacky :D - $this->args['theme'] = $customTheme; - $themeChanged = true; - } else { - $themeChanged = ($this->trimmed('theme') != $oldtheme); - } - - static $settings = array('theme', 'logo', 'ssllogo'); - - $values = array(); - - foreach ($settings as $setting) { - $values[$setting] = $this->trimmed($setting); - } - - $this->validate($values); - - $config = new Config(); - - $config->query('BEGIN'); - - if ($themeChanged) { - // If the theme has changed, reset custom colors and let them pick - // up the new theme's defaults. - $colors = array('background', 'content', 'sidebar', 'text', 'link'); - foreach ($colors as $colorKey) { - // Clear from global config so we see defaults on this page... - $GLOBALS['config']['design'][$colorKey . 'color'] = false; - - // And remove old settings from DB... - $this->deleteSetting('design', $colorKey . 'color'); - } - } else { - // Only save colors from the form if the theme has not changed. - // - // @fixme a future more ajaxy form should allow theme switch - // and color customization in one step. - - $bgcolor = new WebColor($this->trimmed('design_background')); - $ccolor = new WebColor($this->trimmed('design_content')); - $sbcolor = new WebColor($this->trimmed('design_sidebar')); - $tcolor = new WebColor($this->trimmed('design_text')); - $lcolor = new WebColor($this->trimmed('design_links')); - - Config::save('design', 'backgroundcolor', $bgcolor->intValue()); - Config::save('design', 'contentcolor', $ccolor->intValue()); - Config::save('design', 'sidebarcolor', $sbcolor->intValue()); - Config::save('design', 'textcolor', $tcolor->intValue()); - Config::save('design', 'linkcolor', $lcolor->intValue()); - } - - $onoff = $this->arg('design_background-image_onoff'); - - $on = false; - $off = false; - - if ($onoff == 'on') { - $on = true; - } else { - $off = true; - } - - $tile = $this->boolean('design_background-image_repeat'); - - // Hack to use Design's bit setter - $scratch = new Design(); - $scratch->setDisposition($on, $off, $tile); - - Config::save('design', 'disposition', $scratch->disposition); - - foreach ($settings as $setting) { - Config::save('site', $setting, $values[$setting]); - } - - if (isset($bgimage)) { - Config::save('design', 'backgroundimage', $bgimage); - } - - if (common_config('custom_css', 'enabled')) { - $css = $this->arg('css'); - if ($css != common_config('custom_css', 'css')) { - Config::save('custom_css', 'css', $css); - } - } - - $config->query('COMMIT'); - } - - /** - * Restore the default design - * - * @return void - */ - function restoreDefaults() - { - $this->deleteSetting('site', 'logo'); - $this->deleteSetting('site', 'ssllogo'); - $this->deleteSetting('site', 'theme'); - - $settings = array( - 'theme', 'backgroundimage', 'backgroundcolor', 'contentcolor', - 'sidebarcolor', 'textcolor', 'linkcolor', 'disposition' - ); - - foreach ($settings as $setting) { - $this->deleteSetting('design', $setting); - } - - // XXX: Should we restore the default dir settings, etc.? --Z - - // XXX: I can't get it to show the new settings without forcing - // this terrible reload -- FIX ME! - common_redirect(common_local_url('designadminpanel'), 303); - } - - /** - * Save the background image if the user uploaded one - * - * @return string $filename the filename of the image - */ - function saveBackgroundImage() - { - $filename = null; - if (isset($_FILES['design_background-image_file']['error']) && - $_FILES['design_background-image_file']['error'] == - UPLOAD_ERR_OK) { - - $filepath = null; - - try { - $imagefile = - ImageFile::fromUpload('design_background-image_file'); - } catch (Exception $e) { - $this->clientError('Unable to save background image.'); - return; - } - - // Note: site design background image has a special filename - - $filename = Design::filename('site-design-background', - image_type_to_extension($imagefile->type), - common_timestamp()); - - $filepath = Design::path($filename); - - move_uploaded_file($imagefile->filepath, $filepath); - - // delete any old backround img laying around - - if (isset($this->design->backgroundimage)) { - @unlink(Design::path($design->backgroundimage)); - } - - return $filename; - } - } - - /** - * Save the custom theme if the user uploaded one. - * - * @return mixed custom theme name, if succesful, or null if no theme upload. - * @throws ClientException for invalid theme archives - * @throws ServerException if trouble saving the theme files - */ - function saveCustomTheme() - { - if (common_config('theme_upload', 'enabled') && - $_FILES['design_upload_theme']['error'] == UPLOAD_ERR_OK) { - - $upload = ThemeUploader::fromUpload('design_upload_theme'); - $basedir = common_config('local', 'dir'); - if (empty($basedir)) { - $basedir = INSTALLDIR . '/local'; - } - $name = 'custom'; // @todo allow multiples, custom naming? - $outdir = $basedir . '/theme/' . $name; - $upload->extract($outdir); - return $name; - } else { - return null; - } - } - - /** - * Attempt to validate setting values - * - * @return void - */ - function validate(&$values) - { - if (!empty($values['logo']) && - !Validate::uri($values['logo'], array('allowed_schemes' => array('http', 'https')))) { - // TRANS: Client error displayed when a logo URL does is not valid. - $this->clientError(_('Invalid logo URL.')); - } - - if (!empty($values['ssllogo']) && - !Validate::uri($values['ssllogo'], array('allowed_schemes' => array('https')))) { - // TRANS: Client error displayed when an SSL logo URL is invalid. - $this->clientError(_('Invalid SSL logo URL.')); - } - - if (!in_array($values['theme'], Theme::listAvailable())) { - // TRANS: Client error displayed when a theme is submitted through the form that is not in the theme list. - // TRANS: %s is the chosen unavailable theme. - $this->clientError(sprintf(_('Theme not available: %s.'), $values['theme'])); - } - } - - /** - * Add the Farbtastic stylesheet - * - * @return void - */ - function showStylesheets() - { - parent::showStylesheets(); - $this->cssLink('js/farbtastic/farbtastic.css',null,'screen, projection, tv'); - } - - /** - * Add the Farbtastic scripts - * - * @return void - */ - function showScripts() - { - parent::showScripts(); - - $this->script('farbtastic/farbtastic.js'); - $this->script('userdesign.go.js'); - - $this->autofocus('design_background-image_file'); - } - -} - -class DesignAdminPanelForm extends AdminForm -{ - - /** - * ID of the form - * - * @return int ID of the form - */ - function id() - { - return 'form_design_admin_panel'; - } - - /** - * class of the form - * - * @return string class of the form - */ - function formClass() - { - return 'form_settings'; - } - - /** - * HTTP method used to submit the form - * - * For image data we need to send multipart/form-data - * so we set that here too - * - * @return string the method to use for submitting - */ - function method() - { - $this->enctype = 'multipart/form-data'; - - return 'post'; - } - - /** - * Action of the form - * - * @return string URL of the action - */ - function action() - { - return common_local_url('designadminpanel'); - } - - /** - * Data elements of the form - * - * @return void - */ - function formData() - { - $this->showLogo(); - $this->showTheme(); - $this->showBackground(); - $this->showColors(); - $this->showAdvanced(); - } - - function showLogo() - { - $this->out->elementStart('fieldset', array('id' => 'settings_design_logo')); - // TRANS: Fieldset legend for form to change logo. - $this->out->element('legend', null, _('Change logo')); - - $this->out->elementStart('ul', 'form_data'); - - $this->li(); - $this->input('logo', - // TRANS: Field label for StatusNet site logo. - _('Site logo'), - // TRANS: Title for field label for StatusNet site logo. - 'Logo for the site (full URL).'); - $this->unli(); - - $this->li(); - $this->input('ssllogo', - // TRANS: Field label for SSL StatusNet site logo. - _('SSL logo'), - // TRANS: Title for field label for SSL StatusNet site logo. - 'Logo to show on SSL pages.'); - $this->unli(); - - $this->out->elementEnd('ul'); - - $this->out->elementEnd('fieldset'); - - } - - function showTheme() - { - $this->out->elementStart('fieldset', array('id' => 'settings_design_theme')); - // TRANS: Fieldset legend for form change StatusNet site's theme. - $this->out->element('legend', null, _('Change theme')); - - $this->out->elementStart('ul', 'form_data'); - - $themes = Theme::listAvailable(); - - // XXX: listAvailable() can return an empty list if you - // screw up your settings, so just in case: - - if (empty($themes)) { - $themes = array('default', 'default'); - } - - asort($themes); - $themes = array_combine($themes, $themes); - - $this->li(); - // TRANS: Field label for dropdown to choose site theme. - $this->out->dropdown('theme', _('Site theme'), - // TRANS: Title for field label for dropdown to choose site theme. - $themes, _('Theme for the site.'), - false, $this->value('theme')); - $this->unli(); - - if (common_config('theme_upload', 'enabled')) { - $this->li(); - // TRANS: Field label for uploading a cutom theme. - $this->out->element('label', array('for' => 'design_upload_theme'), _('Custom theme')); - $this->out->element('input', array('id' => 'design_upload_theme', - 'name' => 'design_upload_theme', - 'type' => 'file')); - // TRANS: Form instructions for uploading a cutom StatusNet theme. - $this->out->element('p', 'form_guide', _('You can upload a custom StatusNet theme as a .ZIP archive.')); - $this->unli(); - } - - $this->out->elementEnd('ul'); - - $this->out->elementEnd('fieldset'); - } - - function showBackground() - { - $design = $this->out->design; - - $this->out->elementStart('fieldset', array('id' => - 'settings_design_background-image')); - // TRANS: Fieldset legend for theme background image. - $this->out->element('legend', null, _('Change background image')); - $this->out->elementStart('ul', 'form_data'); - - $this->li(); - $this->out->element('input', array('name' => 'MAX_FILE_SIZE', - 'type' => 'hidden', - 'id' => 'MAX_FILE_SIZE', - 'value' => ImageFile::maxFileSizeInt())); - $this->out->element('label', array('for' => 'design_background-image_file'), - // TRANS: Field label for background image on theme designer page. - _('Background')); - $this->out->element('input', array('name' => 'design_background-image_file', - 'type' => 'file', - 'id' => 'design_background-image_file')); - $this->out->element('p', 'form_guide', - // TRANS: Form guide for background image upload form on theme designer page. - sprintf(_('You can upload a background image for the site. ' . - 'The maximum file size is %1$s.'), ImageFile::maxFileSize())); - $this->unli(); - - if (!empty($design->backgroundimage)) { - - $this->out->elementStart('li', array('id' => - 'design_background-image_onoff')); - - $this->out->element('img', array('src' => - Design::url($design->backgroundimage))); - - $attrs = array('name' => 'design_background-image_onoff', - 'type' => 'radio', - 'id' => 'design_background-image_on', - 'class' => 'radio', - 'value' => 'on'); - - if ($design->disposition & BACKGROUND_ON) { - $attrs['checked'] = 'checked'; - } - - $this->out->element('input', $attrs); - - $this->out->element('label', array('for' => 'design_background-image_on', - 'class' => 'radio'), - // TRANS: Used as radio button label to add a background image. - _('On')); - - $attrs = array('name' => 'design_background-image_onoff', - 'type' => 'radio', - 'id' => 'design_background-image_off', - 'class' => 'radio', - 'value' => 'off'); - - if ($design->disposition & BACKGROUND_OFF) { - $attrs['checked'] = 'checked'; - } - - $this->out->element('input', $attrs); - - $this->out->element('label', array('for' => 'design_background-image_off', - 'class' => 'radio'), - // TRANS: Used as radio button label to not add a background image. - _('Off')); - // TRANS: Form guide for turning background image on or off on theme designer page. - $this->out->element('p', 'form_guide', _('Turn background image on or off.')); - $this->unli(); - - $this->li(); - $this->out->checkbox('design_background-image_repeat', - // TRANS: Checkbox label to title background image on theme designer page. - _('Tile background image'), - ($design->disposition & BACKGROUND_TILE) ? true : false); - $this->unli(); - } - - $this->out->elementEnd('ul'); - $this->out->elementEnd('fieldset'); - } - - function showColors() - { - $design = $this->out->design; - - $this->out->elementStart('fieldset', array('id' => 'settings_design_color')); - // TRANS: Fieldset legend for theme colors. - $this->out->element('legend', null, _('Change colors')); - - $this->out->elementStart('ul', 'form_data'); - - try { - // @fixme avoid loop unrolling in non-performance-critical contexts like this - - $bgcolor = new WebColor($design->backgroundcolor); - - $this->li(); - // TRANS: Field label for background color selector. - $this->out->element('label', array('for' => 'swatch-1'), _('Background')); - $this->out->element('input', array('name' => 'design_background', - 'type' => 'text', - 'id' => 'swatch-1', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->unli(); - - $ccolor = new WebColor($design->contentcolor); - - $this->li(); - // TRANS: Field label for content color selector. - $this->out->element('label', array('for' => 'swatch-2'), _('Content')); - $this->out->element('input', array('name' => 'design_content', - 'type' => 'text', - 'id' => 'swatch-2', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->unli(); - - $sbcolor = new WebColor($design->sidebarcolor); - - $this->li(); - // TRANS: Field label for sidebar color selector. - $this->out->element('label', array('for' => 'swatch-3'), _('Sidebar')); - $this->out->element('input', array('name' => 'design_sidebar', - 'type' => 'text', - 'id' => 'swatch-3', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->unli(); - - $tcolor = new WebColor($design->textcolor); - - $this->li(); - // TRANS: Field label for text color selector. - $this->out->element('label', array('for' => 'swatch-4'), _('Text')); - $this->out->element('input', array('name' => 'design_text', - 'type' => 'text', - 'id' => 'swatch-4', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->unli(); - - $lcolor = new WebColor($design->linkcolor); - - $this->li(); - // TRANS: Field label for link color selector. - $this->out->element('label', array('for' => 'swatch-5'), _('Links')); - $this->out->element('input', array('name' => 'design_links', - 'type' => 'text', - 'id' => 'swatch-5', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->unli(); - - } catch (WebColorException $e) { - // @fixme normalize them individually! - common_log(LOG_ERR, 'Bad color values in site design: ' . - $e->getMessage()); - } - - $this->out->elementEnd('fieldset'); - - $this->out->elementEnd('ul'); - } - - function showAdvanced() - { - if (common_config('custom_css', 'enabled')) { - $this->out->elementStart('fieldset', array('id' => 'settings_design_advanced')); - // TRANS: Fieldset legend for advanced theme design settings. - $this->out->element('legend', null, _('Advanced')); - $this->out->elementStart('ul', 'form_data'); - - $this->li(); - // TRANS: Field label for custom CSS. - $this->out->element('label', array('for' => 'css'), _('Custom CSS')); - $this->out->element('textarea', array('name' => 'css', - 'id' => 'css', - 'cols' => '50', - 'rows' => '10'), - strval(common_config('custom_css', 'css'))); - $this->unli(); - - $this->out->elementEnd('fieldset'); - $this->out->elementEnd('ul'); - } - } - - /** - * Action elements - * - * @return void - */ - - function formActions() - { - // TRANS: Button text for resetting theme settings. - $this->out->submit('defaults', _m('BUTTON','Use defaults'), 'submit form_action-default', - // TRANS: Title for button for resetting theme settings. - 'defaults', _('Restore default designs.')); - - $this->out->element('input', array('id' => 'settings_design_reset', - 'type' => 'reset', - // TRANS: Button text for resetting theme settings. - 'value' => 'Reset', - 'class' => 'submit form_action-primary', - // TRANS: Title for button for resetting theme settings. - 'title' => _('Reset back to default.'))); - - $this->out->submit('save', - // TRANS: Button text for saving theme settings. - _m('BUTTON','Save'), - 'submit form_action-secondary', - 'save', - // TRANS: Title for button for saving theme settings. - _('Save design.')); - } -} diff --git a/actions/editapplication.php b/actions/editapplication.php index 02fae3eb49..2ba5f6b313 100644 --- a/actions/editapplication.php +++ b/actions/editapplication.php @@ -22,7 +22,7 @@ * @category Applications * @package StatusNet * @author Zach Copley - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 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/ */ @@ -42,7 +42,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class EditApplicationAction extends OwnerDesignAction +class EditApplicationAction extends Action { var $msg = null; var $owner = null; diff --git a/actions/editgroup.php b/actions/editgroup.php index e46b1481d0..8405dbe292 100644 --- a/actions/editgroup.php +++ b/actions/editgroup.php @@ -23,8 +23,8 @@ * @package StatusNet * @author Evan Prodromou * @author Sarven Capadisli - * @author Zach Copley - * @copyright 2008-2009 StatusNet, Inc. + * @author Zach Copley + * @copyright 2008-2011 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/ */ @@ -45,7 +45,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class EditgroupAction extends GroupDesignAction +class EditgroupAction extends GroupAction { var $msg; diff --git a/actions/editpeopletag.php b/actions/editpeopletag.php index 115049f7ab..00d1fc3a77 100644 --- a/actions/editpeopletag.php +++ b/actions/editpeopletag.php @@ -40,7 +40,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @link http://status.net/ */ -class EditpeopletagAction extends OwnerDesignAction +class EditpeopletagAction extends Action { var $msg, $confirm, $confirm_args=array(); diff --git a/actions/groupdesignsettings.php b/actions/groupdesignsettings.php deleted file mode 100644 index 798064d16c..0000000000 --- a/actions/groupdesignsettings.php +++ /dev/null @@ -1,319 +0,0 @@ -. - * - * @category Settings - * @package StatusNet - * @author Sarven Capadisli - * @author Zach Copley - * @copyright 2008-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/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -require_once INSTALLDIR . '/lib/designsettings.php'; - -/** - * Set a group's design - * - * Saves a design for a given group - * - * @category Settings - * @package StatusNet - * @author Zach Copley - * @author Sarven Capadisli - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ -class GroupDesignSettingsAction extends DesignSettingsAction -{ - var $group = null; - - /** - * Sets the right action for the form, and passes request args into - * the base action - * - * @param array $args misc. arguments - * - * @return boolean true - */ - function prepare($args) - { - parent::prepare($args); - - if (!common_logged_in()) { - // TRANS: Client error displayed trying to change group design settings while not logged in. - $this->clientError(_('You must be logged in to edit a group.')); - return false; - } - - $nickname_arg = $this->trimmed('nickname'); - $nickname = common_canonical_nickname($nickname_arg); - - // Permanent redirect on non-canonical nickname - - if ($nickname_arg != $nickname) { - $args = array('nickname' => $nickname); - common_redirect(common_local_url('groupdesignsettings', $args), 301); - return false; - } - - if (!$nickname) { - // TRANS: Client error displayed trying to change group design settings without providing a group nickname. - $this->clientError(_('No nickname.'), 404); - return false; - } - - $groupid = $this->trimmed('groupid'); - - if ($groupid) { - $this->group = User_group::staticGet('id', $groupid); - } else { - $local = Local_group::staticGet('nickname', $nickname); - if ($local) { - $this->group = User_group::staticGet('id', $local->group_id); - } - } - - if (!$this->group) { - // TRANS: Client error displayed trying to change group design settings while providing a nickname for a non-existing group. - $this->clientError(_('No such group.'), 404); - return false; - } - - $cur = common_current_user(); - - if (!$cur->isAdmin($this->group)) { - // TRANS: Client error displayed trying to change group design settings without being a (group) admin. - $this->clientError(_('You must be an admin to edit the group.'), 403); - return false; - } - - $this->submitaction = common_local_url('groupdesignsettings', - array('nickname' => $this->group->nickname)); - - return true; - } - - /** - * A design for this action - * - * if the group attribute has been set, returns that group's - * design. - * - * @return Design a design object to use - */ - function getDesign() - { - - if (empty($this->group)) { - return null; - } - - return $this->group->getDesign(); - } - - /** - * Title of the page - * - * @return string Title of the page - */ - - function title() - { - // TRANS: Title group design settings page. - return _('Group design'); - } - - /** - * Instructions for use - * - * @return instructions for use - */ - function getInstructions() - { - // TRANS: Instructions for group design settings page. - return _('Customize the way your group looks ' . - 'with a background image and a colour palette of your choice.'); - } - - /** - * Override to show group nav stuff - * - * @return nothing - */ - function showObjectNav() - { - $nav = new GroupNav($this, $this->group); - $nav->show(); - } - - /** - * Override to show default nav stuff - * - * @return nothing - */ - function showLocalNav() - { - Action::showLocalNav(); - } - - /** - * Get the design we want to edit - * - * @return Design - */ - function getWorkingDesign() - { - $design = null; - - if (isset($this->group)) { - $design = $this->group->getDesign(); - } - - return $design; - } - - /** - * Content area of the page - * - * Shows a form for changing the design - * - * @return void - */ - function showContent() - { - $design = $this->getWorkingDesign(); - - if (empty($design)) { - $design = Design::siteDesign(); - } - - $this->showDesignForm($design); - } - - /** - * Save or update the group's design settings - * - * @return void - */ - function saveDesign() - { - try { - $bgcolor = new WebColor($this->trimmed('design_background')); - $ccolor = new WebColor($this->trimmed('design_content')); - $sbcolor = new WebColor($this->trimmed('design_sidebar')); - $tcolor = new WebColor($this->trimmed('design_text')); - $lcolor = new WebColor($this->trimmed('design_links')); - } catch (WebColorException $e) { - $this->showForm($e->getMessage()); - return; - } - - $onoff = $this->arg('design_background-image_onoff'); - - $on = false; - $off = false; - $tile = false; - - if ($onoff == 'on') { - $on = true; - } else { - $off = true; - } - - $repeat = $this->boolean('design_background-image_repeat'); - - if ($repeat) { - $tile = true; - } - - $design = $this->group->getDesign(); - - if (!empty($design)) { - // update design - - $original = clone($design); - - $design->backgroundcolor = $bgcolor->intValue(); - $design->contentcolor = $ccolor->intValue(); - $design->sidebarcolor = $sbcolor->intValue(); - $design->textcolor = $tcolor->intValue(); - $design->linkcolor = $lcolor->intValue(); - - $design->setDisposition($on, $off, $tile); - - $result = $design->update($original); - - if ($result === false) { - common_log_db_error($design, 'UPDATE', __FILE__); - // TRANS: Form validation error displayed when group design settings could not be updated because of an application issue. - $this->showForm(_('Unable to update your design settings.')); - return; - } - } else { - $this->group->query('BEGIN'); - - // save new design - - $design = new Design(); - - $design->backgroundcolor = $bgcolor->intValue(); - $design->contentcolor = $ccolor->intValue(); - $design->sidebarcolor = $sbcolor->intValue(); - $design->textcolor = $tcolor->intValue(); - $design->linkcolor = $lcolor->intValue(); - - $design->setDisposition($on, $off, $tile); - - $id = $design->insert(); - - if (empty($id)) { - common_log_db_error($id, 'INSERT', __FILE__); - // TRANS: Form validation error displayed when group design settings could not be saved because of an application issue. - $this->showForm(_('Unable to save your design settings.')); - return; - } - - $original = clone($this->group); - $this->group->design_id = $id; - $result = $this->group->update($original); - - if (empty($result)) { - common_log_db_error($original, 'UPDATE', __FILE__); - // TRANS: Form validation error displayed when group design settings could not be saved because of an application issue. - $this->showForm(_('Unable to save your design settings.')); - $this->group->query('ROLLBACK'); - return; - } - - $this->group->query('COMMIT'); - } - - $this->saveBackgroundImage($design); - - // TRANS: Form text to confirm saved group design settings. - $this->showForm(_('Design preferences saved.'), true); - } -} diff --git a/actions/grouplogo.php b/actions/grouplogo.php index a6694cd837..c5a106520d 100644 --- a/actions/grouplogo.php +++ b/actions/grouplogo.php @@ -23,7 +23,7 @@ * @package StatusNet * @author Evan Prodromou * @author Zach Copley - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 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/ */ @@ -49,7 +49,7 @@ define('MAX_ORIGINAL', 480); * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class GrouplogoAction extends GroupDesignAction +class GrouplogoAction extends GroupAction { var $mode = null; var $imagefile = null; diff --git a/actions/groupmembers.php b/actions/groupmembers.php index 2bb35ceddc..df949206e7 100644 --- a/actions/groupmembers.php +++ b/actions/groupmembers.php @@ -43,7 +43,7 @@ require_once INSTALLDIR.'/lib/publicgroupnav.php'; * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class GroupmembersAction extends GroupDesignAction +class GroupmembersAction extends GroupAction { var $page = null; diff --git a/actions/groupqueue.php b/actions/groupqueue.php index 7cc32a9c69..2a7239400e 100644 --- a/actions/groupqueue.php +++ b/actions/groupqueue.php @@ -43,7 +43,7 @@ require_once INSTALLDIR.'/lib/publicgroupnav.php'; * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class GroupqueueAction extends GroupDesignAction +class GroupqueueAction extends GroupAction { var $page = null; diff --git a/actions/invite.php b/actions/invite.php index 1bfc9f76d3..75800aa858 100644 --- a/actions/invite.php +++ b/actions/invite.php @@ -20,7 +20,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } // @todo XXX: Add documentation. -class InviteAction extends CurrentUserDesignAction +class InviteAction extends Action { var $mode = null; var $error = null; diff --git a/actions/newapplication.php b/actions/newapplication.php index 93ef417f63..7c0a6551b2 100644 --- a/actions/newapplication.php +++ b/actions/newapplication.php @@ -42,7 +42,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class NewApplicationAction extends OwnerDesignAction +class NewApplicationAction extends Action { var $msg; diff --git a/actions/pathsadminpanel.php b/actions/pathsadminpanel.php index 0b4a5ff952..83ab776a60 100644 --- a/actions/pathsadminpanel.php +++ b/actions/pathsadminpanel.php @@ -364,61 +364,7 @@ class PathsAdminPanelForm extends AdminForm $this->out->elementEnd('fieldset'); $this->out->elementStart('fieldset', array('id' => - 'settings_design_background-paths')); - // TRANS: Fieldset legend in Paths admin panel. - $this->out->element('legend', null, _('Backgrounds')); - $this->out->elementStart('ul', 'form_data'); - - $this->li(); - $this->input('server', - // TRANS: Field label in Paths admin panel. - _('Server'), - // TRANS: Tooltip for field label in Paths admin panel. - _('Server for backgrounds.'), - 'background'); - $this->unli(); - - $this->li(); - $this->input('path', - // TRANS: Field label in Paths admin panel. - _('Path'), - // TRANS: Tooltip for field label in Paths admin panel. - _('Web path to backgrounds.'), - 'background'); - $this->unli(); - - $this->li(); - $this->input('sslserver', - // TRANS: Field label in Paths admin panel. - _('SSL server'), - // TRANS: Tooltip for field label in Paths admin panel. - _('Server for backgrounds on SSL pages.'), - 'background'); - $this->unli(); - - $this->li(); - $this->input('sslpath', - // TRANS: Field label in Paths admin panel. - _('SSL path'), - // TRANS: Tooltip for field label in Paths admin panel. - _('Web path to backgrounds on SSL pages.'), - 'background'); - $this->unli(); - - $this->li(); - $this->input('dir', - // TRANS: Field label in Paths admin panel. - _('Directory'), - // TRANS: Tooltip for field label in Paths admin panel. - _('Directory where backgrounds are located.'), - 'background'); - $this->unli(); - - $this->out->elementEnd('ul'); - $this->out->elementEnd('fieldset'); - - $this->out->elementStart('fieldset', array('id' => - 'settings_design_attachments-paths')); + 'settings_attachments-paths')); // TRANS: Fieldset legens in Paths admin panel. $this->out->element('legend', null, _('Attachments')); diff --git a/actions/peopletagged.php b/actions/peopletagged.php index ea25c8675b..424bf2dcbe 100644 --- a/actions/peopletagged.php +++ b/actions/peopletagged.php @@ -22,7 +22,7 @@ * @category Group * @package StatusNet * @author Shashi Gowda - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 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/ */ @@ -42,7 +42,7 @@ require_once(INSTALLDIR.'/lib/profilelist.php'); * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class PeopletaggedAction extends OwnerDesignAction +class PeopletaggedAction extends Action { var $page = null; var $peopletag = null; diff --git a/actions/peopletagsbyuser.php b/actions/peopletagsbyuser.php index d348585c90..0d9bd50faa 100644 --- a/actions/peopletagsbyuser.php +++ b/actions/peopletagsbyuser.php @@ -22,7 +22,7 @@ * @category Personal * @package StatusNet * @author Shashi Gowda - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 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/ */ @@ -33,7 +33,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { require_once INSTALLDIR.'/lib/peopletaglist.php'; -class PeopletagsbyuserAction extends OwnerDesignAction +class PeopletagsbyuserAction extends Action { var $page = null; var $tagger = null; diff --git a/actions/peopletagsforuser.php b/actions/peopletagsforuser.php index 9883bd3657..cc28133940 100644 --- a/actions/peopletagsforuser.php +++ b/actions/peopletagsforuser.php @@ -22,7 +22,7 @@ * @category Personal * @package StatusNet * @author Shashi Gowda - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 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/ */ @@ -33,7 +33,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { require_once INSTALLDIR.'/lib/peopletaglist.php'; -class PeopletagsforuserAction extends OwnerDesignAction +class PeopletagsforuserAction extends Action { var $page = null; var $tagged = null; diff --git a/actions/peopletagsubscribers.php b/actions/peopletagsubscribers.php index ebc3a9f494..e371799efb 100644 --- a/actions/peopletagsubscribers.php +++ b/actions/peopletagsubscribers.php @@ -22,7 +22,7 @@ * @category Group * @package StatusNet * @author Evan Prodromou - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 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/ */ @@ -42,7 +42,7 @@ require_once(INSTALLDIR.'/lib/profilelist.php'); * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class PeopletagsubscribersAction extends OwnerDesignAction +class PeopletagsubscribersAction extends Action { var $page = null; var $peopletag = null; diff --git a/actions/peopletagsubscriptions.php b/actions/peopletagsubscriptions.php index b65542e074..d857fb2356 100644 --- a/actions/peopletagsubscriptions.php +++ b/actions/peopletagsubscriptions.php @@ -22,7 +22,7 @@ * @category Personal * @package StatusNet * @author Shashi Gowda - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 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/ */ @@ -33,7 +33,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { require_once INSTALLDIR.'/lib/peopletaglist.php'; -class PeopletagsubscriptionsAction extends OwnerDesignAction +class PeopletagsubscriptionsAction extends Action { var $page = null; var $profile = null; diff --git a/actions/recoverpassword.php b/actions/recoverpassword.php index 47a947dc0c..8d731cb871 100644 --- a/actions/recoverpassword.php +++ b/actions/recoverpassword.php @@ -273,109 +273,25 @@ class RecoverpasswordAction extends Action function recoverPassword() { $nore = $this->trimmed('nicknameoremail'); + if (!$nore) { // TRANS: Form instructions for password recovery form. $this->showForm(_('Enter a nickname or email address.')); return; } - $user = User::staticGet('email', common_canonical_email($nore)); - - if (!$user) { - try { - $user = User::staticGet('nickname', common_canonical_nickname($nore)); - } catch (NicknameException $e) { - // invalid - } + try { + User::recoverPassword($nore); + $this->mode = 'sent'; + // TRANS: User notification after an e-mail with instructions was sent from the password recovery form. + $this->msg = _('Instructions for recovering your password ' . + 'have been sent to the email address registered to your ' . + 'account.'); + $this->success = true; + $this->showPage(); + } catch (Exception $e) { + $this->success = false; } - - // See if it's an unconfirmed email address - - if (!$user) { - // Warning: it may actually be legit to have multiple folks - // who have claimed, but not yet confirmed, the same address. - // We'll only send to the first one that comes up. - $confirm_email = new Confirm_address(); - $confirm_email->address = common_canonical_email($nore); - $confirm_email->address_type = 'email'; - $confirm_email->find(); - if ($confirm_email->fetch()) { - $user = User::staticGet($confirm_email->user_id); - } else { - $confirm_email = null; - } - } else { - $confirm_email = null; - } - - if (!$user) { - // TRANS: Information on password recovery form if no known username or e-mail address was specified. - $this->showForm(_('No user with that email address or username.')); - return; - } - - // Try to get an unconfirmed email address if they used a user name - - if (!$user->email && !$confirm_email) { - $confirm_email = new Confirm_address(); - $confirm_email->user_id = $user->id; - $confirm_email->address_type = 'email'; - $confirm_email->find(); - if (!$confirm_email->fetch()) { - $confirm_email = null; - } - } - - if (!$user->email && !$confirm_email) { - // TRANS: Client error displayed on password recovery form if a user does not have a registered e-mail address. - $this->clientError(_('No registered email address for that user.')); - return; - } - - // Success! We have a valid user and a confirmed or unconfirmed email address - - $confirm = new Confirm_address(); - $confirm->code = common_confirmation_code(128); - $confirm->address_type = 'recover'; - $confirm->user_id = $user->id; - $confirm->address = (!empty($user->email)) ? $user->email : $confirm_email->address; - - if (!$confirm->insert()) { - common_log_db_error($confirm, 'INSERT', __FILE__); - // TRANS: Server error displayed if e-mail address confirmation fails in the database on the password recovery form. - $this->serverError(_('Error saving address confirmation.')); - return; - } - - // @todo FIXME: needs i18n. - $body = "Hey, $user->nickname."; - $body .= "\n\n"; - $body .= 'Someone just asked for a new password ' . - 'for this account on ' . common_config('site', 'name') . '.'; - $body .= "\n\n"; - $body .= 'If it was you, and you want to confirm, use the URL below:'; - $body .= "\n\n"; - $body .= "\t".common_local_url('recoverpassword', - array('code' => $confirm->code)); - $body .= "\n\n"; - $body .= 'If not, just ignore this message.'; - $body .= "\n\n"; - $body .= 'Thanks for your time, '; - $body .= "\n"; - $body .= common_config('site', 'name'); - $body .= "\n"; - - $headers = _mail_prepare_headers('recoverpassword', $user->nickname, $user->nickname); - // TRANS: Subject for password recovery e-mail. - mail_to_user($user, _('Password recovery requested'), $body, $headers, $confirm->address); - - $this->mode = 'sent'; - // TRANS: User notification after an e-mail with instructions was sent from the password recovery form. - $this->msg = _('Instructions for recovering your password ' . - 'have been sent to the email address registered to your ' . - 'account.'); - $this->success = true; - $this->showPage(); } function resetPassword() diff --git a/actions/replies.php b/actions/replies.php index 385ca4c6cc..cf248a7785 100644 --- a/actions/replies.php +++ b/actions/replies.php @@ -22,7 +22,7 @@ * @category Personal * @package StatusNet * @author Evan Prodromou - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 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/ */ @@ -44,7 +44,7 @@ require_once INSTALLDIR.'/lib/feedlist.php'; * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class RepliesAction extends OwnerDesignAction +class RepliesAction extends Action { var $page = null; var $notice; diff --git a/actions/showapplication.php b/actions/showapplication.php index c9cdbf1848..f41c57643e 100644 --- a/actions/showapplication.php +++ b/actions/showapplication.php @@ -22,7 +22,7 @@ * @category Application * @package StatusNet * @author Zach Copley - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 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/ */ @@ -40,7 +40,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class ShowApplicationAction extends OwnerDesignAction +class ShowApplicationAction extends Action { /** * Application to show diff --git a/actions/showfavorites.php b/actions/showfavorites.php index 67ee914a91..65bb8f1beb 100644 --- a/actions/showfavorites.php +++ b/actions/showfavorites.php @@ -22,7 +22,7 @@ * @category Personal * @package StatusNet * @author Evan Prodromou - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 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/ */ @@ -44,7 +44,7 @@ require_once INSTALLDIR.'/lib/feedlist.php'; * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class ShowfavoritesAction extends OwnerDesignAction +class ShowfavoritesAction extends Action { /** User we're getting the faves of */ var $user = null; diff --git a/actions/showgroup.php b/actions/showgroup.php index 5bb90e86dd..530deff622 100644 --- a/actions/showgroup.php +++ b/actions/showgroup.php @@ -23,7 +23,7 @@ * @package StatusNet * @author Evan Prodromou * @author Sarven Capadisli - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 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/ */ @@ -46,7 +46,7 @@ define('MEMBERS_PER_SECTION', 27); * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class ShowgroupAction extends GroupDesignAction +class ShowgroupAction extends Action { /** page we're viewing. */ var $page = null; diff --git a/actions/shownotice.php b/actions/shownotice.php index ea9041efb5..5501a0af42 100644 --- a/actions/shownotice.php +++ b/actions/shownotice.php @@ -22,7 +22,7 @@ * @category Personal * @package StatusNet * @author Evan Prodromou - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 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/ */ @@ -44,7 +44,7 @@ require_once INSTALLDIR.'/lib/feedlist.php'; * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class ShownoticeAction extends OwnerDesignAction +class ShownoticeAction extends Action { /** * Notice object to show diff --git a/actions/siteadminpanel.php b/actions/siteadminpanel.php index 29813ca3b9..11636b0b5c 100644 --- a/actions/siteadminpanel.php +++ b/actions/siteadminpanel.php @@ -24,7 +24,7 @@ * @author Evan Prodromou * @author Zach Copley * @author Sarven Capadisli - * @copyright 2008-2010 StatusNet, Inc. + * @copyright 2008-2011 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/ */ @@ -88,9 +88,19 @@ class SiteadminpanelAction extends AdminPanelAction function saveSettings() { static $settings = array( - 'site' => array('name', 'broughtby', 'broughtbyurl', - 'email', 'timezone', 'language', - 'site', 'textlimit', 'dupelimit'), + 'site' => array( + 'name', + 'broughtby', + 'broughtbyurl', + 'email', + 'timezone', + 'language', + 'site', + 'textlimit', + 'dupelimit', + 'logo', + 'ssllogo' + ) ); $values = array(); @@ -144,6 +154,19 @@ class SiteadminpanelAction extends AdminPanelAction $this->clientError(_('Not a valid email address.')); } + // Validate logos + if (!empty($values['site']['logo']) && + !Validate::uri($values['site']['logo'], array('allowed_schemes' => array('http', 'https')))) { + // TRANS: Client error displayed when a logo URL does is not valid. + $this->clientError(_('Invalid logo URL.')); + } + + if (!empty($values['site']['ssllogo']) && + !Validate::uri($values['site']['ssllogo'], array('allowed_schemes' => array('https')))) { + // TRANS: Client error displayed when an SSL logo URL is invalid. + $this->clientError(_('Invalid SSL logo URL.')); + } + // Validate timezone if (is_null($values['site']['timezone']) || @@ -251,6 +274,8 @@ class SiteAdminPanelForm extends AdminForm $this->out->elementEnd('ul'); $this->out->elementEnd('fieldset'); + $this->showLogo(); + $this->out->elementStart('fieldset', array('id' => 'settings_admin_local')); // TRANS: Fieldset legend on site settings panel. $this->out->element('legend', null, _m('LEGEND','Local')); @@ -307,6 +332,35 @@ class SiteAdminPanelForm extends AdminForm $this->out->elementEnd('fieldset'); } + function showLogo() + { + $this->out->elementStart('fieldset', array('id' => 'settings_site_logo')); + // TRANS: Fieldset legend for form to change logo. + $this->out->element('legend', null, _('Logo')); + + $this->out->elementStart('ul', 'form_data'); + + $this->li(); + $this->input('logo', + // TRANS: Field label for StatusNet site logo. + _('Site logo'), + // TRANS: Title for field label for StatusNet site logo. + 'Logo for the site (full URL).'); + $this->unli(); + + $this->li(); + $this->input('ssllogo', + // TRANS: Field label for SSL StatusNet site logo. + _('SSL logo'), + // TRANS: Title for field label for SSL StatusNet site logo. + 'Logo to show on SSL pages (full URL).'); + $this->unli(); + + $this->out->elementEnd('ul'); + + $this->out->elementEnd('fieldset'); + } + /** * Action elements * diff --git a/actions/userdesignsettings.php b/actions/userdesignsettings.php deleted file mode 100644 index c83815412a..0000000000 --- a/actions/userdesignsettings.php +++ /dev/null @@ -1,365 +0,0 @@ -. - * - * @category Settings - * @package StatusNet - * @author Sarven Capadisli - * @author Zach Copley - * @copyright 2008-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/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -require_once INSTALLDIR . '/lib/designsettings.php'; - -/** - * Set a user's design - * - * Saves a design for a given user - * - * @category Settings - * @package StatusNet - * @author Zach Copley - * @author Sarven Capadisli - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ -class UserDesignSettingsAction extends DesignSettingsAction -{ - /** - * Sets the right action for the form, and passes request args into - * the base action - * - * @param array $args misc. arguments - * - * @return boolean true - */ - - function prepare($args) - { - parent::prepare($args); - $this->submitaction = common_local_url('userdesignsettings'); - return true; - } - - /** - * Title of the page - * - * @return string Title of the page - */ - function title() - { - // TRANS: Title for profile design page. - return _('Profile design'); - } - - /** - * Instructions for use - * - * @return instructions for use - */ - function getInstructions() - { - // TRANS: Instructions for Profile design page. - return _('Customize the way your profile looks ' . - 'with a background image and a colour palette of your choice.'); - } - - /** - * Get the design we want to edit - * - * @return Design - */ - function getWorkingDesign() - { - $user = common_current_user(); - $design = $user->getDesign(); - return $design; - } - - /** - * Content area of the page - * - * Shows a form for changing the design - * - * @return void - */ - function showContent() - { - $design = $this->getWorkingDesign(); - - if (empty($design)) { - $design = Design::siteDesign(); - } - - $this->showDesignForm($design); - } - - /** - * Shows the design settings form - * - * @param Design $design a working design to show - * - * @return nothing - */ - - function showDesignForm($design) - { - $form = new UserDesignForm($this, $design, $this->submitaction); - $form->show(); - } - - /** - * Save or update the user's design settings - * - * @return void - */ - function saveDesign() - { - $this->saveDesignPreferences(); - - foreach ($this->args as $key => $val) { - if (preg_match('/(#ho|ho)Td.*g/i', $val)) { - $this->sethd(); - return; - } - } - - try { - $bgcolor = new WebColor($this->trimmed('design_background')); - $ccolor = new WebColor($this->trimmed('design_content')); - $sbcolor = new WebColor($this->trimmed('design_sidebar')); - $tcolor = new WebColor($this->trimmed('design_text')); - $lcolor = new WebColor($this->trimmed('design_links')); - } catch (WebColorException $e) { - $this->showForm($e->getMessage()); - return; - } - - $onoff = $this->arg('design_background-image_onoff'); - - $on = false; - $off = false; - $tile = false; - - if ($onoff == 'on') { - $on = true; - } else { - $off = true; - } - - $repeat = $this->boolean('design_background-image_repeat'); - - if ($repeat) { - $tile = true; - } - - $user = common_current_user(); - - $design = $user->getDesign(); - - if (!empty($design)) { - $original = clone($design); - - $design->backgroundcolor = $bgcolor->intValue(); - $design->contentcolor = $ccolor->intValue(); - $design->sidebarcolor = $sbcolor->intValue(); - $design->textcolor = $tcolor->intValue(); - $design->linkcolor = $lcolor->intValue(); - - $design->setDisposition($on, $off, $tile); - - $result = $design->update($original); - - if ($result === false) { - common_log_db_error($design, 'UPDATE', __FILE__); - // TRANS: Form validation error on Profile design page when updating design settings has failed. - $this->showForm(_('Could not update your design.')); - return; - } - // update design - } else { - $user->query('BEGIN'); - - // save new design - $design = new Design(); - - $design->backgroundcolor = $bgcolor->intValue(); - $design->contentcolor = $ccolor->intValue(); - $design->sidebarcolor = $sbcolor->intValue(); - $design->textcolor = $tcolor->intValue(); - $design->linkcolor = $lcolor->intValue(); - - $design->setDisposition($on, $off, $tile); - - $id = $design->insert(); - - if (empty($id)) { - common_log_db_error($id, 'INSERT', __FILE__); - // TRANS: Form validation error on Profile design page when saving design settings has failed. - $this->showForm(_('Unable to save your design settings.')); - return; - } - - $original = clone($user); - $user->design_id = $id; - $result = $user->update($original); - - if (empty($result)) { - common_log_db_error($original, 'UPDATE', __FILE__); - // TRANS: Form validation error on Profile design page when saving design settings has failed. - $this->showForm(_('Unable to save your design settings.')); - $user->query('ROLLBACK'); - return; - } - - $user->query('COMMIT'); - - } - - $this->saveBackgroundImage($design); - - // TRANS: Confirmation message on Profile design page when saving design settings has succeeded. - $this->showForm(_('Design preferences saved.'), true); - } - - /** - * Alternate default colors - * - * @return nothing - */ - function sethd() - { - $user = common_current_user(); - $design = $user->getDesign(); - - $user->query('BEGIN'); - - // alternate colors - $design = new Design(); - - $design->backgroundcolor = 16184329; - $design->contentcolor = 16059904; - $design->sidebarcolor = 16059904; - $design->textcolor = 0; - $design->linkcolor = 16777215; - - $design->setDisposition(false, true, false); - - $id = $design->insert(); - - if (empty($id)) { - common_log_db_error($id, 'INSERT', __FILE__); - // TRANS: Form validation error on Profile design page when saving design settings has failed. - $this->showForm(_('Unable to save your design settings.')); - return; - } - - $original = clone($user); - $user->design_id = $id; - $result = $user->update($original); - - if (empty($result)) { - common_log_db_error($original, 'UPDATE', __FILE__); - // TRANS: Form validation error on Profile design page when updating design settings has failed. - $this->showForm(_('Unable to save your design settings.')); - $user->query('ROLLBACK'); - return; - } - - $user->query('COMMIT'); - - $this->saveBackgroundImage($design); - - // TRANS: Succes message on Profile design page when finding an easter egg. - $this->showForm(_('Enjoy your hotdog!'), true); - } - - function saveDesignPreferences() - { - $viewdesigns = $this->boolean('viewdesigns'); - - $user = common_current_user(); - - $original = clone($user); - - $user->viewdesigns = $viewdesigns; - - $result = $user->update($original); - - if ($result === false) { - common_log_db_error($user, 'UPDATE', __FILE__); - // TRANS: Server exception thrown on Profile design page when updating design settings fails. - throw new ServerException(_('Could not update user.')); - } - } -} - -class UserDesignForm extends DesignForm -{ - function __construct($out, $design, $actionurl) - { - parent::__construct($out, $design, $actionurl); - } - - /** - * Legend of the Form - * - * @return void - */ - function formLegend() - { - // TRANS: Form legend on Profile design page. - $this->out->element('legend', null, _('Design settings')); - } - - /** - * Data elements of the form - * - * @return void - */ - - function formData() - { - $user = common_current_user(); - - $this->out->elementStart('ul', 'form_data'); - $this->out->elementStart('li'); - // TRANS: Checkbox label on Profile design page. - $this->out->checkbox('viewdesigns', _('View profile designs'), - // TRANS: Title for checkbox on Profile design page. - - $user->viewdesigns, _('Show or hide profile designs.')); - $this->out->elementEnd('li'); - $this->out->elementEnd('ul'); - - $this->out->elementEnd('fieldset'); - - $this->out->elementStart('fieldset'); - // TRANS: Form legend on Profile design page for form to choose a background image. - $this->out->element('legend', null, _('Background file')); - - parent::formData(); - } -} diff --git a/classes/Design.php b/classes/Design.php deleted file mode 100644 index 464e244b1a..0000000000 --- a/classes/Design.php +++ /dev/null @@ -1,243 +0,0 @@ -. - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -define('BACKGROUND_ON', 1); -define('BACKGROUND_OFF', 2); -define('BACKGROUND_TILE', 4); - -/** - * Table Definition for design - */ - -require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; -require_once INSTALLDIR . '/lib/webcolor.php'; - -class Design extends Memcached_DataObject -{ - ###START_AUTOCODE - /* the code below is auto generated do not remove the above tag */ - - public $__table = 'design'; // table name - public $id; // int(4) primary_key not_null - public $backgroundcolor; // int(4) - public $contentcolor; // int(4) - public $sidebarcolor; // int(4) - public $textcolor; // int(4) - public $linkcolor; // int(4) - public $backgroundimage; // varchar(255) - public $disposition; // tinyint(1) default_1 - - /* Static get */ - function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Design',$k,$v); } - - /* the code above is auto generated do not remove the tag below */ - ###END_AUTOCODE - - function showCSS($out) - { - $css = ''; - - $bgcolor = Design::toWebColor($this->backgroundcolor); - - if (!empty($bgcolor)) { - $css .= 'body { background-color: #' . $bgcolor->hexValue() . ' }' . "\n"; - } - - $ccolor = Design::toWebColor($this->contentcolor); - - if (!empty($ccolor)) { - $css .= '#content { background-color: #'; - $css .= $ccolor->hexValue() . '} '."\n"; - } - - $sbcolor = Design::toWebColor($this->sidebarcolor); - - if (!empty($sbcolor)) { - $css .= '#aside_primary_wrapper, #site_nav_local_views_wrapper { background-color: #'. $sbcolor->hexValue() . ' }' . "\n"; - } - - $tcolor = Design::toWebColor($this->textcolor); - - if (!empty($tcolor)) { - $css .= 'html body { color: #'. $tcolor->hexValue() . ' }'. "\n"; - } - - $lcolor = Design::toWebColor($this->linkcolor); - - if (!empty($lcolor)) { - $css .= 'a { color: #' . $lcolor->hexValue() . ' }' . "\n"; - } - - if (!empty($this->backgroundimage) && - $this->disposition & BACKGROUND_ON) { - - $repeat = ($this->disposition & BACKGROUND_TILE) ? - 'background-repeat:repeat;' : - 'background-repeat:no-repeat;'; - - $css .= 'body { background-image:url(' . - Design::url($this->backgroundimage) . - '); ' . $repeat . ' background-attachment:fixed; }' . "\n"; - } - - if (0 != mb_strlen($css)) { - $out->style($css); - } - } - - static function toWebColor($color) - { - if ($color === null || $color === '') { - return null; - } - - try { - return new WebColor($color); - } catch (WebColorException $e) { - // This shouldn't happen - common_log(LOG_ERR, "Unable to create web color for $color", - __FILE__); - return null; - } - } - - static function filename($id, $extension, $extra=null) - { - return $id . (($extra) ? ('-' . $extra) : '') . $extension; - } - - static function path($filename) - { - $dir = common_config('background', 'dir'); - - if ($dir[strlen($dir)-1] != '/') { - $dir .= '/'; - } - - return $dir . $filename; - } - - static function url($filename) - { - if (StatusNet::isHTTPS()) { - - $sslserver = common_config('background', 'sslserver'); - - if (empty($sslserver)) { - // XXX: this assumes that background dir == site dir + /background/ - // not true if there's another server - if (is_string(common_config('site', 'sslserver')) && - mb_strlen(common_config('site', 'sslserver')) > 0) { - $server = common_config('site', 'sslserver'); - } else if (common_config('site', 'server')) { - $server = common_config('site', 'server'); - } - $path = common_config('site', 'path') . '/background/'; - } else { - $server = $sslserver; - $path = common_config('background', 'sslpath'); - if (empty($path)) { - $path = common_config('background', 'path'); - } - } - - $protocol = 'https'; - - } else { - - $path = common_config('background', 'path'); - - $server = common_config('background', 'server'); - - if (empty($server)) { - $server = common_config('site', 'server'); - } - - $protocol = 'http'; - } - - if ($path[strlen($path)-1] != '/') { - $path .= '/'; - } - - if ($path[0] != '/') { - $path = '/'.$path; - } - - return $protocol.'://'.$server.$path.$filename; - } - - function setDisposition($on, $off, $tile) - { - if ($on) { - $this->disposition |= BACKGROUND_ON; - } else { - $this->disposition &= ~BACKGROUND_ON; - } - - if ($off) { - $this->disposition |= BACKGROUND_OFF; - } else { - $this->disposition &= ~BACKGROUND_OFF; - } - - if ($tile) { - $this->disposition |= BACKGROUND_TILE; - } else { - $this->disposition &= ~BACKGROUND_TILE; - } - } - - /** - * Return a design object based on the configured site design. - * - * @return Design a singleton design object for the site. - */ - - static function siteDesign() - { - static $siteDesign = null; - - if (empty($siteDesign)) { - - $siteDesign = new Design(); - - $attrs = array('backgroundcolor', - 'contentcolor', - 'sidebarcolor', - 'textcolor', - 'linkcolor', - 'backgroundimage', - 'disposition'); - - foreach ($attrs as $attr) { - $val = common_config('design', $attr); - if ($val !== false) { - $siteDesign->$attr = $val; - } - } - } - - return $siteDesign; - } -} diff --git a/classes/User.php b/classes/User.php index 9f79549327..d15c2c0ae6 100644 --- a/classes/User.php +++ b/classes/User.php @@ -61,8 +61,6 @@ class User extends Memcached_DataObject public $subscribe_policy; // tinyint(1) public $urlshorteningservice; // varchar(50) default_ur1.ca public $inboxed; // tinyint(1) - public $design_id; // int(4) - public $viewdesigns; // tinyint(1) default_1 public $private_stream; // tinyint(1) default_0 public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -293,7 +291,6 @@ class User extends Memcached_DataObject $user->emailmicroid = 1; $user->emailpost = 1; $user->jabbermicroid = 1; - $user->viewdesigns = 1; $user->created = common_sql_now(); @@ -714,11 +711,6 @@ class User extends Memcached_DataObject return $profile; } - function getDesign() - { - return Design::staticGet('id', $this->design_id); - } - function hasRight($right) { $profile = $this->getProfile(); @@ -1008,4 +1000,97 @@ class User extends Memcached_DataObject $skip = array('_profile'); return array_diff($vars, $skip); } + + static function recoverPassword($nore) + { + $user = User::staticGet('email', common_canonical_email($nore)); + + if (!$user) { + try { + $user = User::staticGet('nickname', common_canonical_nickname($nore)); + } catch (NicknameException $e) { + // invalid + } + } + + // See if it's an unconfirmed email address + + if (!$user) { + // Warning: it may actually be legit to have multiple folks + // who have claimed, but not yet confirmed, the same address. + // We'll only send to the first one that comes up. + $confirm_email = new Confirm_address(); + $confirm_email->address = common_canonical_email($nore); + $confirm_email->address_type = 'email'; + $confirm_email->find(); + if ($confirm_email->fetch()) { + $user = User::staticGet($confirm_email->user_id); + } else { + $confirm_email = null; + } + } else { + $confirm_email = null; + } + + if (!$user) { + // TRANS: Information on password recovery form if no known username or e-mail address was specified. + throw new ClientError(_('No user with that email address or username.')); + return; + } + + // Try to get an unconfirmed email address if they used a user name + + if (!$user->email && !$confirm_email) { + $confirm_email = new Confirm_address(); + $confirm_email->user_id = $user->id; + $confirm_email->address_type = 'email'; + $confirm_email->find(); + if (!$confirm_email->fetch()) { + $confirm_email = null; + } + } + + if (!$user->email && !$confirm_email) { + // TRANS: Client error displayed on password recovery form if a user does not have a registered e-mail address. + throw new ClientException(_('No registered email address for that user.')); + return; + } + + // Success! We have a valid user and a confirmed or unconfirmed email address + + $confirm = new Confirm_address(); + $confirm->code = common_confirmation_code(128); + $confirm->address_type = 'recover'; + $confirm->user_id = $user->id; + $confirm->address = (!empty($user->email)) ? $user->email : $confirm_email->address; + + if (!$confirm->insert()) { + common_log_db_error($confirm, 'INSERT', __FILE__); + // TRANS: Server error displayed if e-mail address confirmation fails in the database on the password recovery form. + throw new ServerException(_('Error saving address confirmation.')); + return; + } + + // @todo FIXME: needs i18n. + $body = "Hey, $user->nickname."; + $body .= "\n\n"; + $body .= 'Someone just asked for a new password ' . + 'for this account on ' . common_config('site', 'name') . '.'; + $body .= "\n\n"; + $body .= 'If it was you, and you want to confirm, use the URL below:'; + $body .= "\n\n"; + $body .= "\t".common_local_url('recoverpassword', + array('code' => $confirm->code)); + $body .= "\n\n"; + $body .= 'If not, just ignore this message.'; + $body .= "\n\n"; + $body .= 'Thanks for your time, '; + $body .= "\n"; + $body .= common_config('site', 'name'); + $body .= "\n"; + + $headers = _mail_prepare_headers('recoverpassword', $user->nickname, $user->nickname); + // TRANS: Subject for password recovery e-mail. + mail_to_user($user, _('Password recovery requested'), $body, $headers, $confirm->address); + } } diff --git a/classes/User_group.php b/classes/User_group.php index 75de535bd1..6168f219b9 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -22,7 +22,6 @@ class User_group extends Memcached_DataObject public $homepage_logo; // varchar(255) public $stream_logo; // varchar(255) public $mini_logo; // varchar(255) - public $design_id; // int(4) public $created; // datetime not_null default_0000-00-00%2000%3A00%3A00 public $modified; // timestamp not_null default_CURRENT_TIMESTAMP public $uri; // varchar(255) unique_key @@ -339,11 +338,6 @@ class User_group extends Memcached_DataObject return null; } - function getDesign() - { - return Design::staticGet('id', $this->design_id); - } - function getUserMembers() { // XXX: cache this diff --git a/db/core.php b/db/core.php index fe9f4735d9..a9632fe8d4 100644 --- a/db/core.php +++ b/db/core.php @@ -121,8 +121,6 @@ $schema['user'] = array( 'subscribe_policy' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => '0 = anybody can subscribe; 1 = require approval'), 'urlshorteningservice' => array('type' => 'varchar', 'length' => 50, 'default' => 'internal', 'description' => 'service to use for auto-shortening URLs'), 'inboxed' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'has an inbox been created for this user?'), - 'design_id' => array('type' => 'int', 'description' => 'id of a design'), - 'viewdesigns' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'whether to view user-provided designs'), 'private_stream' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to limit all notices to followers only'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), @@ -139,7 +137,6 @@ $schema['user'] = array( 'foreign keys' => array( 'user_id_fkey' => array('profile', array('id' => 'id')), 'user_carrier_fkey' => array('sms_carrier', array('carrier' => 'id')), - 'user_design_id_fkey' => array('design', array('design_id' => 'id')), ), 'indexes' => array( 'user_smsemail_idx' => array('smsemail'), @@ -721,7 +718,6 @@ $schema['user_group'] = array( 'homepage_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'homepage (profile) size logo'), 'stream_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'stream-sized logo'), 'mini_logo' => array('type' => 'varchar', 'length' => 255, 'description' => 'mini logo'), - 'design_id' => array('type' => 'int', 'description' => 'id of a design'), 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), 'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'), @@ -735,9 +731,6 @@ $schema['user_group'] = array( 'unique keys' => array( 'user_group_uri_key' => array('uri'), ), - 'foreign keys' => array( - 'user_group_design_id_fkey' => array('design', array('design_id' => 'id')), - ), 'indexes' => array( 'user_group_nickname_idx' => array('nickname'), ), @@ -886,20 +879,6 @@ $schema['file_to_post'] = array( ), ); -$schema['design'] = array( - 'fields' => array( - 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'design ID'), - 'backgroundcolor' => array('type' => 'int', 'description' => 'main background color'), - 'contentcolor' => array('type' => 'int', 'description' => 'content area background color'), - 'sidebarcolor' => array('type' => 'int', 'description' => 'sidebar background color'), - 'textcolor' => array('type' => 'int', 'description' => 'text color'), - 'linkcolor' => array('type' => 'int', 'description' => 'link color'), - 'backgroundimage' => array('type' => 'varchar', 'length' => 255, 'description' => 'background image, if any'), - 'disposition' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'bit 1 = hide background image, bit 2 = display background image, bit 4 = tile background image'), - ), - 'primary key' => array('id'), -); - $schema['group_block'] = array( 'fields' => array( 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'group profile is blocked from'), diff --git a/lib/action.php b/lib/action.php index 81aa8eb12c..21e5f78db1 100644 --- a/lib/action.php +++ b/lib/action.php @@ -246,20 +246,6 @@ class Action extends HTMLOutputter // lawsuit Event::handle('EndShowUAStyles', array($this)); } - if (Event::handle('StartShowDesign', array($this))) { - - $user = common_current_user(); - - if (empty($user) || $user->viewdesigns) { - $design = $this->getDesign(); - - if (!empty($design)) { - $design->showCSS($this); - } - } - - Event::handle('EndShowDesign', array($this)); - } Event::handle('EndShowStyles', array($this)); if (common_config('custom_css', 'enabled')) { @@ -1365,13 +1351,16 @@ class Action extends HTMLOutputter // lawsuit { // Added @id to li for some control. // XXX: We might want to move this to htmloutputter.php - $lattrs = array(); + $lattrs = array(); + $classes = array(); if ($class !== null) { - $lattrs['class'] = $class; - if ($is_selected) { - $lattrs['class'] = trim('current ' . $lattrs['class']); - } + $classes[] = trim($class); } + if ($is_selected) { + $classes[] = 'current'; + } + + $lattrs['class'] = implode(' ', $classes); (is_null($id)) ? $lattrs : $lattrs['id'] = $id; @@ -1442,16 +1431,6 @@ class Action extends HTMLOutputter // lawsuit return null; } - /** - * A design for this action - * - * @return Design a design object to use - */ - function getDesign() - { - return Design::siteDesign(); - } - /** * Check the session token. * diff --git a/lib/adminpanelaction.php b/lib/adminpanelaction.php index 5642c68d62..4868e9d492 100644 --- a/lib/adminpanelaction.php +++ b/lib/adminpanelaction.php @@ -251,35 +251,6 @@ class AdminPanelAction extends Action return; } - /** - * Delete a design setting - * - * // XXX: Maybe this should go in Design? --Z - * - * @return mixed $result false if something didn't work - */ - function deleteSetting($section, $setting) - { - $config = new Config(); - - $config->section = $section; - $config->setting = $setting; - - if ($config->find(true)) { - $result = $config->delete(); - if (!$result) { - common_log_db_error($config, 'DELETE', __FILE__); - // TRANS: Client error message thrown if design settings could not be deleted in - // TRANS: the admin panel Design. - $this->clientError(_("Unable to delete design setting.")); - return null; - } - return $result; - } - - return null; - } - function canAdmin($name) { $isOK = false; diff --git a/lib/adminpanelnav.php b/lib/adminpanelnav.php index 245438c614..40c4889f27 100644 --- a/lib/adminpanelnav.php +++ b/lib/adminpanelnav.php @@ -94,14 +94,6 @@ class AdminPanelNav extends Menu $menu_title, $action_name == 'siteadminpanel', 'nav_site_admin_panel'); } - if (AdminPanelAction::canAdmin('design')) { - // TRANS: Menu item title in administrator navigation panel. - $menu_title = _('Design configuration'); - // TRANS: Menu item in administrator navigation panel. - $this->out->menuItem(common_local_url('designadminpanel'), _m('MENU', 'Design'), - $menu_title, $action_name == 'designadminpanel', 'nav_design_admin_panel'); - } - if (AdminPanelAction::canAdmin('user')) { // TRANS: Menu item title in administrator navigation panel. $menu_title = _('User configuration'); @@ -163,7 +155,7 @@ class AdminPanelNav extends Menu $menu_title = _('Plugins configuration'); // TRANS: Menu item in administrator navigation panel. $this->out->menuItem(common_local_url('pluginsadminpanel'), _m('MENU','Plugins'), - $menu_title, $action_name == 'pluginsadminpanel', 'nav_design_admin_panel'); + $menu_title, $action_name == 'pluginsadminpanel', 'nav_plugin_admin_panel'); } Event::handle('EndAdminPanelNav', array($this)); diff --git a/lib/apiaction.php b/lib/apiaction.php index c0e5095fd5..64b4284f6a 100644 --- a/lib/apiaction.php +++ b/lib/apiaction.php @@ -218,30 +218,8 @@ class ApiAction extends Action $twitter_user['protected'] = ($user->private_stream) ? true : false; $twitter_user['followers_count'] = $profile->subscriberCount(); - $design = null; - // Note: some profiles don't have an associated user - $defaultDesign = Design::siteDesign(); - - if (!empty($user)) { - $design = $user->getDesign(); - } - - if (empty($design)) { - $design = $defaultDesign; - } - - $color = Design::toWebColor(empty($design->backgroundcolor) ? $defaultDesign->backgroundcolor : $design->backgroundcolor); - $twitter_user['profile_background_color'] = ($color == null) ? '' : '#'.$color->hexValue(); - $color = Design::toWebColor(empty($design->textcolor) ? $defaultDesign->textcolor : $design->textcolor); - $twitter_user['profile_text_color'] = ($color == null) ? '' : '#'.$color->hexValue(); - $color = Design::toWebColor(empty($design->linkcolor) ? $defaultDesign->linkcolor : $design->linkcolor); - $twitter_user['profile_link_color'] = ($color == null) ? '' : '#'.$color->hexValue(); - $color = Design::toWebColor(empty($design->sidebarcolor) ? $defaultDesign->sidebarcolor : $design->sidebarcolor); - $twitter_user['profile_sidebar_fill_color'] = ($color == null) ? '' : '#'.$color->hexValue(); - $twitter_user['profile_sidebar_border_color'] = ''; - $twitter_user['friends_count'] = $profile->subscriptionCount(); $twitter_user['created_at'] = $this->dateTwitter($profile->created); @@ -259,15 +237,6 @@ class ApiAction extends Action $twitter_user['utc_offset'] = $t->format('Z'); $twitter_user['time_zone'] = $timezone; - - $twitter_user['profile_background_image_url'] - = empty($design->backgroundimage) - ? '' : ($design->disposition & BACKGROUND_ON) - ? Design::url($design->backgroundimage) : ''; - - $twitter_user['profile_background_tile'] - = (bool)($design->disposition & BACKGROUND_TILE); - $twitter_user['statuses_count'] = $profile->noticeCount(); // Is the requesting user following this user? diff --git a/lib/currentuserdesignaction.php b/lib/currentuserdesignaction.php deleted file mode 100644 index e84c777685..0000000000 --- a/lib/currentuserdesignaction.php +++ /dev/null @@ -1,96 +0,0 @@ -. - * - * @category Action - * @package StatusNet - * @author Evan Prodromou - * @copyright 2009-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); -} - -/** - * Base class for actions that use the current user's design - * - * Some pages (settings in particular) use the current user's chosen - * design. This superclass returns that design. - * - * @category Action - * @package StatusNet - * @author Evan Prodromou - * @author Zach Copley - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - * - */ -class CurrentUserDesignAction extends Action -{ - - protected $cur = null; // The current user - - /** - * For initializing members of the class. Set a the - * current user here. - * - * @param array $argarray misc. arguments - * - * @return boolean true - */ - function prepare($argarray) - { - parent::prepare($argarray); - - $this->cur = common_current_user(); - - return true; - } - - /** - * A design for this action - * - * Returns the design preferences for the current user. - * - * @return Design a design object to use - */ - function getDesign() - { - if (!empty($this->cur)) { - - $design = $this->cur->getDesign(); - - if (!empty($design)) { - return $design; - } - } - - return parent::getDesign(); - } - - function getCurrentUser() - { - return $this->cur; - } -} - diff --git a/lib/default.php b/lib/default.php index cdd8e5460d..938716b3a4 100644 --- a/lib/default.php +++ b/lib/default.php @@ -286,17 +286,6 @@ $default = array('handle' => false, // whether to handle sessions ourselves 'debug' => false, // debugging output for sessions 'gc_limit' => 1000), // max sessions to expire at a time - 'design' => - array('backgroundcolor' => null, // null -> 'use theme default' - 'contentcolor' => null, - 'sidebarcolor' => null, - 'textcolor' => null, - 'linkcolor' => null, - 'backgroundimage' => null, - 'disposition' => null), - 'custom_css' => - array('enabled' => true, - 'css' => ''), 'notice' => array('contentlimit' => null, 'defaultscope' => 0), // set to 0 for default open @@ -330,7 +319,7 @@ $default = ), 'pluginlist' => array(), 'admin' => - array('panels' => array('design', 'site', 'user', 'paths', 'access', 'sessions', 'sitenotice', 'license', 'plugins')), + array('panels' => array('site', 'user', 'paths', 'access', 'sessions', 'sitenotice', 'license', 'plugins')), 'singleuser' => array('enabled' => false, 'nickname' => null), diff --git a/lib/designform.php b/lib/designform.php deleted file mode 100644 index a584b61adb..0000000000 --- a/lib/designform.php +++ /dev/null @@ -1,319 +0,0 @@ -. - * - * @category Form - * @package StatusNet - * @author Evan Prodromou - * @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/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -/** - * Form for choosing a design - * - * Used for choosing a site design, user design, or group design. - * - * @category Form - * @package StatusNet - * @author Evan Prodromou - * @author Sarven Capadisli - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - * - */ -class DesignForm extends Form -{ - /** - * Return-to args - */ - - var $design = null; - var $actionurl = null; - - /** - * Constructor - * - * @param HTMLOutputter $out output channel - * @param Design $design initial design - * @param Design $actionurl url of action (for form posting) - */ - function __construct($out, $design, $actionurl) - { - parent::__construct($out); - - $this->design = $design; - $this->actionurl = $actionurl; - } - - /** - * ID of the form - * - * @return int ID of the form - */ - function id() - { - return 'design'; - } - - /** - * class of the form - * - * @return string class of the form - */ - function formClass() - { - return 'form_design'; - } - - /** - * Action of the form - * - * @return string URL of the action - */ - function action() - { - return $this->actionurl; - } - - /** - * Legend of the Form - * - * @return void - */ - function formLegend() - { - // TRANS: Form legend of form for changing the page design. - $this->out->element('legend', null, _('Change design')); - } - - /** - * Data elements of the form - * - * @return void - */ - function formData() - { - $this->backgroundData(); - - $this->out->elementEnd('fieldset'); - - $this->out->elementStart('fieldset', array('id' => 'settings_design_color')); - // TRANS: Fieldset legend on profile design page to change profile page colours. - $this->out->element('legend', null, _('Change colours')); - $this->colourData(); - $this->out->elementEnd('fieldset'); - - $this->out->elementStart('fieldset'); - - // TRANS: Button text on profile design page to immediately reset all colour settings to default. - $this->out->submit('defaults', _('Use defaults'), 'submit form_action-default', - // TRANS: Title for button on profile design page to reset all colour settings to default. - 'defaults', _('Restore default designs.')); - - $this->out->element('input', array('id' => 'settings_design_reset', - 'type' => 'reset', - // TRANS: Button text on profile design page to reset all colour settings to default without saving. - 'value' => _m('BUTTON', 'Reset'), - 'class' => 'submit form_action-primary', - // TRANS: Title for button on profile design page to reset all colour settings to default without saving. - 'title' => _('Reset back to default.'))); - } - - function backgroundData() - { - $this->out->elementStart('ul', 'form_data'); - $this->out->elementStart('li'); - $this->out->element('label', array('for' => 'design_background-image_file'), - // TRANS: Label in form on profile design page. - // TRANS: Field contains file name on user's computer that could be that user's custom profile background image. - _('Upload file')); - $this->out->element('input', array('name' => 'design_background-image_file', - 'type' => 'file', - 'id' => 'design_background-image_file')); - // TRANS: Instructions for form on profile design page. - $this->out->element('p', 'form_guide', _('You can upload your personal ' . - 'background image. The maximum file size is 2MB.')); - $this->out->element('input', array('name' => 'MAX_FILE_SIZE', - 'type' => 'hidden', - 'id' => 'MAX_FILE_SIZE', - 'value' => ImageFile::maxFileSizeInt())); - $this->out->elementEnd('li'); - - if (!empty($this->design->backgroundimage)) { - - $this->out->elementStart('li', array('id' => - 'design_background-image_onoff')); - - $this->out->element('img', array('src' => - Design::url($this->design->backgroundimage))); - - $attrs = array('name' => 'design_background-image_onoff', - 'type' => 'radio', - 'id' => 'design_background-image_on', - 'class' => 'radio', - 'value' => 'on'); - - if ($this->design->disposition & BACKGROUND_ON) { - $attrs['checked'] = 'checked'; - } - - $this->out->element('input', $attrs); - - $this->out->element('label', array('for' => 'design_background-image_on', - 'class' => 'radio'), - // TRANS: Radio button on profile design page that will enable use of the uploaded profile image. - _m('RADIO', 'On')); - - $attrs = array('name' => 'design_background-image_onoff', - 'type' => 'radio', - 'id' => 'design_background-image_off', - 'class' => 'radio', - 'value' => 'off'); - - if ($this->design->disposition & BACKGROUND_OFF) { - $attrs['checked'] = 'checked'; - } - - $this->out->element('input', $attrs); - - $this->out->element('label', array('for' => 'design_background-image_off', - 'class' => 'radio'), - // TRANS: Radio button on profile design page that will disable use of the uploaded profile image. - _m('RADIO', 'Off')); - // TRANS: Form guide for a set of radio buttons on the profile design page that will enable or disable - // TRANS: use of the uploaded profile image. - $this->out->element('p', 'form_guide', _('Turn background image on or off.')); - $this->out->elementEnd('li'); - - $this->out->elementStart('li'); - $this->out->checkbox('design_background-image_repeat', - // TRANS: Checkbox label on profile design page that will cause the profile image to be tiled. - _('Tile background image'), - ($this->design->disposition & BACKGROUND_TILE) ? true : false); - $this->out->elementEnd('li'); - } - - $this->out->elementEnd('ul'); - } - - function colourData() - { - $this->out->elementStart('ul', 'form_data'); - - try { - - $bgcolor = new WebColor($this->design->backgroundcolor); - - $this->out->elementStart('li'); - // TRANS: Label on profile design page for setting a profile page background colour. - $this->out->element('label', array('for' => 'swatch-1'), _('Background')); - $this->out->element('input', array('name' => 'design_background', - 'type' => 'text', - 'id' => 'swatch-1', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->out->elementEnd('li'); - - $ccolor = new WebColor($this->design->contentcolor); - - $this->out->elementStart('li'); - // TRANS: Label on profile design page for setting a profile page content colour. - $this->out->element('label', array('for' => 'swatch-2'), _('Content')); - $this->out->element('input', array('name' => 'design_content', - 'type' => 'text', - 'id' => 'swatch-2', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->out->elementEnd('li'); - - $sbcolor = new WebColor($this->design->sidebarcolor); - - $this->out->elementStart('li'); - // TRANS: Label on profile design page for setting a profile page sidebar colour. - $this->out->element('label', array('for' => 'swatch-3'), _('Sidebar')); - $this->out->element('input', array('name' => 'design_sidebar', - 'type' => 'text', - 'id' => 'swatch-3', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->out->elementEnd('li'); - - $tcolor = new WebColor($this->design->textcolor); - - $this->out->elementStart('li'); - // TRANS: Label on profile design page for setting a profile page text colour. - $this->out->element('label', array('for' => 'swatch-4'), _('Text')); - $this->out->element('input', array('name' => 'design_text', - 'type' => 'text', - 'id' => 'swatch-4', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->out->elementEnd('li'); - - $lcolor = new WebColor($this->design->linkcolor); - - $this->out->elementStart('li'); - // TRANS: Label on profile design page for setting a profile page links colour. - $this->out->element('label', array('for' => 'swatch-5'), _('Links')); - $this->out->element('input', array('name' => 'design_links', - 'type' => 'text', - 'id' => 'swatch-5', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->out->elementEnd('li'); - - } catch (WebColorException $e) { - common_log(LOG_ERR, 'Bad color values in design ID: ' .$this->design->id); - } - - $this->out->elementEnd('ul'); - } - - /** - * Action elements - * - * @return void - */ - - function formActions() - { - // TRANS: Button text on profile design page to save settings. - $this->out->submit('save', _m('BUTTON','Save'), 'submit form_action-secondary', - // TRANS: Title for button on profile design page to save settings. - 'save', _('Save design.')); - } -} diff --git a/lib/designsettings.php b/lib/designsettings.php deleted file mode 100644 index cb65ca14cb..0000000000 --- a/lib/designsettings.php +++ /dev/null @@ -1,247 +0,0 @@ -. - * - * @category Settings - * @package StatusNet - * @author Sarven Capadisli - * @author Zach Copley - * @copyright 2008-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/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -/** - * Base class for setting a user or group design - * - * Shows the design setting form and also handles some things like saving - * background images, and fetching a default design - * - * @category Settings - * @package StatusNet - * @author Zach Copley - * @author Sarven Capadisli - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -class DesignSettingsAction extends SettingsAction -{ - var $submitaction = null; - - /** - * Title of the page - * - * @return string Title of the page - */ - function title() - { - // TRANS: Page title for profile design page. - return _('Profile design'); - } - - /** - * Instructions for use - * - * @return instructions for use - */ - function getInstructions() - { - // TRANS: Instructions for profile design page. - return _('Customize the way your profile looks ' . - 'with a background image and a colour palette of your choice.'); - } - - /** - * Shows the design settings form - * - * @param Design $design a working design to show - * - * @return nothing - */ - function showDesignForm($design) - { - $form = new DesignForm($this, $design, $this->selfUrl()); - $form->show(); - - } - - /** - * Handle a post - * - * Validate input and save changes. Reload the form with a success - * or error message. - * - * @return void - */ - function handlePost() - { - if ($_SERVER['REQUEST_METHOD'] == 'POST') { - - // Workaround for PHP returning empty $_POST and $_FILES when POST - // length > post_max_size in php.ini - - if (empty($_FILES) - && empty($_POST) - && ($_SERVER['CONTENT_LENGTH'] > 0) - ) { - // TRANS: Form validation error in design settings form. POST should remain untranslated. - $msg = _m('The server was unable to handle that much POST data (%s byte) due to its current configuration.', - 'The server was unable to handle that much POST data (%s bytes) due to its current configuration.', - intval($_SERVER['CONTENT_LENGTH'])); - - $this->showForm(sprintf($msg, $_SERVER['CONTENT_LENGTH'])); - return; - } - } - - // CSRF protection - $token = $this->trimmed('token'); - if (!$token || $token != common_session_token()) { - // TRANS: Client error displayed when the session token does not match or is not given. - $this->showForm(_('There was a problem with your session token. '. - 'Try again, please.')); - return; - } - - if ($this->arg('save')) { - $this->saveDesign(); - } else if ($this->arg('defaults')) { - $this->restoreDefaults(); - } else { - // TRANS: Unknown form validation error in design settings form. - $this->showForm(_('Unexpected form submission.')); - } - } - - /** - * Add the Farbtastic stylesheet - * - * @return void - */ - function showStylesheets() - { - parent::showStylesheets(); - $this->cssLink('js/farbtastic/farbtastic.css',null,'screen, projection, tv'); - } - - /** - * Add the Farbtastic scripts - * - * @return void - */ - function showScripts() - { - parent::showScripts(); - - $this->script('farbtastic/farbtastic.js'); - $this->script('userdesign.go.js'); - - $this->autofocus('design_background-image_file'); - } - - /** - * Save the background image, if any, and set its disposition - * - * @param Design $design a working design to attach the img to - * - * @return nothing - */ - function saveBackgroundImage($design) - { - // Now that we have a Design ID we can add a file to the design. - // XXX: This is an additional DB hit, but figured having the image - // associated with the Design rather than the User was worth - // it. -- Zach - - if (array_key_exists('design_background-image_file', $_FILES) && - $_FILES['design_background-image_file']['error'] == UPLOAD_ERR_OK) { - - $filepath = null; - - try { - $imagefile = ImageFile::fromUpload('design_background-image_file'); - } catch (Exception $e) { - $this->showForm($e->getMessage()); - return; - } - - $filename = Design::filename($design->id, - image_type_to_extension($imagefile->type), - common_timestamp()); - - $filepath = Design::path($filename); - - move_uploaded_file($imagefile->filepath, $filepath); - - // delete any old backround img laying around - - if (isset($design->backgroundimage)) { - @unlink(Design::path($design->backgroundimage)); - } - - $original = clone($design); - - $design->backgroundimage = $filename; - - // default to on, no tile - - $design->setDisposition(true, false, false); - - $result = $design->update($original); - - if ($result === false) { - common_log_db_error($design, 'UPDATE', __FILE__); - // TRANS: Error message displayed if design settings could not be saved. - $this->showForm(_('Could not update your design.')); - return; - } - } - } - - /** - * Restore the user or group design to system defaults - * - * @return nothing - */ - function restoreDefaults() - { - $design = $this->getWorkingDesign(); - - if (!empty($design)) { - - $result = $design->delete(); - - if ($result === false) { - common_log_db_error($design, 'DELETE', __FILE__); - // TRANS: Error message displayed if design settings could not be saved after clicking "Use defaults". - $this->showForm(_('Could not update your design.')); - return; - } - } - - // TRANS: Success message displayed if design settings were saved after clicking "Use defaults". - $this->showForm(_('Design defaults restored.'), true); - } -} diff --git a/lib/groupdesignaction.php b/lib/groupaction.php similarity index 65% rename from lib/groupdesignaction.php rename to lib/groupaction.php index 44f35f6299..d9eea4414c 100644 --- a/lib/groupdesignaction.php +++ b/lib/groupaction.php @@ -2,7 +2,7 @@ /** * StatusNet, the distributed open-source microblogging tool * - * Base class for actions that use the current user's design + * Base class for group actions * * PHP version 5 * @@ -22,7 +22,7 @@ * @category Action * @package StatusNet * @author Zach Copley - * @copyright 2009 StatusNet, Inc. + * @copyright 2009-2011 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/ */ @@ -32,10 +32,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { } /** - * Base class for actions that use a group's design - * - * Pages related to groups can be themed with a design. - * This superclass returns that design. + * Base class for group actions, similar to ProfileAction * * @category Action * @package StatusNet @@ -44,30 +41,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @link http://status.net/ * */ -class GroupDesignAction extends Action { - - /** The group in question */ - var $group = null; - - /** - * A design for this action - * - * if the group attribute has been set, returns that group's - * design. - * - * @return Design a design object to use - */ - - function getDesign() - { - if (!empty($this->group)) { - $design = $this->group->getDesign(); - if (!empty($design)) { - return $design; - } - } - return parent::getDesign(); - } +class GroupAction extends Action { function showProfileBlock() { diff --git a/lib/groupnav.php b/lib/groupnav.php index 13795721ae..33f77bef9b 100644 --- a/lib/groupnav.php +++ b/lib/groupnav.php @@ -137,15 +137,6 @@ class GroupNav extends Menu sprintf(_m('TOOLTIP','Add or edit %s logo'), $nickname), $action_name == 'grouplogo', 'nav_group_logo'); - $this->out->menuItem(common_local_url('groupdesignsettings', array('nickname' => - $nickname)), - // TRANS: Menu item in the group navigation page. Only shown for group administrators. - _m('MENU','Design'), - // TRANS: Tooltip for menu item in the group navigation page. Only shown for group administrators. - // TRANS: %s is the nickname of the group. - sprintf(_m('TOOLTIP','Add or edit %s design'), $nickname), - $action_name == 'groupdesignsettings', - 'nav_group_design'); } Event::handle('EndGroupGroupNav', array($this)); } diff --git a/lib/groupsbymemberssection.php b/lib/groupsbymemberssection.php index 4cb8ed46f0..9b1bac2154 100644 --- a/lib/groupsbymemberssection.php +++ b/lib/groupsbymemberssection.php @@ -47,7 +47,7 @@ class GroupsByMembersSection extends GroupSection $qry = 'SELECT user_group.*, count(*) as value ' . 'FROM user_group JOIN group_member '. 'ON user_group.id = group_member.group_id ' . - 'GROUP BY user_group.id,user_group.nickname,user_group.fullname,user_group.homepage,user_group.description,user_group.location,user_group.original_logo,user_group.homepage_logo,user_group.stream_logo,user_group.mini_logo,user_group.created,user_group.modified,user_group.design_id ' . + 'GROUP BY user_group.id,user_group.nickname,user_group.fullname,user_group.homepage,user_group.description,user_group.location,user_group.original_logo,user_group.homepage_logo,user_group.stream_logo,user_group.mini_logo,user_group.created,user_group.modified ' . 'ORDER BY value DESC '; $limit = GROUPS_PER_SECTION; diff --git a/lib/groupsbypostssection.php b/lib/groupsbypostssection.php index c338ab7e97..d0fadcb450 100644 --- a/lib/groupsbypostssection.php +++ b/lib/groupsbypostssection.php @@ -47,7 +47,7 @@ class GroupsByPostsSection extends GroupSection $qry = 'SELECT user_group.*, count(*) as value ' . 'FROM user_group JOIN group_inbox '. 'ON user_group.id = group_inbox.group_id ' . - 'GROUP BY user_group.id,user_group.nickname,user_group.fullname,user_group.homepage,user_group.description,user_group.location,user_group.original_logo,user_group.homepage_logo,user_group.stream_logo,user_group.mini_logo,user_group.created,user_group.modified,user_group.design_id ' . + 'GROUP BY user_group.id,user_group.nickname,user_group.fullname,user_group.homepage,user_group.description,user_group.location,user_group.original_logo,user_group.homepage_logo,user_group.stream_logo,user_group.mini_logo,user_group.created,user_group.modified ' . 'ORDER BY value DESC '; $limit = GROUPS_PER_SECTION; diff --git a/lib/mailbox.php b/lib/mailbox.php index 7c6567c6c1..db686a255a 100644 --- a/lib/mailbox.php +++ b/lib/mailbox.php @@ -42,7 +42,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @see InboxAction * @see OutboxAction */ -class MailboxAction extends CurrentUserDesignAction +class MailboxAction extends Action { var $page = null; diff --git a/lib/ownerdesignaction.php b/lib/ownerdesignaction.php deleted file mode 100644 index d557f10c06..0000000000 --- a/lib/ownerdesignaction.php +++ /dev/null @@ -1,77 +0,0 @@ -. - * - * @category Action - * @package StatusNet - * @author Evan Prodromou - * @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/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -/** - * Base class for actions that use the page owner's design - * - * Some pages have a clear "owner" -- like the profile page, subscriptions - * pages, etc. This superclass uses that owner's chosen design for the page - * design. - * - * @category Action - * @package StatusNet - * @author Evan Prodromou - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - * - */ - -class OwnerDesignAction extends Action { - - /** The user for this page. */ - - var $user = null; - - /** - * A design for this action - * - * if the user attribute has been set, returns that user's - * design. - * - * @return Design a design object to use - */ - - function getDesign() - { - if (!empty($this->user)) { - - $design = $this->user->getDesign(); - - if (!empty($design)) { - return $design; - } - } - - return parent::getDesign(); - } -} diff --git a/lib/profileaction.php b/lib/profileaction.php index 09ebcc5de0..eaf515e04a 100644 --- a/lib/profileaction.php +++ b/lib/profileaction.php @@ -23,7 +23,7 @@ * @package StatusNet * @author Evan Prodromou * @author Sarven Capadisli - * @copyright 2008-2009 StatusNet, Inc. + * @copyright 2008-2011 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/ */ @@ -46,7 +46,7 @@ require_once INSTALLDIR.'/lib/groupminilist.php'; * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class ProfileAction extends OwnerDesignAction +class ProfileAction extends Action { var $page = null; var $profile = null; diff --git a/lib/router.php b/lib/router.php index 9ba8051522..dbf3aaeb97 100644 --- a/lib/router.php +++ b/lib/router.php @@ -269,7 +269,7 @@ class Router // settings foreach (array('profile', 'avatar', 'password', 'im', 'oauthconnections', - 'oauthapps', 'email', 'sms', 'userdesign', 'url') as $s) { + 'oauthapps', 'email', 'sms', 'url') as $s) { $m->connect('settings/'.$s, array('action' => $s.'settings')); } @@ -383,7 +383,7 @@ class Router array('id' => '[0-9]+')); } - foreach (array('members', 'logo', 'rss', 'designsettings') as $n) { + foreach (array('members', 'logo', 'rss') as $n) { $m->connect('group/:nickname/'.$n, array('action' => 'group'.$n), array('nickname' => Nickname::DISPLAY_FMT)); @@ -626,12 +626,6 @@ class Router $m->connect('api/account/update_profile_image.:format', array('action' => 'ApiAccountUpdateProfileImage')); - $m->connect('api/account/update_profile_background_image.:format', - array('action' => 'ApiAccountUpdateProfileBackgroundImage')); - - $m->connect('api/account/update_profile_colors.:format', - array('action' => 'ApiAccountUpdateProfileColors')); - $m->connect('api/account/update_delivery_device.:format', array('action' => 'ApiAccountUpdateDeliveryDevice')); @@ -875,7 +869,6 @@ class Router // Admin $m->connect('panel/site', array('action' => 'siteadminpanel')); - $m->connect('panel/design', array('action' => 'designadminpanel')); $m->connect('panel/user', array('action' => 'useradminpanel')); $m->connect('panel/access', array('action' => 'accessadminpanel')); $m->connect('panel/paths', array('action' => 'pathsadminpanel')); diff --git a/lib/settingsaction.php b/lib/settingsaction.php index c70a5ffa8d..560534065f 100644 --- a/lib/settingsaction.php +++ b/lib/settingsaction.php @@ -43,7 +43,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { * @see Widget */ -class SettingsAction extends CurrentUserDesignAction +class SettingsAction extends Action { /** * A message for the user. diff --git a/lib/settingsnav.php b/lib/settingsnav.php index f8c78ec6f1..f403d4bdcd 100644 --- a/lib/settingsnav.php +++ b/lib/settingsnav.php @@ -112,13 +112,6 @@ class SettingsNav extends Menu _('Change email handling'), $actionName == 'emailsettings'); - $this->action->menuItem(common_local_url('userdesignsettings'), - // TRANS: Menu item in settings navigation panel. - _m('MENU','Design'), - // TRANS: Menu item title in settings navigation panel. - _('Design your profile'), - $actionName == 'userdesignsettings'); - $this->action->menuItem(common_local_url('urlsettings'), // TRANS: Menu item in settings navigation panel. _m('MENU','URL'), diff --git a/lib/statusnet.php b/lib/statusnet.php index 292f074199..73185b1692 100644 --- a/lib/statusnet.php +++ b/lib/statusnet.php @@ -296,10 +296,6 @@ class StatusNet $config['db'] = $default['db']; - // Backward compatibility - - $config['site']['design'] =& $config['design']; - if (function_exists('date_default_timezone_set')) { /* Work internally in UTC */ date_default_timezone_set('UTC'); diff --git a/plugins/DomainStatusNetwork/DomainStatusNetworkPlugin.php b/plugins/DomainStatusNetwork/DomainStatusNetworkPlugin.php index 9390a6e083..a923ac4c30 100644 --- a/plugins/DomainStatusNetwork/DomainStatusNetworkPlugin.php +++ b/plugins/DomainStatusNetwork/DomainStatusNetworkPlugin.php @@ -97,8 +97,16 @@ class DomainStatusNetworkPlugin extends Plugin switch ($cls) { + case 'GlobalregisterAction': + case 'GloballoginAction': + case 'GlobalrecoverAction': + include_once $dir . '/actions/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; + return false; case 'DomainStatusNetworkInstaller': - include_once $dir . '/' . strtolower($cls) . '.php'; + include_once $dir . '/lib/' . strtolower($cls) . '.php'; + return false; + case 'GlobalApiAction': + include_once $dir . '/lib/' . strtolower($cls) . '.php'; return false; default: return true; @@ -138,6 +146,26 @@ class DomainStatusNetworkPlugin extends Plugin return true; } + function onRouterInitialized($m) + { + if (common_config('globalapi', 'enabled')) { + foreach (array('register', 'login', 'recover') as $method) { + $m->connect('api/statusnet/global/'.$method, + array('action' => 'global'.$method)); + } + } + return true; + } + + function onLoginAction($action, &$login) { + $this->debug($action); + if (in_array($action, array('globalregister', 'globallogin', 'globalrecover'))) { + $login = true; + return false; + } + return true; + } + static function nicknameForDomain($domain) { $registered = self::registeredDomain($domain); @@ -195,6 +223,103 @@ class DomainStatusNetworkPlugin extends Plugin _m('A plugin that maps a single status_network to an email domain.')); return true; } + + static function userExists($email) + { + $domain = self::toDomain($email); + + $sn = self::siteForDomain($domain); + + if (empty($sn)) { + return false; + } + + StatusNet::switchSite($sn->nickname); + + $user = User::staticGet('email', $email); + + return !empty($user); + } + + static function registerEmail($email, $sendWelcome, $template) + { + $domain = self::toDomain($email); + + $sn = self::siteForDomain($domain); + + if (empty($sn)) { + $installer = new DomainStatusNetworkInstaller($domain); + + // Do the thing + $installer->main(); + + $sn = $installer->getStatusNetwork(); + + $config = $installer->getConfig(); + + Status_network::$wildcard = $config['WILDCARD']; + } + + StatusNet::switchSite($sn->nickname); + + $confirm = EmailRegistrationPlugin::registerEmail($email); + + return $confirm; + } + + static function login($email, $password) + { + $domain = self::toDomain($email); + + $sn = self::siteForDomain($domain); + + if (empty($sn)) { + throw new ClientException(_("No such site.")); + } + + StatusNet::switchSite($sn->nickname); + + $user = common_check_user($email, $password); + + if (empty($user)) { + // TRANS: Form validation error displayed when trying to log in with incorrect credentials. + throw new ClientException(_('Incorrect username or password.')); + } + + $loginToken = Login_token::makeNew($user); + + if (empty($loginToken)) { + throw new ServerException(sprintf(_('Could not create new login token for user %s'), $user->nickname)); + } + + $url = common_local_url('otp', array('user_id' => $loginToken->user_id, + 'token' => $loginToken->token)); + + if (empty($url)) { + throw new ServerException(sprintf(_('Could not create new OTP URL for user %s'), $user->nickname)); + } + + return $url; + } + + static function recoverPassword($email) + { + $domain = self::toDomain($email); + + $sn = self::siteForDomain($domain); + + if (empty($sn)) { + throw new NoSuchUserException(array('email' => $email)); + } + + StatusNet::switchSite($sn->nickname); + + $user = User::staticGet('email', $email); + + if (empty($user)) { + throw new ClientException(_('No such user.')); + } + } } // The way addPlugin() works, this global variable gets disappeared. diff --git a/plugins/DomainStatusNetwork/actions/globallogin.php b/plugins/DomainStatusNetwork/actions/globallogin.php new file mode 100644 index 0000000000..f843392f44 --- /dev/null +++ b/plugins/DomainStatusNetwork/actions/globallogin.php @@ -0,0 +1,96 @@ +. + * + * @category DomainStatusNetwork + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * Login to a site + * + * @category Action + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class GloballoginAction extends GlobalApiAction +{ + var $password; + + /** + * For initializing members of the class. + * + * @param array $argarray misc. arguments + * + * @return boolean true + */ + + function prepare($argarray) + { + parent::prepare($argarray); + + $password = $this->trimmed('password'); + + if (empty($password)) { + throw new ClientException(_('No password.')); + } + + $this->password = $password; + + return true; + } + + /** + * Handler method + * + * @param array $argarray is ignored since it's now passed in in prepare() + * + * @return void + */ + + function handle($argarray=null) + { + try { + $url = DomainStatusNetworkPlugin::login($email, $password); + $this->showSuccess(array('url' => $url)); + } catch (ClientException $ce) { + $this->showError($ce->getMessage()); + } catch (Exception $e) { + common_log(LOG_ERR, $e->getMessage()); + $this->showError(_('An internal error occurred.')); + } + return; + } +} diff --git a/plugins/DomainStatusNetwork/actions/globalrecover.php b/plugins/DomainStatusNetwork/actions/globalrecover.php new file mode 100644 index 0000000000..9b688cbe70 --- /dev/null +++ b/plugins/DomainStatusNetwork/actions/globalrecover.php @@ -0,0 +1,85 @@ +. + * + * @category DomainStatusNetwork + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * Recover a password + * + * @category Action + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class GlobalrecoverAction extends GlobalApiAction +{ + /** + * For initializing members of the class. + * + * @param array $argarray misc. arguments + * + * @return boolean true + */ + + function prepare($argarray) + { + parent::prepare($argarray); + return true; + } + + /** + * Handler method + * + * @param array $argarray is ignored since it's now passed in in prepare() + * + * @return void + */ + + function handle($argarray=null) + { + try { + DomainStatusNetworkPlugin::recoverPassword($email); + $this->showSuccess(); + } catch (ClientException $ce) { + $this->showError($ce->getMessage()); + } catch (Exception $e) { + common_log(LOG_ERR, $e->getMessage()); + $this->showError(_('An internal error occurred.')); + } + return; + } +} diff --git a/plugins/DomainStatusNetwork/actions/globalregister.php b/plugins/DomainStatusNetwork/actions/globalregister.php new file mode 100644 index 0000000000..ed9bfc3c2c --- /dev/null +++ b/plugins/DomainStatusNetwork/actions/globalregister.php @@ -0,0 +1,95 @@ +. + * + * @category DomainStatusNetwork + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * An action to globally register a new user + * + * @category Action + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class GlobalregisterAction extends GlobalApiAction +{ + /** + * For initializing members of the class. + * + * @param array $argarray misc. arguments + * + * @return boolean true + */ + + function prepare($argarray) + { + try { + parent::prepare($argarray); + return true; + } catch (ClientException $e) { + $this->showError($e->getMessage(), $e->getCode()); + return false; + } catch (Exception $e) { + common_log(LOG_ERR, $e->getMessage()); + $this->showError(_('An internal error occurred.'), 500); + return false; + } + } + + /** + * Handler method + * + * @param array $argarray is ignored since it's now passed in in prepare() + * + * @return void + */ + + function handle($argarray=null) + { + try { + DomainStatusNetworkPlugin::registerEmail($this->email, true); + $this->showSuccess(); + } catch (ClientException $e) { + $this->showError($e->getMessage(), $e->getCode()); + } catch (Exception $e) { + common_log(LOG_ERR, $e->getMessage()); + $this->showError(_('An internal error occurred.'), 500); + } + + return; + } +} diff --git a/plugins/DomainStatusNetwork/domainstatusnetworkinstaller.php b/plugins/DomainStatusNetwork/lib/domainstatusnetworkinstaller.php similarity index 100% rename from plugins/DomainStatusNetwork/domainstatusnetworkinstaller.php rename to plugins/DomainStatusNetwork/lib/domainstatusnetworkinstaller.php diff --git a/plugins/DomainStatusNetwork/lib/globalapiaction.php b/plugins/DomainStatusNetwork/lib/globalapiaction.php new file mode 100644 index 0000000000..cd0c7f9526 --- /dev/null +++ b/plugins/DomainStatusNetwork/lib/globalapiaction.php @@ -0,0 +1,131 @@ +. + * + * @category DomainStatusNetwork + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * An action that requires an API key + * + * @category General + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class GlobalApiAction extends Action +{ + var $email; + + /** + * Check for an API key, and throw an exception if it's not set + * + * @param array $args URL and POST params + * + * @return boolean continuation flag + */ + + function prepare($args) + { + StatusNet::setApi(true); // reduce exception reports to aid in debugging + + parent::prepare($args); + + if (!common_config('globalapi', 'enabled')) { + throw new ClientException(_('Global API not enabled.'), 403); + } + + $apikey = $this->trimmed('apikey'); + + if (empty($apikey)) { + throw new ClientException(_('No API key.'), 403); + } + + $expected = common_config('globalapi', 'key'); + + if ($expected != $apikey) { + // FIXME: increment a counter by IP address to prevent brute-force + // attacks on the key. + throw new ClientException(_('Bad API key.'), 403); + } + + $email = common_canonical_email($this->trimmed('email')); + + if (empty($email)) { + throw new ClientException(_('No email address.')); + } + + if (!Validate::email($email, common_config('email', 'check_domain'))) { + throw new ClientException(_('Invalid email address.')); + } + + $this->email = $email; + + return true; + } + + function showError($message, $code=400) + { + $this->showOutput(array('error' => $message), $code); + } + + function showSuccess($values=null, $code=200) + { + if (empty($values)) { + $values = array(); + } + $values['success'] = 1; + $this->showOutput($values, $code); + } + + function showOutput($values, $code) + { + if (array_key_exists($code, ClientErrorAction::$status)) { + $status_string = ClientErrorAction::$status[$code]; + } else if (array_key_exists($code, ServerErrorAction::$status)) { + $status_string = ServerErrorAction::$status[$code]; + } else { + // bad code! + $code = 500; + $status_string = ServerErrorAction::$status[$code]; + } + + header('HTTP/1.1 '.$code.' '.$status_string); + + header('Content-Type: application/json; charset=utf-8'); + print(json_encode($values)); + print("\n"); + } +} diff --git a/plugins/DomainStatusNetwork/scripts/installforemail.php b/plugins/DomainStatusNetwork/scripts/installforemail.php index 98ce620c28..f773094a74 100644 --- a/plugins/DomainStatusNetwork/scripts/installforemail.php +++ b/plugins/DomainStatusNetwork/scripts/installforemail.php @@ -39,39 +39,24 @@ require_once INSTALLDIR.'/scripts/commandline.inc'; $email = $args[0]; -$domain = DomainStatusNetworkPlugin::toDomain($email); +$sendWelcome = have_option('w', 'welcome'); -$sn = DomainStatusNetworkPlugin::siteForDomain($domain); - -if (empty($sn)) { - $installer = new DomainStatusNetworkInstaller($domain); - - $installer->verbose = have_option('v', 'verbose'); - - // Do the thing - $installer->main(); - - $sn = $installer->getStatusNetwork(); - - $config = $installer->getConfig(); - - Status_network::$wildcard = $config['WILDCARD']; +if ($sendWelcome && have_option('t', 'template')) { + $template = get_option_value('t', 'template'); } -StatusNet::switchSite($sn->nickname); +try { -$confirm = EmailRegistrationPlugin::registerEmail($email); + $confirm = DomainStatusNetworkPlugin::registerEmail($email); -if (have_option('w', 'welcome')) { - if (have_option('t', 'template')) { - // use the provided template - EmailRegistrationPlugin::sendConfirmEmail($confirm, get_option_value('t', 'template')); - } else { - // use the default template - EmailRegistrationPlugin::sendConfirmEmail($confirm); + if ($sendWelcome) { + EmailRegistrationPlugin::sendConfirmEmail($confirm, $template); } + + $confirmUrl = common_local_url('register', array('code' => $confirm->code)); + + print $confirmUrl."\n"; + +} catch (Exception $e) { + print "ERROR: " . $e->getMessage() . "\n"; } - -$confirmUrl = common_local_url('register', array('code' => $confirm->code)); - -print $confirmUrl."\n"; diff --git a/plugins/FacebookBridge/FacebookBridgePlugin.php b/plugins/FacebookBridge/FacebookBridgePlugin.php index d893baf62d..62ae381331 100644 --- a/plugins/FacebookBridge/FacebookBridgePlugin.php +++ b/plugins/FacebookBridge/FacebookBridgePlugin.php @@ -277,8 +277,7 @@ class FacebookBridgePlugin extends Plugin if ($this->hasApplication()) { $action_name = $action->trimmed('action'); - // CurrentUserDesignAction stores the current user in $cur - $user = $action->getCurrentUser(); + $user = common_current_user(); $flink = null; diff --git a/plugins/GroupPrivateMessage/groupinbox.php b/plugins/GroupPrivateMessage/groupinbox.php index 3464a1202a..b6308c663f 100644 --- a/plugins/GroupPrivateMessage/groupinbox.php +++ b/plugins/GroupPrivateMessage/groupinbox.php @@ -44,7 +44,7 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ -class GroupinboxAction extends GroupDesignAction +class GroupinboxAction extends GroupAction { var $gm; diff --git a/plugins/Mapstraction/map.php b/plugins/Mapstraction/map.php index 2ccf1642d7..856e00e159 100644 --- a/plugins/Mapstraction/map.php +++ b/plugins/Mapstraction/map.php @@ -22,7 +22,7 @@ * @category Mapstraction * @package StatusNet * @author Evan Prodromou - * @copyright 2009 StatusNet, Inc. + * @copyright 2009-2011 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/ */ @@ -42,7 +42,7 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ -class MapAction extends OwnerDesignAction +class MapAction extends Action { var $profile = null; var $page = null; diff --git a/plugins/ModPlus/remoteprofileaction.php b/plugins/ModPlus/remoteprofileaction.php index 8e2fcad284..7c9a4d1473 100644 --- a/plugins/ModPlus/remoteprofileaction.php +++ b/plugins/ModPlus/remoteprofileaction.php @@ -8,7 +8,7 @@ class RemoteProfileAction extends ShowstreamAction { function prepare($args) { - OwnerDesignAction::prepare($args); // skip the ProfileAction code and replace it... + Action::prepare($args); // skip the ProfileAction code and replace it... $id = $this->arg('id'); $this->user = false; diff --git a/plugins/QnA/actions/qnashowanswer.php b/plugins/QnA/actions/qnashowanswer.php index 30ce406739..85b39d0053 100644 --- a/plugins/QnA/actions/qnashowanswer.php +++ b/plugins/QnA/actions/qnashowanswer.php @@ -57,7 +57,7 @@ class QnashowanswerAction extends ShownoticeAction */ function prepare($argarray) { - OwnerDesignAction::prepare($argarray); + Action::prepare($argarray); $this->id = $this->trimmed('id'); diff --git a/plugins/QnA/actions/qnashowquestion.php b/plugins/QnA/actions/qnashowquestion.php index 14be3a6443..edea032b38 100644 --- a/plugins/QnA/actions/qnashowquestion.php +++ b/plugins/QnA/actions/qnashowquestion.php @@ -57,7 +57,7 @@ class QnashowquestionAction extends ShownoticeAction */ function prepare($argarray) { - OwnerDesignAction::prepare($argarray); + Action::prepare($argarray); $this->id = $this->trimmed('id'); diff --git a/theme/neo/css/display.css b/theme/neo/css/display.css index 7970155278..ed7c22b1e6 100644 --- a/theme/neo/css/display.css +++ b/theme/neo/css/display.css @@ -1903,4 +1903,35 @@ li.notice-answer + li.notice { padding-left: 20px; } +/* SNOD CompanyLogo styling */ + +#site_nav_local_views a.company_logo { + width: 138px; + padding: 0px; + font-weight: bold; + text-transform: none; + line-height: 1em; + margin-bottom: 30px; +} + +#site_nav_local_views a.company_logo:hover { + background: none; + color: blue; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.5); +} + +.company_logo img { + max-width: 96px; + margin-bottom: 10px; +} + +.company_logo span { + display: block; +} + +a.company_logo:hover span { + text-decoration: underline; +} + + }/*end of @media screen, projection, tv*/