From 62b90c29db9aa6171881623389b5d4c103d1124b Mon Sep 17 00:00:00 2001 From: Alexei Sorokin Date: Wed, 11 Sep 2019 11:25:39 +0300 Subject: [PATCH] [DATABASE] Introduce a bool type in schema PostgreSQL has a clear distinction between integers and booleans, so it makes sense to draw a clear line. --- actions/emailsettings.php | 14 +- actions/makeadmin.php | 114 +++---- actions/profilesettings.php | 303 ++++++++++-------- classes/Avatar.php | 62 ++-- classes/Group_member.php | 67 ++-- classes/Managed_DataObject.php | 15 +- classes/Old_school_prefs.php | 65 ++-- classes/Profile.php | 298 +++++++++-------- classes/Profile_list.php | 4 +- classes/Profile_tag.php | 4 +- classes/Subscription.php | 103 +++--- classes/User.php | 48 +-- classes/User_group.php | 6 +- classes/User_im_prefs.php | 52 ++- classes/User_location_prefs.php | 41 ++- db/core.php | 4 - extlib/DB/DataObject.php | 34 +- lib/action/action.php | 65 ++-- lib/database/mysqlschema.php | 4 +- lib/database/pgsqlschema.php | 7 +- lib/util/mail.php | 4 +- modules/Favorite/FavoriteModule.php | 4 +- .../{spam_score.php => Spam_score.php} | 59 ++-- plugins/ActivitySpam/lib/spamnoticestream.php | 73 ++--- .../ActivitySpam/scripts/silencespammer.php | 59 ++-- .../classes/Email_summary_status.php | 67 ++-- .../classes/User_followeveryone_prefs.php | 65 ++-- plugins/ModLog/ModLogPlugin.php | 80 ++--- plugins/ModLog/classes/ModLog.php | 63 ++-- plugins/OpenID/actions/openidsettings.php | 147 +++++---- plugins/Poll/classes/User_poll_prefs.php | 59 ++-- plugins/QnA/actions/qnaclosequestion.php | 66 ++-- plugins/QnA/actions/qnareviseanswer.php | 83 +++-- plugins/QnA/classes/QnA_Answer.php | 90 +++--- plugins/QnA/classes/QnA_Question.php | 90 +++--- .../actions/sensitivecontentsettings.php | 93 +++--- plugins/TwitterBridge/lib/twitterimport.php | 150 +++++---- scripts/makegroupadmin.php | 40 +-- scripts/upgrade.php | 2 +- 39 files changed, 1324 insertions(+), 1280 deletions(-) rename plugins/ActivitySpam/classes/{spam_score.php => Spam_score.php} (78%) diff --git a/actions/emailsettings.php b/actions/emailsettings.php index 50221e12d7..1a81304f56 100644 --- a/actions/emailsettings.php +++ b/actions/emailsettings.php @@ -295,11 +295,11 @@ class EmailsettingsAction extends SettingsAction public function savePreferences() { if (Event::handle('StartEmailSaveForm', array($this, $this->scoped))) { - $emailnotifysub = $this->booleanintstring('emailnotifysub'); - $emailnotifymsg = $this->booleanintstring('emailnotifymsg'); - $emailnotifynudge = $this->booleanintstring('emailnotifynudge'); - $emailnotifyattn = $this->booleanintstring('emailnotifyattn'); - $emailpost = $this->booleanintstring('emailpost'); + $emailnotifysub = $this->boolean('emailnotifysub'); + $emailnotifymsg = $this->boolean('emailnotifymsg'); + $emailnotifynudge = $this->boolean('emailnotifynudge'); + $emailnotifyattn = $this->boolean('emailnotifyattn'); + $emailpost = $this->boolean('emailpost'); $user = $this->scoped->getUser(); $user->query('BEGIN'); @@ -459,7 +459,7 @@ class EmailsettingsAction extends SettingsAction $orig = clone($user); $user->incomingemail = DB_DataObject_Cast::sql('NULL'); - $user->emailpost = 0; + $user->emailpost = false; // Throws exception on failure. Also performs it within a transaction. $user->updateWithKeys($orig); @@ -477,7 +477,7 @@ class EmailsettingsAction extends SettingsAction $user = common_current_user(); $orig = clone($user); $user->incomingemail = mail_new_incoming_address(); - $user->emailpost = 1; + $user->emailpost = true; // Throws exception on failure. Also performs it within a transaction. $user->updateWithKeys($orig); diff --git a/actions/makeadmin.php b/actions/makeadmin.php index 1bb830f81e..74bbda9a75 100644 --- a/actions/makeadmin.php +++ b/actions/makeadmin.php @@ -1,50 +1,41 @@ - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ - * - * StatusNet - the distributed open-source microblogging tool - * Copyright (C) 2008, 2009, StatusNet, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} +// This file is part of GNU social - https://www.gnu.org/software/social +// +// GNU social is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// GNU social is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with GNU social. If not, see . /** * Make another user an admin of a group * - * @category Action - * @package StatusNet - * @author Evan Prodromou - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ + * @category Action + * @package GNUsocial + * @author Evan Prodromou + * @copyright 2008, 2009 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ +defined('GNUSOCIAL') || die(); + +/** + * Make another user an admin of a group + * + * @copyright 2008, 2009 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later + */ class MakeadminAction extends RedirectingAction { - var $profile = null; - var $group = null; + public $profile = null; + public $group = null; /** * Take arguments for running @@ -54,7 +45,7 @@ class MakeadminAction extends RedirectingAction * @return boolean success flag */ - function prepare(array $args = array()) + public function prepare(array $args = []) { parent::prepare($args); if (!common_logged_in()) { @@ -95,10 +86,14 @@ class MakeadminAction extends RedirectingAction if ($this->profile->isAdmin($this->group)) { // TRANS: Client error displayed when trying to make another user admin on the Make Admin page who already is admin. // TRANS: %1$s is the user that is already admin, %2$s is the group user is already admin for. - $this->clientError(sprintf(_('%1$s is already an admin for group "%2$s".'), - $this->profile->getBestName(), - $this->group->getBestName()), - 401); + $this->clientError( + sprintf( + _('%1$s is already an admin for group "%2$s".'), + $this->profile->getBestName(), + $this->group->getBestName() + ), + 401 + ); } return true; } @@ -111,7 +106,7 @@ class MakeadminAction extends RedirectingAction * @return void */ - function handle() + public function handle() { parent::handle(); if ($_SERVER['REQUEST_METHOD'] == 'POST') { @@ -125,7 +120,7 @@ class MakeadminAction extends RedirectingAction * @return void */ - function makeAdmin() + public function makeAdmin() { $member = Group_member::pkeyGet(array('group_id' => $this->group->id, 'profile_id' => $this->profile->id)); @@ -134,14 +129,16 @@ class MakeadminAction extends RedirectingAction // TRANS: Server error displayed when trying to make another user admin on the Make Admin page fails // TRANS: because the group membership record could not be gotten. // TRANS: %1$s is the to be admin user, %2$s is the group user should be admin for. - $this->serverError(_('Can\'t get membership record for %1$s in group %2$s.'), - $this->profile->getBestName(), - $this->group->getBestName()); + $this->serverError( + _('Can\'t get membership record for %1$s in group %2$s.'), + $this->profile->getBestName(), + $this->group->getBestName() + ); } $orig = clone($member); - $member->is_admin = 1; + $member->is_admin = true; $result = $member->update($orig); @@ -150,9 +147,11 @@ class MakeadminAction extends RedirectingAction // TRANS: Server error displayed when trying to make another user admin on the Make Admin page fails // TRANS: because the group adminship record coud not be saved properly. // TRANS: %1$s is the to be admin user, %2$s is the group user is already admin for. - $this->serverError(_('Can\'t make %1$s an admin for group %2$s.'), - $this->profile->getBestName(), - $this->group->getBestName()); + $this->serverError( + _('Can\'t make %1$s an admin for group %2$s.'), + $this->profile->getBestName(), + $this->group->getBestName() + ); } $this->returnToPrevious(); @@ -161,13 +160,14 @@ class MakeadminAction extends RedirectingAction /** * If we reached this form without returnto arguments, default to * the top of the group's member list. - * + * * @return string URL */ - function defaultReturnTo() + public function defaultReturnTo() { - return common_local_url('groupmembers', - array('nickname' => $this->group->nickname)); + return common_local_url( + 'groupmembers', + ['nickname' => $this->group->nickname] + ); } - } diff --git a/actions/profilesettings.php b/actions/profilesettings.php index a1d947530c..fe31c6c0d6 100644 --- a/actions/profilesettings.php +++ b/actions/profilesettings.php @@ -1,46 +1,38 @@ . + /** - * StatusNet, the distributed open-source microblogging tool - * * Change profile settings * - * PHP version 5 - * - * LICENCE: This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * * @category Settings - * @package StatusNet + * @package GNUsocial * @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/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('GNUSOCIAL')) { exit(1); } +defined('GNUSOCIAL') || die(); /** * Change profile settings * - * @category Settings - * @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/ + * @copyright 2008-2009 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ class ProfilesettingsAction extends SettingsAction { @@ -49,7 +41,7 @@ class ProfilesettingsAction extends SettingsAction * * @return string Title of the page */ - function title() + public function title() { // TRANS: Page title for profile settings. return _('Profile settings'); @@ -60,14 +52,14 @@ class ProfilesettingsAction extends SettingsAction * * @return instructions for use */ - function getInstructions() + public function getInstructions() { // TRANS: Usage instructions for profile settings. return _('You can update your personal profile info here '. 'so people know more about you.'); } - function showScripts() + public function showScripts() { parent::showScripts(); $this->autofocus('fullname'); @@ -80,7 +72,7 @@ class ProfilesettingsAction extends SettingsAction * * @return void */ - function showContent() + public function showContent() { $user = $this->scoped->getUser(); @@ -98,29 +90,40 @@ class ProfilesettingsAction extends SettingsAction if (Event::handle('StartProfileFormData', array($this))) { $this->elementStart('li'); // TRANS: Field label in form for profile settings. - $this->input('nickname', _('Nickname'), - $this->trimmed('nickname') ?: $this->scoped->getNickname(), - // TRANS: Tooltip for field label in form for profile settings. - _('1-64 lowercase letters or numbers, no punctuation or spaces.'), - null, false, // "name" (will be set to id), then "required" - !common_config('profile', 'changenick') - ? array('disabled' => 'disabled', 'placeholder' => null) - : array('placeholder' => null)); + $this->input( + 'nickname', + _('Nickname'), + $this->trimmed('nickname') ?: $this->scoped->getNickname(), + // TRANS: Tooltip for field label in form for profile settings. + _('1-64 lowercase letters or numbers, no punctuation or spaces.'), + null, + false, // "name" (will be set to id), then "required" + (common_config('profile', 'changenick') + ? ['placeholder' => null] + : ['disabled' => 'disabled', 'placeholder' => null]) + ); $this->elementEnd('li'); $this->elementStart('li'); // TRANS: Field label in form for profile settings. - $this->input('fullname', _('Full name'), - $this->trimmed('fullname') ?: $this->scoped->getFullname(), - // TRANS: Instructions for full name text field on profile settings - _('A full name is required, if empty it will be set to your nickname.'), - null, true); + $this->input( + 'fullname', + _('Full name'), + $this->trimmed('fullname') ?: $this->scoped->getFullname(), + // TRANS: Instructions for full name text field on profile settings + _('A full name is required, if empty it will be set to your nickname.'), + null, + true + ); $this->elementEnd('li'); $this->elementStart('li'); // TRANS: Field label in form for profile settings. - $this->input('homepage', _('Homepage'), - $this->trimmed('homepage') ?: $this->scoped->getHomepage(), - // TRANS: Tooltip for field label in form for profile settings. - _('URL of your homepage, blog, or profile on another site.')); + $this->input( + 'homepage', + _('Homepage'), + $this->trimmed('homepage') ?: $this->scoped->getHomepage(), + // TRANS: Tooltip for field label in form for profile settings. + _('URL of your homepage, blog, or profile on another site.') + ); $this->elementEnd('li'); $this->elementStart('li'); $maxBio = Profile::maxBio(); @@ -128,97 +131,129 @@ class ProfilesettingsAction extends SettingsAction // TRANS: Tooltip for field label in form for profile settings. Plural // TRANS: is decided by the number of characters available for the // TRANS: biography (%d). - $bioInstr = sprintf(_m('Describe yourself and your interests in %d character.', - 'Describe yourself and your interests in %d characters.', - $maxBio), - $maxBio); + $bioInstr = sprintf( + _m('Describe yourself and your interests in %d character.', + 'Describe yourself and your interests in %d characters.', + $maxBio), + $maxBio + ); } else { // TRANS: Tooltip for field label in form for profile settings. $bioInstr = _('Describe yourself and your interests.'); } // TRANS: Text area label in form for profile settings where users can provide // TRANS: their biography. - $this->textarea('bio', _('Bio'), - $this->trimmed('bio') ?: $this->scoped->getDescription(), - $bioInstr); + $this->textarea( + 'bio', + _('Bio'), + ($this->trimmed('bio') ?: $this->scoped->getDescription()), + $bioInstr + ); $this->elementEnd('li'); $this->elementStart('li'); // TRANS: Field label in form for profile settings. - $this->input('location', _('Location'), - $this->trimmed('location') ?: $this->scoped->location, - // TRANS: Tooltip for field label in form for profile settings. - _('Where you are, like "City, State (or Region), Country".')); + $this->input( + 'location', + _('Location'), + ($this->trimmed('location') ?: $this->scoped->location), + // TRANS: Tooltip for field label in form for profile settings. + _('Where you are, like "City, State (or Region), Country".') + ); $this->elementEnd('li'); if (common_config('location', 'share') == 'user') { $this->elementStart('li'); // TRANS: Checkbox label in form for profile settings. - $this->checkbox('sharelocation', _('Share my current location when posting notices'), - ($this->arg('sharelocation')) ? - $this->boolean('sharelocation') : $this->scoped->shareLocation()); + $this->checkbox( + 'sharelocation', + _('Share my current location when posting notices'), + ($this->arg('sharelocation') ? + $this->boolean('sharelocation') : $this->scoped->shareLocation()) + ); $this->elementEnd('li'); } Event::handle('EndProfileFormData', array($this)); $this->elementStart('li'); // TRANS: Field label in form for profile settings. - $this->input('tags', _('Tags'), - $this->trimmed('tags') ?: implode(' ', Profile_tag::getSelfTagsArray($this->scoped)), - // TRANS: Tooltip for field label in form for profile settings. - _('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated.')); + $this->input( + 'tags', + _('Tags'), + ($this->trimmed('tags') ?: implode(' ', Profile_tag::getSelfTagsArray($this->scoped))), + // TRANS: Tooltip for field label in form for profile settings. + _('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated.') + ); $this->elementEnd('li'); $this->elementStart('li'); $language = common_language(); // TRANS: Dropdownlist label in form for profile settings. - $this->dropdown('language', _('Language'), - // TRANS: Tooltip for dropdown list label in form for profile settings. - get_nice_language_list(), _('Preferred language.'), - false, $language); + $this->dropdown( + 'language', + _('Language'), + // TRANS: Tooltip for dropdown list label in form for profile settings. + get_nice_language_list(), + _('Preferred language.'), + false, + $language + ); $this->elementEnd('li'); $timezone = common_timezone(); $timezones = array(); - foreach(DateTimeZone::listIdentifiers() as $k => $v) { + foreach (DateTimeZone::listIdentifiers() as $k => $v) { $timezones[$v] = $v; } $this->elementStart('li'); // TRANS: Dropdownlist label in form for profile settings. - $this->dropdown('timezone', _('Timezone'), - // TRANS: Tooltip for dropdown list label in form for profile settings. - $timezones, _('What timezone are you normally in?'), - true, $timezone); + $this->dropdown( + 'timezone', + _('Timezone'), + // TRANS: Tooltip for dropdown list label in form for profile settings. + $timezones, + _('What timezone are you normally in?'), + true, + $timezone + ); $this->elementEnd('li'); $this->elementStart('li'); - $this->checkbox('autosubscribe', - // TRANS: Checkbox label in form for profile settings. - _('Automatically subscribe to whoever '. - 'subscribes to me (best for non-humans)'), - ($this->arg('autosubscribe')) ? - $this->boolean('autosubscribe') : $user->autosubscribe); + $this->checkbox( + 'autosubscribe', + // TRANS: Checkbox label in form for profile settings. + _('Automatically subscribe to whoever '. + 'subscribes to me (best for non-humans)'), + ($this->arg('autosubscribe') ? + $this->boolean('autosubscribe') : $user->autosubscribe) + ); $this->elementEnd('li'); $this->elementStart('li'); - $this->dropdown('subscribe_policy', - // TRANS: Dropdown field label on profile settings, for what policies to apply when someone else tries to subscribe to your updates. - _('Subscription policy'), - // TRANS: Dropdown field option for following policy. - array(User::SUBSCRIBE_POLICY_OPEN => _('Let anyone follow me'), - // TRANS: Dropdown field option for following policy. - User::SUBSCRIBE_POLICY_MODERATE => _('Ask me first')), - // TRANS: Dropdown field title on group edit form. - _('Whether other users need your permission to follow your updates.'), - false, - (empty($user->subscribe_policy)) ? User::SUBSCRIBE_POLICY_OPEN : $user->subscribe_policy); + $this->dropdown( + 'subscribe_policy', + // TRANS: Dropdown field label on profile settings, for what policies to apply when someone else tries to subscribe to your updates. + _('Subscription policy'), + [ + // TRANS: Dropdown field option for following policy. + User::SUBSCRIBE_POLICY_OPEN => _('Let anyone follow me'), + // TRANS: Dropdown field option for following policy. + User::SUBSCRIBE_POLICY_MODERATE => _('Ask me first'), + ], + // TRANS: Dropdown field title on group edit form. + _('Whether other users need your permission to follow your updates.'), + false, + (empty($user->subscribe_policy) ? User::SUBSCRIBE_POLICY_OPEN : $user->subscribe_policy) + ); $this->elementEnd('li'); } if (common_config('profile', 'allowprivate') || $user->private_stream) { $this->elementStart('li'); - $this->checkbox('private_stream', - // TRANS: Checkbox label in profile settings. - _('Make updates visible only to my followers'), - ($this->arg('private_stream')) ? - $this->boolean('private_stream') : $user->private_stream); + $this->checkbox( + 'private_stream', + // TRANS: Checkbox label in profile settings. + _('Make updates visible only to my followers'), + ($this->arg('private_stream') ? + $this->boolean('private_stream') : $user->private_stream) + ); $this->elementEnd('li'); } $this->elementEnd('ul'); // TRANS: Button to save input in profile settings. - $this->submit('save', _m('BUTTON','Save')); + $this->submit('save', _m('BUTTON', 'Save')); $this->elementEnd('fieldset'); $this->elementEnd('form'); @@ -255,7 +290,7 @@ class ProfilesettingsAction extends SettingsAction $homepage = $this->trimmed('homepage'); $bio = $this->trimmed('bio'); $location = $this->trimmed('location'); - $autosubscribe = $this->booleanintstring('autosubscribe'); + $autosubscribe = $this->boolean('autosubscribe'); $subscribe_policy = $this->trimmed('subscribe_policy'); $language = $this->trimmed('language'); $timezone = $this->trimmed('timezone'); @@ -266,24 +301,26 @@ class ProfilesettingsAction extends SettingsAction !common_valid_http_url($homepage)) { // TRANS: Validation error in form for profile settings. throw new ClientException(_('Homepage is not a valid URL.')); - } else if (!is_null($fullname) && mb_strlen($fullname) > 191) { + } elseif (!is_null($fullname) && mb_strlen($fullname) > 191) { // TRANS: Validation error in form for profile settings. throw new ClientException(_('Full name is too long (maximum 191 characters).')); - } else if (Profile::bioTooLong($bio)) { + } elseif (Profile::bioTooLong($bio)) { // TRANS: Validation error in form for profile settings. // TRANS: Plural form is used based on the maximum number of allowed // TRANS: characters for the biography (%d). - throw new ClientException(sprintf(_m('Bio is too long (maximum %d character).', - 'Bio is too long (maximum %d characters).', - Profile::maxBio()), - Profile::maxBio())); - } else if (!is_null($location) && mb_strlen($location) > 191) { + throw new ClientException(sprintf( + _m('Bio is too long (maximum %d character).', + 'Bio is too long (maximum %d characters).', + Profile::maxBio()), + Profile::maxBio() + )); + } elseif (!is_null($location) && mb_strlen($location) > 191) { // TRANS: Validation error in form for profile settings. throw new ClientException(_('Location is too long (maximum 191 characters).')); - } else if (is_null($timezone) || !in_array($timezone, DateTimeZone::listIdentifiers())) { + } elseif (is_null($timezone) || !in_array($timezone, DateTimeZone::listIdentifiers())) { // TRANS: Validation error in form for profile settings. throw new ClientException(_('Timezone not selected.')); - } else if (!is_null($language) && strlen($language) > 50) { + } elseif (!is_null($language) && strlen($language) > 50) { // TRANS: Validation error in form for profile settings. throw new ClientException(_('Language is too long (maximum 50 characters).')); } @@ -291,7 +328,6 @@ class ProfilesettingsAction extends SettingsAction $tags = array(); $tag_priv = array(); if (is_string($tagstring) && strlen($tagstring) > 0) { - $tags = preg_split('/[\s,]+/', $tagstring); foreach ($tags as &$tag) { @@ -314,21 +350,19 @@ class ProfilesettingsAction extends SettingsAction // Only allow setting private_stream if site policy allows it // (or user already _has_ a private stream, then you can unset it) if (common_config('profile', 'allowprivate') || $user->private_stream) { - $private_stream = $this->booleanintstring('private_stream'); + $private_stream = $this->boolean('private_stream'); } else { // if not allowed, we set to the existing value - $private_stream = $user->private_stream; + $private_stream = (bool) $user->private_stream; } // $user->nickname is updated through Profile->update(); - // XXX: XOR - if (($user->autosubscribe ^ $autosubscribe) - || ($user->private_stream ^ $private_stream) + if ((bool) $user->autosubscribe != $autosubscribe + || (bool) $user->private_stream != $private_stream || $user->timezone != $timezone || $user->language != $language || $user->subscribe_policy != $subscribe_policy) { - $original = clone($user); $user->autosubscribe = $autosubscribe; @@ -378,7 +412,6 @@ class ProfilesettingsAction extends SettingsAction } if (common_config('location', 'share') == 'user') { - $exists = false; $prefs = User_location_prefs::getKV('user_id', $this->scoped->getID()); @@ -393,7 +426,7 @@ class ProfilesettingsAction extends SettingsAction $orig = clone($prefs); } - $prefs->share_location = $this->booleanintstring('sharelocation'); + $prefs->share_location = $this->boolean('sharelocation'); if ($exists) { $result = $prefs->update($orig); @@ -429,11 +462,11 @@ class ProfilesettingsAction extends SettingsAction // TRANS: Confirmation shown when user profile settings are saved. return _('Settings saved.'); - } } - function showAside() { + public function showAside() + { $this->elementStart('div', array('id' => 'aside_primary', 'class' => 'aside')); @@ -443,26 +476,32 @@ class ProfilesettingsAction extends SettingsAction if (Event::handle('StartProfileSettingsActions', array($this))) { if ($this->scoped->hasRight(Right::BACKUPACCOUNT)) { $this->elementStart('li'); - $this->element('a', - array('href' => common_local_url('backupaccount')), - // TRANS: Option in profile settings to create a backup of the account of the currently logged in user. - _('Backup account')); + $this->element( + 'a', + ['href' => common_local_url('backupaccount')], + // TRANS: Option in profile settings to create a backup of the account of the currently logged in user. + _('Backup account') + ); $this->elementEnd('li'); } if ($this->scoped->hasRight(Right::DELETEACCOUNT)) { $this->elementStart('li'); - $this->element('a', - array('href' => common_local_url('deleteaccount')), - // TRANS: Option in profile settings to delete the account of the currently logged in user. - _('Delete account')); + $this->element( + 'a', + ['href' => common_local_url('deleteaccount')], + // TRANS: Option in profile settings to delete the account of the currently logged in user. + _('Delete account') + ); $this->elementEnd('li'); } if ($this->scoped->hasRight(Right::RESTOREACCOUNT)) { $this->elementStart('li'); - $this->element('a', - array('href' => common_local_url('restoreaccount')), - // TRANS: Option in profile settings to restore the account of the currently logged in user from a backup. - _('Restore account')); + $this->element( + 'a', + ['href' => common_local_url('restoreaccount')], + // TRANS: Option in profile settings to restore the account of the currently logged in user from a backup. + _('Restore account') + ); $this->elementEnd('li'); } Event::handle('EndProfileSettingsActions', array($this)); diff --git a/classes/Avatar.php b/classes/Avatar.php index 5557533ed0..cbb3fc1e5e 100644 --- a/classes/Avatar.php +++ b/classes/Avatar.php @@ -1,6 +1,20 @@ . -if (!defined('GNUSOCIAL')) { exit(1); } +defined('GNUSOCIAL') || die(); /** * Table Definition for avatar @@ -10,20 +24,20 @@ class Avatar extends Managed_DataObject { public $__table = 'avatar'; // table name public $profile_id; // int(4) primary_key not_null - public $original; // tinyint(1) + public $original; // bool default_false public $width; // int(4) primary_key not_null public $height; // int(4) primary_key not_null public $mediatype; // varchar(32) not_null public $filename; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime() not_null default_0000-00-00%2000%3A00%3A00 public $modified; // datetime() not_null default_CURRENT_TIMESTAMP - + public static function schemaDef() { return array( 'fields' => array( 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), - 'original' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'uploaded by user or generated?'), + 'original' => array('type' => 'bool', 'default' => false, 'description' => 'uploaded by user or generated?'), 'width' => array('type' => 'int', 'not null' => true, 'description' => 'image width'), 'height' => array('type' => 'int', 'not null' => true, 'description' => 'image height'), 'mediatype' => array('type' => 'varchar', 'length' => 32, 'not null' => true, 'description' => 'file type'), @@ -45,7 +59,7 @@ class Avatar extends Managed_DataObject } // We clean up the file, too - function delete($useWhere=false) + public function delete($useWhere = false) { $filename = $this->filename; if (file_exists(Avatar::path($filename))) { @@ -57,11 +71,12 @@ class Avatar extends Managed_DataObject /* * Deletes all avatars (but may spare the original) from a profile. - * + * * @param Profile $target The profile we're deleting avatars of. * @param boolean $original Whether original should be removed or not. */ - public static function deleteFromProfile(Profile $target, $original=true) { + public static function deleteFromProfile(Profile $target, $original = true) + { try { $avatars = self::getProfileAvatars($target); foreach ($avatars as $avatar) { @@ -77,7 +92,7 @@ class Avatar extends Managed_DataObject return true; } - static protected $_avatars = array(); + protected static $_avatars = []; /* * Get an avatar by profile. Currently can't call newSize with $height @@ -93,7 +108,7 @@ class Avatar extends Managed_DataObject $size = "{$width}x{$height}"; if (!isset(self::$_avatars[$target->id])) { self::$_avatars[$target->id] = array(); - } elseif (isset(self::$_avatars[$target->id][$size])){ + } elseif (isset(self::$_avatars[$target->id][$size])) { return self::$_avatars[$target->id][$size]; } @@ -137,7 +152,8 @@ class Avatar extends Managed_DataObject return $avatar; } - public static function getProfileAvatars(Profile $target) { + public static function getProfileAvatars(Profile $target) + { $avatar = new Avatar(); $avatar->profile_id = $target->id; if (!$avatar->find()) { @@ -149,7 +165,7 @@ class Avatar extends Managed_DataObject /** * Where should the avatar go for this user? */ - static function filename($id, $extension, $size=null, $extra=null) + public static function filename($id, $extension, $size = null, $extra = null) { if ($size) { return $id . '-' . $size . (($extra) ? ('-' . $extra) : '') . $extension; @@ -158,7 +174,7 @@ class Avatar extends Managed_DataObject } } - static function path($filename) + public static function path($filename) { $dir = common_config('avatar', 'dir'); @@ -169,7 +185,7 @@ class Avatar extends Managed_DataObject return $dir . $filename; } - static function url($filename) + public static function url($filename) { $path = common_config('avatar', 'path'); @@ -194,20 +210,21 @@ class Avatar extends Managed_DataObject return $protocol.'://'.$server.$path.$filename; } - function displayUrl() + public function displayUrl() { return Avatar::url($this->filename); } - static function urlByProfile(Profile $target, $width=null, $height=null) { + public static function urlByProfile(Profile $target, $width = null, $height = null) + { try { - return self::byProfile($target, $width, $height)->displayUrl(); + return self::byProfile($target, $width, $height)->displayUrl(); } catch (Exception $e) { return self::defaultImage($width); } } - static function defaultImage($size=null) + public static function defaultImage($size = null) { if (is_null($size)) { $size = AVATAR_PROFILE_SIZE; @@ -218,7 +235,8 @@ class Avatar extends Managed_DataObject return Theme::path('default-avatar-'.$sizenames[$size].'.png'); } - static function newSize(Profile $target, $width) { + public static function newSize(Profile $target, $width) + { $width = intval($width); if ($width < 1 || $width > common_config('avatar', 'maxsize')) { // TRANS: An error message when avatar size is unreasonable @@ -231,8 +249,12 @@ class Avatar extends Managed_DataObject $original = Avatar::getUploaded($target); $imagefile = new ImageFile(null, Avatar::path($original->filename)); - $filename = Avatar::filename($target->getID(), image_type_to_extension($imagefile->preferredType()), - $width, common_timestamp()); + $filename = Avatar::filename( + $target->getID(), + image_type_to_extension($imagefile->preferredType()), + $width, + common_timestamp() + ); $imagefile->resizeTo(Avatar::path($filename), array('width'=>$width, 'height'=>$height)); $scaled = clone($original); diff --git a/classes/Group_member.php b/classes/Group_member.php index f84db6439c..ba12efaf3b 100644 --- a/classes/Group_member.php +++ b/classes/Group_member.php @@ -1,4 +1,21 @@ . + +defined('GNUSOCIAL') || die(); + /** * Table Definition for group_member */ @@ -11,7 +28,7 @@ class Group_member extends Managed_DataObject public $__table = 'group_member'; // table name public $group_id; // int(4) primary_key not_null public $profile_id; // int(4) primary_key not_null - public $is_admin; // tinyint(1) + public $is_admin; // bool default_false public $uri; // varchar(191) not 255 because utf8mb4 takes more space public $created; // datetime() not_null default_0000-00-00%2000%3A00%3A00 public $modified; // datetime() not_null default_CURRENT_TIMESTAMP @@ -25,7 +42,7 @@ class Group_member extends Managed_DataObject 'fields' => array( 'group_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to user_group'), 'profile_id' => array('type' => 'int', 'not null' => true, 'description' => 'foreign key to profile table'), - 'is_admin' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'is this user an admin?'), + 'is_admin' => array('type' => 'bool', 'default' => false, 'description' => 'is this user an admin?'), 'uri' => array('type' => 'varchar', 'length' => 191, 'description' => 'universal identifier'), 'created' => array('type' => 'datetime', 'not null' => true, 'default' => '0000-00-00 00:00:00', 'description' => 'date this record was created'), 'modified' => array('type' => 'datetime', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'), @@ -54,20 +71,22 @@ class Group_member extends Managed_DataObject * * @param integer $group_id Group to add to * @param integer $profile_id Profile being added - * + * * @return Group_member new membership object */ - static function join($group_id, $profile_id) + public static function join($group_id, $profile_id) { $member = new Group_member(); $member->group_id = $group_id; $member->profile_id = $profile_id; $member->created = common_sql_now(); - $member->uri = self::newUri(Profile::getByID($profile_id), - User_group::getByID($group_id), - $member->created); + $member->uri = self::newUri( + Profile::getByID($profile_id), + User_group::getByID($group_id), + $member->created + ); $result = $member->insert(); @@ -80,7 +99,7 @@ class Group_member extends Managed_DataObject return $member; } - static function leave($group_id, $profile_id) + public static function leave($group_id, $profile_id) { $member = Group_member::pkeyGet(array('group_id' => $group_id, 'profile_id' => $profile_id)); @@ -101,27 +120,27 @@ class Group_member extends Managed_DataObject return true; } - function getMember() + public function getMember() { $member = Profile::getKV('id', $this->profile_id); if (empty($member)) { // TRANS: Exception thrown providing an invalid profile ID. // TRANS: %s is the invalid profile ID. - throw new Exception(sprintf(_("Profile ID %s is invalid."),$this->profile_id)); + throw new Exception(sprintf(_("Profile ID %s is invalid."), $this->profile_id)); } return $member; } - function getGroup() + public function getGroup() { $group = User_group::getKV('id', $this->group_id); if (empty($group)) { // TRANS: Exception thrown providing an invalid group ID. // TRANS: %s is the invalid group ID. - throw new Exception(sprintf(_("Group ID %s is invalid."),$this->group_id)); + throw new Exception(sprintf(_('Group ID %s is invalid.'), $this->group_id)); } return $group; @@ -137,7 +156,7 @@ class Group_member extends Managed_DataObject * @return Group_member stream of memberships, use fetch() to iterate */ - static function byMember($memberId, $offset=0, $limit=GROUPS_PER_PAGE) + public static function byMember($memberId, $offset = 0, $limit = GROUPS_PER_PAGE) { $membership = new Group_member(); @@ -152,7 +171,7 @@ class Group_member extends Managed_DataObject return $membership; } - function asActivity() + public function asActivity() { $member = $this->getMember(); @@ -180,13 +199,19 @@ class Group_member extends Managed_DataObject // TRANS: Success message for subscribe to group attempt through OStatus. // TRANS: %1$s is the member name, %2$s is the subscribed group's name. - $act->content = sprintf(_('%1$s has joined group %2$s.'), - $member->getBestName(), - $group->getBestName()); + $act->content = sprintf( + _('%1$s has joined group %2$s.'), + $member->getBestName(), + $group->getBestName() + ); - $url = common_local_url('AtomPubShowMembership', - array('profile' => $member->id, - 'group' => $group->id)); + $url = common_local_url( + 'AtomPubShowMembership', + [ + 'profile' => $member->id, + 'group' => $group->id, + ] + ); $act->selfLink = $url; $act->editLink = $url; @@ -203,7 +228,7 @@ class Group_member extends Managed_DataObject mail_notify_group_join($this->getGroup(), $this->getMember()); } - function getUri() + public function getUri() { return $this->uri ?: self::newUri($this->getMember(), $this->getGroup()->getProfile(), $this->created); } diff --git a/classes/Managed_DataObject.php b/classes/Managed_DataObject.php index 539267d68c..315d3c7021 100644 --- a/classes/Managed_DataObject.php +++ b/classes/Managed_DataObject.php @@ -238,12 +238,15 @@ abstract class Managed_DataObject extends Memcached_DataObject } // Data type formatting style... - $formatStyles = array('blob' => DB_DATAOBJECT_BLOB, - 'text' => DB_DATAOBJECT_TXT, - 'date' => DB_DATAOBJECT_DATE, - 'time' => DB_DATAOBJECT_TIME, - 'datetime' => DB_DATAOBJECT_DATE | DB_DATAOBJECT_TIME, - 'timestamp' => DB_DATAOBJECT_MYSQLTIMESTAMP); + $formatStyles = [ + 'blob' => DB_DATAOBJECT_BLOB, + 'text' => DB_DATAOBJECT_TXT, + 'bool' => DB_DATAOBJECT_BOOL, + 'date' => DB_DATAOBJECT_DATE, + 'time' => DB_DATAOBJECT_TIME, + 'datetime' => DB_DATAOBJECT_DATE | DB_DATAOBJECT_TIME, + 'timestamp' => DB_DATAOBJECT_MYSQLTIMESTAMP, + ]; if (isset($formatStyles[$type])) { $style |= $formatStyles[$type]; diff --git a/classes/Old_school_prefs.php b/classes/Old_school_prefs.php index 52f72eaa5c..44303b959c 100644 --- a/classes/Old_school_prefs.php +++ b/classes/Old_school_prefs.php @@ -1,48 +1,36 @@ . + /** - * StatusNet - the distributed open-source microblogging tool - * Copyright (C) 2011, StatusNet, Inc. - * * Older-style UI preferences - * - * PHP version 5 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . * * @category UI - * @package StatusNet + * @package GNUsocial * @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/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('STATUSNET')) { - // This check helps protect against security problems; - // your code file can't be executed directly from the web. - exit(1); -} +defined('GNUSOCIAL') || die(); /** * Separate table for storing UI preferences * - * @category UI - * @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/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ class Old_school_prefs extends Managed_DataObject @@ -60,17 +48,14 @@ class Old_school_prefs extends Managed_DataObject return array( 'fields' => array( 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who has the preference'), - 'stream_mode_only' => array('type' => 'int', - 'size' => 'tiny', - 'default' => 1, + 'stream_mode_only' => array('type' => 'bool', + 'default' => true, 'description' => 'No conversation streams'), - 'conversation_tree' => array('type' => 'int', - 'size' => 'tiny', - 'default' => 1, + 'conversation_tree' => array('type' => 'bool', + 'default' => true, 'description' => 'Hierarchical tree view for conversations'), - 'stream_nicknames' => array('type' => 'int', - 'size' => 'tiny', - 'default' => 1, + 'stream_nicknames' => array('type' => 'bool', + 'default' => true, 'description' => 'Show nicknames for authors and addressees in streams'), 'created' => array('type' => 'datetime', 'not null' => true, 'default' => '0000-00-00 00:00:00', 'description' => 'date this record was created'), 'modified' => array('type' => 'datetime', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'), diff --git a/classes/Profile.php b/classes/Profile.php index 4b5badc663..0514462a65 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -1,23 +1,25 @@ . +// This file is part of GNU social - https://www.gnu.org/software/social +// +// GNU social is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// GNU social is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with GNU social. If not, see . + +/** + * @copyright 2008-2011 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('GNUSOCIAL')) { exit(1); } +defined('GNUSOCIAL') || die(); /** * Table Definition for profile @@ -81,7 +83,7 @@ class Profile extends Managed_DataObject throw new NoSuchUserException(array('email'=>$email)); } return $user->getProfile(); - } + } protected $_user = array(); @@ -202,16 +204,16 @@ class Profile extends Managed_DataObject * * @return string */ - function getBestName() + public function getBestName() { return ($this->fullname) ? $this->fullname : $this->nickname; } /** - * Takes the currently scoped profile into account to give a name + * Takes the currently scoped profile into account to give a name * to list in notice streams. Preferences may differ between profiles. */ - function getStreamName() + public function getStreamName() { $user = common_current_user(); if ($user instanceof User && $user->streamNicknames()) { @@ -228,7 +230,7 @@ class Profile extends Managed_DataObject * * @return string */ - function getFancyName() + public function getFancyName() { $uri = null; try { @@ -243,7 +245,7 @@ class Profile extends Managed_DataObject if (mb_strlen($this->getFullname()) > 0) { // TRANS: The "fancy name": Full name of a profile or group (%1$s) followed by some URI (%2$s) in parentheses. - return sprintf(_m('FANCYNAME','%1$s (%2$s)'), $this->getFullname(), $uri); + return sprintf(_m('FANCYNAME', '%1$s (%2$s)'), $this->getFullname(), $uri); } else { return $uri; } @@ -254,7 +256,7 @@ class Profile extends Managed_DataObject * * @return mixed Notice or null */ - function getCurrentNotice(Profile $scoped=null) + public function getCurrentNotice(Profile $scoped = null) { try { $notice = $this->getNotices(0, 1, 0, 0, $scoped); @@ -271,16 +273,16 @@ class Profile extends Managed_DataObject // Maybe we should let this through if it's handled well upstream return null; } - + return null; } - function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) + public function getReplies($offset = 0, $limit = NOTICES_PER_PAGE, $since_id = 0, $before_id = 0) { return Reply::stream($this->getID(), $offset, $limit, $since_id, $before_id); } - function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0) + public function getTaggedNotices($tag, $offset = 0, $limit = NOTICES_PER_PAGE, $since_id = 0, $max_id = 0) { //FIXME: Get Profile::current() some other way to avoid possible // confusion between current session profile and background processing. @@ -289,39 +291,39 @@ class Profile extends Managed_DataObject return $stream->getNotices($offset, $limit, $since_id, $max_id); } - function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0, Profile $scoped=null) + public function getNotices($offset = 0, $limit = NOTICES_PER_PAGE, $since_id = 0, $max_id = 0, Profile $scoped = null) { $stream = new ProfileNoticeStream($this, $scoped); return $stream->getNotices($offset, $limit, $since_id, $max_id); } - function isMember(User_group $group) + public function isMember(User_group $group) { - $groups = $this->getGroups(0, null); + $groups = $this->getGroups(0, null); while ($groups instanceof User_group && $groups->fetch()) { - if ($groups->id == $group->id) { - return true; - } - } - return false; + if ($groups->id == $group->id) { + return true; + } + } + return false; } - function isAdmin(User_group $group) + public function isAdmin(User_group $group) { $gm = Group_member::pkeyGet(array('profile_id' => $this->id, 'group_id' => $group->id)); return (!empty($gm) && $gm->is_admin); } - function isPendingMember($group) + public function isPendingMember($group) { $request = Group_join_queue::pkeyGet(array('profile_id' => $this->id, 'group_id' => $group->id)); return !empty($request); } - function getGroups($offset=0, $limit=PROFILES_PER_PAGE) + public function getGroups($offset = 0, $limit = PROFILES_PER_PAGE) { $ids = array(); @@ -356,14 +358,15 @@ class Profile extends Managed_DataObject } } - function getGroupCount() { + public function getGroupCount() + { $groups = $this->getGroups(0, null); return $groups instanceof User_group ? $groups->N : 0; } - function isTagged($peopletag) + public function isTagged($peopletag) { $tag = Profile_tag::pkeyGet(array('tagger' => $peopletag->tagger, 'tagged' => $this->id, @@ -371,7 +374,7 @@ class Profile extends Managed_DataObject return !empty($tag); } - function canTag($tagged) + public function canTag($tagged) { if (empty($tagged)) { return false; @@ -395,16 +398,16 @@ class Profile extends Managed_DataObject if ($local) { return true; } - } else if ($subs) { + } elseif ($subs) { return (Subscription::exists($this, $tagged) || Subscription::exists($tagged, $this)); - } else if ($remote) { + } elseif ($remote) { return true; } return false; } - function getLists(Profile $scoped=null, $offset=0, $limit=null, $since_id=0, $max_id=0) + public function getLists(Profile $scoped = null, $offset = 0, $limit = null, $since_id = 0, $max_id = 0) { $ids = array(); @@ -421,15 +424,15 @@ class Profile extends Managed_DataObject $list->tagger = $this->id; $list->selectAdd('id as "cursor"'); - if ($since_id>0) { - $list->whereAdd('id > '.$since_id); + if ($since_id > 0) { + $list->whereAdd('id > ' . $since_id); } - if ($max_id>0) { - $list->whereAdd('id <= '.$max_id); + if ($max_id > 0) { + $list->whereAdd('id <= ' . $max_id); } - if($offset>=0 && !is_null($limit)) { + if ($offset >= 0 && !is_null($limit)) { $list->limit($offset, $limit); } @@ -452,7 +455,6 @@ class Profile extends Managed_DataObject $list = Profile_list::getKV('id', $id); if (!empty($list) && ($showPrivate || !$list->private)) { - if (!isset($list->cursor)) { $list->cursor = $list->id; } @@ -476,25 +478,28 @@ class Profile extends Managed_DataObject * @return Profile_list resulting lists */ - function getOtherTags(Profile $scoped=null, $offset=0, $limit=null, $since_id=0, $max_id=0) + public function getOtherTags(Profile $scoped = null, $offset = 0, $limit = null, $since_id = 0, $max_id = 0) { $list = new Profile_list(); - $qry = sprintf('select profile_list.*, unix_timestamp(profile_tag.modified) as "cursor" ' . - 'from profile_tag join profile_list '. - 'on (profile_tag.tagger = profile_list.tagger ' . - ' and profile_tag.tag = profile_list.tag) ' . - 'where profile_tag.tagged = %d ', - $this->id); - + $qry = sprintf( + 'SELECT profile_list.*, unix_timestamp(profile_tag.modified) AS "cursor" ' . + 'FROM profile_tag JOIN profile_list '. + 'ON (profile_tag.tagger = profile_list.tagger ' . + ' AND profile_tag.tag = profile_list.tag) ' . + 'WHERE profile_tag.tagged = %d ', + $this->id + ); if (!is_null($scoped)) { - $qry .= sprintf('AND ( ( profile_list.private = false ) ' . - 'OR ( profile_list.tagger = %d AND ' . - 'profile_list.private = true ) )', - $scoped->getID()); + $qry .= sprintf( + 'AND ( profile_list.private = false ' . + 'OR ( profile_list.tagger = %d AND ' . + 'profile_list.private = TRUE ) )', + $scoped->getID() + ); } else { - $qry .= 'AND profile_list.private = 0 '; + $qry .= 'AND profile_list.private = FALSE '; } if ($since_id > 0) { @@ -515,21 +520,21 @@ class Profile extends Managed_DataObject return $list; } - function getPrivateTags($offset=0, $limit=null, $since_id=0, $max_id=0) + public function getPrivateTags($offset = 0, $limit = null, $since_id = 0, $max_id = 0) { $tags = new Profile_list(); $tags->private = true; $tags->tagger = $this->id; - if ($since_id>0) { - $tags->whereAdd('id > '.$since_id); + if ($since_id > 0) { + $tags->whereAdd('id > ' . $since_id); } - if ($max_id>0) { - $tags->whereAdd('id <= '.$max_id); + if ($max_id > 0) { + $tags->whereAdd('id <= ' . $max_id); } - if($offset>=0 && !is_null($limit)) { + if ($offset >= 0 && !is_null($limit)) { $tags->limit($offset, $limit); } @@ -539,7 +544,7 @@ class Profile extends Managed_DataObject return $tags; } - function hasLocalTags() + public function hasLocalTags() { $tags = new Profile_tag(); @@ -553,7 +558,7 @@ class Profile extends Managed_DataObject return ($tags->N == 0) ? false : true; } - function getTagSubscriptions($offset=0, $limit=null, $since_id=0, $max_id=0) + public function getTagSubscriptions($offset = 0, $limit = null, $since_id = 0, $max_id = 0) { $lists = new Profile_list(); $subs = new Profile_tag_subscription(); @@ -565,15 +570,15 @@ class Profile extends Managed_DataObject $lists->whereAdd('profile_tag_subscription.profile_id = '.$this->id); - if ($since_id>0) { - $lists->whereAdd('cursor > '.$since_id); + if ($since_id > 0) { + $lists->whereAdd('cursor > ' . $since_id); } - if ($max_id>0) { - $lists->whereAdd('cursor <= '.$max_id); + if ($max_id > 0) { + $lists->whereAdd('cursor <= ' . $max_id); } - if($offset>=0 && !is_null($limit)) { + if ($offset >= 0 && !is_null($limit)) { $lists->limit($offset, $limit); } @@ -590,7 +595,7 @@ class Profile extends Managed_DataObject * @param User_group $group * @return mixed: Group_member on success, Group_join_queue if pending approval, null on some cancels? */ - function joinGroup(User_group $group) + public function joinGroup(User_group $group) { $join = null; if ($group->join_policy == User_group::JOIN_POLICY_MODERATE) { @@ -616,7 +621,7 @@ class Profile extends Managed_DataObject * * @param User_group $group */ - function leaveGroup(User_group $group) + public function leaveGroup(User_group $group) { if (Event::handle('StartLeaveGroup', array($group, $this))) { Group_member::leave($group->id, $this->id); @@ -627,12 +632,12 @@ class Profile extends Managed_DataObject } } - function avatarUrl($size=AVATAR_PROFILE_SIZE) + public function avatarUrl($size = AVATAR_PROFILE_SIZE) { return Avatar::urlByProfile($this, $size); } - function getSubscribed($offset=0, $limit=null) + public function getSubscribed($offset = 0, $limit = null) { $subs = Subscription::getSubscribedIDs($this->id, $offset, $limit); try { @@ -643,7 +648,7 @@ class Profile extends Managed_DataObject return $profiles; } - function getSubscribers($offset=0, $limit=null) + public function getSubscribers($offset = 0, $limit = null) { $subs = Subscription::getSubscriberIDs($this->id, $offset, $limit); try { @@ -654,7 +659,7 @@ class Profile extends Managed_DataObject return $profiles; } - function getTaggedSubscribers($tag, $offset=0, $limit=null) + public function getTaggedSubscribers($tag, $offset = 0, $limit = null) { $qry = 'SELECT profile.* ' . @@ -678,7 +683,7 @@ class Profile extends Managed_DataObject return $profile; } - function getTaggedSubscriptions($tag, $offset=0, $limit=null) + public function getTaggedSubscriptions($tag, $offset = 0, $limit = null) { $qry = 'SELECT profile.* ' . @@ -707,7 +712,7 @@ class Profile extends Managed_DataObject * @param int $limit * @return Profile */ - function getRequests($offset=0, $limit=null) + public function getRequests($offset = 0, $limit = null) { // FIXME: mysql only $subqueue = new Profile(); @@ -721,7 +726,7 @@ class Profile extends Managed_DataObject return $subqueue; } - function subscriptionCount() + public function subscriptionCount() { $c = Cache::instance(); @@ -749,7 +754,7 @@ class Profile extends Managed_DataObject return $cnt; } - function subscriberCount() + public function subscriberCount() { $c = Cache::instance(); if (!empty($c)) { @@ -777,12 +782,12 @@ class Profile extends Managed_DataObject * @param Profile $other * @return boolean */ - function isSubscribed(Profile $other) + public function isSubscribed(Profile $other) { return Subscription::exists($this, $other); } - function readableBy(Profile $other=null) + public function readableBy(Profile $other = null) { // If it's not a private stream, it's readable by anyone if (!$this->isPrivateStream()) { @@ -793,7 +798,7 @@ class Profile extends Managed_DataObject return is_null($other) ? false : $other->isSubscribed($this); } - function requiresSubscriptionApproval(Profile $other=null): bool + public function requiresSubscriptionApproval(Profile $other = null): bool { if (!$this->isLocal()) { // We don't know for remote users, and we'll always be able to send @@ -818,7 +823,7 @@ class Profile extends Managed_DataObject * @param Profile $other * @return boolean */ - function hasPendingSubscription(Profile $other) + public function hasPendingSubscription(Profile $other) { return Subscription_queue::exists($this, $other); } @@ -829,13 +834,13 @@ class Profile extends Managed_DataObject * @param Profile $other * @return boolean */ - function mutuallySubscribed(Profile $other) + public function mutuallySubscribed(Profile $other) { return $this->isSubscribed($other) && $other->isSubscribed($this); } - function noticeCount() + public function noticeCount() { $c = Cache::instance(); @@ -858,7 +863,7 @@ class Profile extends Managed_DataObject return $cnt; } - function blowSubscriberCount() + public function blowSubscriberCount() { $c = Cache::instance(); if (!empty($c)) { @@ -866,7 +871,7 @@ class Profile extends Managed_DataObject } } - function blowSubscriptionCount() + public function blowSubscriptionCount() { $c = Cache::instance(); if (!empty($c)) { @@ -874,7 +879,7 @@ class Profile extends Managed_DataObject } } - function blowNoticeCount() + public function blowNoticeCount() { $c = Cache::instance(); if (!empty($c)) { @@ -882,7 +887,7 @@ class Profile extends Managed_DataObject } } - static function maxBio() + public static function maxBio() { $biolimit = common_config('profile', 'biolimit'); // null => use global limit (distinct from 0!) @@ -892,13 +897,13 @@ class Profile extends Managed_DataObject return $biolimit; } - static function bioTooLong($bio) + public static function bioTooLong($bio) { $biolimit = self::maxBio(); return ($biolimit > 0 && !empty($bio) && (mb_strlen($bio) > $biolimit)); } - function update($dataObject=false) + public function update($dataObject = false) { if (is_object($dataObject) && $this->nickname != $dataObject->nickname) { try { @@ -946,7 +951,7 @@ class Profile extends Managed_DataObject return $relMes; } - function delete($useWhere=false) + public function delete($useWhere = false) { $this->_deleteNotices(); $this->_deleteSubscriptions(); @@ -957,10 +962,11 @@ class Profile extends Managed_DataObject // Warning: delete() will run on the batch objects, // not on individual objects. - $related = array('Reply', - 'Group_member', - 'Profile_role' - ); + $related = [ + 'Reply', + 'Group_member', + 'Profile_role', + ]; Event::handle('ProfileDeleteRelated', array($this, &$related)); foreach ($related as $cls) { @@ -968,7 +974,7 @@ class Profile extends Managed_DataObject $inst->profile_id = $this->id; $inst->delete(); } - + $this->grantRole(Profile_role::DELETED); $localuser = User::getKV('id', $this->id); @@ -979,7 +985,7 @@ class Profile extends Managed_DataObject return parent::delete($useWhere); } - function _deleteNotices() + public function _deleteNotices() { $notice = new Notice(); $notice->profile_id = $this->id; @@ -992,7 +998,7 @@ class Profile extends Managed_DataObject } } - function _deleteSubscriptions() + public function _deleteSubscriptions() { $sub = new Subscription(); $sub->subscriber = $this->getID(); @@ -1040,14 +1046,14 @@ class Profile extends Managed_DataObject $self->delete(); } - function _deleteTags() + public function _deleteTags() { $tag = new Profile_tag(); $tag->tagged = $this->id; $tag->delete(); } - function _deleteBlocks() + public function _deleteBlocks() { $block = new Profile_block(); $block->blocked = $this->id; @@ -1058,7 +1064,7 @@ class Profile extends Managed_DataObject $block->delete(); } - function _deleteAttentions() + public function _deleteAttentions() { $att = new Attention(); $att->profile_id = $this->getID(); @@ -1103,7 +1109,7 @@ class Profile extends Managed_DataObject if ($cfg == 'always') { return true; - } else if ($cfg == 'never') { + } elseif ($cfg == 'never') { return false; } else { // user $share = common_config('location', 'sharedefault'); @@ -1120,7 +1126,7 @@ class Profile extends Managed_DataObject } } - function hasRole($name) + public function hasRole($name) { $has_role = false; if (Event::handle('StartHasRole', array($this, $name, &$has_role))) { @@ -1132,10 +1138,9 @@ class Profile extends Managed_DataObject return $has_role; } - function grantRole($name) + public function grantRole($name) { if (Event::handle('StartGrantRole', array($this, $name))) { - $role = new Profile_role(); $role->profile_id = $this->id; @@ -1158,17 +1163,20 @@ class Profile extends Managed_DataObject return $result; } - function revokeRole($name) + public function revokeRole($name) { if (Event::handle('StartRevokeRole', array($this, $name))) { - $role = Profile_role::pkeyGet(array('profile_id' => $this->id, 'role' => $name)); if (empty($role)) { // TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. // TRANS: %1$s is the role name, %2$s is the user ID (number). - throw new Exception(sprintf(_('Cannot revoke role "%1$s" for user #%2$d; does not exist.'),$name, $this->id)); + throw new Exception(sprintf( + _('Cannot revoke role "%1$s" for user #%2$d; does not exist.'), + $name, + $this->id + )); } $result = $role->delete(); @@ -1177,7 +1185,11 @@ class Profile extends Managed_DataObject common_log_db_error($role, 'DELETE', __FILE__); // TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. // TRANS: %1$s is the role name, %2$s is the user ID (number). - throw new Exception(sprintf(_('Cannot revoke role "%1$s" for user #%2$d; database error.'),$name, $this->id)); + throw new Exception(sprintf( + _('Cannot revoke role "%1$s" for user #%2$d; database error.'), + $name, + $this->id + )); } if ($name == 'owner') { @@ -1190,27 +1202,27 @@ class Profile extends Managed_DataObject } } - function isSandboxed() + public function isSandboxed() { return $this->hasRole(Profile_role::SANDBOXED); } - function isSilenced() + public function isSilenced() { return $this->hasRole(Profile_role::SILENCED); } - function sandbox() + public function sandbox() { $this->grantRole(Profile_role::SANDBOXED); } - function unsandbox() + public function unsandbox() { $this->revokeRole(Profile_role::SANDBOXED); } - function silence() + public function silence() { $this->grantRole(Profile_role::SILENCED); if (common_config('notice', 'hidespam')) { @@ -1218,7 +1230,7 @@ class Profile extends Managed_DataObject } } - function silenceAs(Profile $actor) + public function silenceAs(Profile $actor) { if (!$actor->hasRight(Right::SILENCEUSER)) { throw new AuthorizationException(_('You cannot silence users on this site.')); @@ -1234,7 +1246,7 @@ class Profile extends Managed_DataObject return $this->silence(); } - function unsilence() + public function unsilence() { $this->revokeRole(Profile_role::SILENCED); if (common_config('notice', 'hidespam')) { @@ -1242,7 +1254,7 @@ class Profile extends Managed_DataObject } } - function unsilenceAs(Profile $actor) + public function unsilenceAs(Profile $actor) { if (!$actor->hasRight(Right::SILENCEUSER)) { // TRANS: Client error displayed trying to unsilence a user when the user does not have the right. @@ -1255,7 +1267,7 @@ class Profile extends Managed_DataObject return $this->unsilence(); } - function flushVisibility() + public function flushVisibility() { // Get all notices $stream = new ProfileNoticeStream($this, $this); @@ -1301,8 +1313,7 @@ class Profile extends Managed_DataObject } if (Event::handle('UserRightsCheck', array($this, $right, &$result))) { - switch ($right) - { + switch ($right) { case Right::DELETEOTHERSNOTICE: case Right::MAKEGROUPADMIN: case Right::SANDBOXUSER: @@ -1380,7 +1391,7 @@ class Profile extends Managed_DataObject * * @return string */ - function asAtomAuthor($cur = null) + public function asAtomAuthor($cur = null) { $xs = new XMLStringer(true); @@ -1388,7 +1399,7 @@ class Profile extends Managed_DataObject $xs->element('name', null, $this->nickname); $xs->element('uri', null, $this->getUri()); if ($cur != null) { - $attrs = Array(); + $attrs = []; $attrs['following'] = $cur->isSubscribed($this) ? 'true' : 'false'; $attrs['blocking'] = $cur->hasBlocked($this) ? 'true' : 'false'; $xs->element('statusnet:profile_info', $attrs, null); @@ -1409,7 +1420,7 @@ class Profile extends Managed_DataObject * @return array representation of element or null */ - function profileInfo(Profile $scoped=null) + public function profileInfo(Profile $scoped = null) { $profileInfoAttr = array('local_id' => $this->id); @@ -1431,7 +1442,7 @@ class Profile extends Managed_DataObject * * @return string */ - function asActivityActor() + public function asActivityActor() { return $this->asActivityNoun('actor'); } @@ -1447,7 +1458,7 @@ class Profile extends Managed_DataObject * * @return string */ - function asActivityNoun($element) + public function asActivityNoun($element) { $noun = $this->asActivityObject(); return $noun->asString('activity:' . $element); @@ -1619,7 +1630,7 @@ class Profile extends Managed_DataObject return $scheme ? $acct : mb_substr($acct, 5); } - function hasBlocked(Profile $other) + public function hasBlocked(Profile $other) { $block = Profile_block::exists($this, $other); return !empty($block); @@ -1652,7 +1663,7 @@ class Profile extends Managed_DataObject * * @param string $uri A unique identifier for a resource (profile/group/whatever) */ - static function fromUri($uri) + public static function fromUri($uri) { $profile = null; @@ -1677,7 +1688,7 @@ class Profile extends Managed_DataObject return $profile; } - function canRead(Notice $notice) + public function canRead(Notice $notice) { if ($notice->scope & Notice::SITE_SCOPE) { $user = $this->getUser(); @@ -1717,7 +1728,7 @@ class Profile extends Managed_DataObject return true; } - static function current() + public static function current() { $user = common_current_user(); if (empty($user)) { @@ -1728,7 +1739,7 @@ class Profile extends Managed_DataObject return $profile; } - static function ensureCurrent() + public static function ensureCurrent() { $profile = self::current(); if (!$profile instanceof Profile) { @@ -1747,7 +1758,7 @@ class Profile extends Managed_DataObject * @return array of variable names to include in serialization. */ - function __sleep() + public function __sleep() { $vars = parent::__sleep(); $skip = array('_user', '_group'); @@ -1802,11 +1813,13 @@ class Profile extends Managed_DataObject return !is_null($private_stream) && $private_stream; } - public function delPref($namespace, $topic) { + public function delPref($namespace, $topic) + { return Profile_prefs::setData($this, $namespace, $topic, null); } - public function getPref($namespace, $topic, $default=null) { + public function getPref($namespace, $topic, $default = null) + { // If you want an exception to be thrown, call Profile_prefs::getData directly try { return Profile_prefs::getData($this, $namespace, $topic, $default); @@ -1821,7 +1834,8 @@ class Profile extends Managed_DataObject return Profile_prefs::getConfigData($this, $namespace, $topic); } - public function setPref($namespace, $topic, $data) { + public function setPref($namespace, $topic, $data) + { return Profile_prefs::setData($this, $namespace, $topic, $data); } diff --git a/classes/Profile_list.php b/classes/Profile_list.php index 2a338f43c1..04c8848415 100644 --- a/classes/Profile_list.php +++ b/classes/Profile_list.php @@ -31,7 +31,7 @@ class Profile_list extends Managed_DataObject public $tagger; // int(4) public $tag; // varchar(64) public $description; // text - public $private; // tinyint(1) + public $private; // bool default_false public $created; // datetime() not_null default_0000-00-00%2000%3A00%3A00 public $modified; // datetime() not_null default_CURRENT_TIMESTAMP public $uri; // varchar(191) unique_key not 255 because utf8mb4 takes more space @@ -47,7 +47,7 @@ class Profile_list extends Managed_DataObject 'tagger' => array('type' => 'int', 'not null' => true, 'description' => 'user making the tag'), 'tag' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'people tag'), 'description' => array('type' => 'text', 'description' => 'description of the people tag'), - 'private' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'is this tag private'), + 'private' => array('type' => 'bool', 'default' => false, 'description' => 'is this tag private'), 'created' => array('type' => 'datetime', 'not null' => true, 'default' => '0000-00-00 00:00:00', 'description' => 'date the tag was added'), 'modified' => array('type' => 'datetime', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date the tag was modified'), diff --git a/classes/Profile_tag.php b/classes/Profile_tag.php index 7b52f8fc47..02fae227a4 100644 --- a/classes/Profile_tag.php +++ b/classes/Profile_tag.php @@ -96,7 +96,7 @@ class Profile_tag extends Managed_DataObject $qry = sprintf($qry, $tagger, $tagged); if (!$include_priv) { - $qry .= ' and profile_list.private = 0'; + $qry .= ' AND profile_list.private = FALSE'; } $profile_list->query($qry); @@ -122,7 +122,7 @@ class Profile_tag extends Managed_DataObject ); if (!$scoped instanceof Profile || $scoped->getID() !== $tagger) { - $qry .= 'and profile_list.private = 0'; + $qry .= 'AND profile_list.private = FALSE'; } $tags = array(); diff --git a/classes/Subscription.php b/classes/Subscription.php index bc707bb16a..54085e6ed3 100644 --- a/classes/Subscription.php +++ b/classes/Subscription.php @@ -1,23 +1,25 @@ . +// This file is part of GNU social - https://www.gnu.org/software/social +// +// GNU social is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// GNU social is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with GNU social. If not, see . + +/** + * @copyright 2008, 2009, StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('GNUSOCIAL')) { exit(1); } +defined('GNUSOCIAL') || die(); /** * Table Definition for subscription @@ -30,8 +32,8 @@ class Subscription extends Managed_DataObject public $__table = 'subscription'; // table name public $subscriber; // int(4) primary_key not_null public $subscribed; // int(4) primary_key not_null - public $jabber; // tinyint(1) default_1 - public $sms; // tinyint(1) default_1 + public $jabber; // bool default_true + public $sms; // bool default_true public $token; // varchar(191) not 255 because utf8mb4 takes more space public $secret; // varchar(191) not 255 because utf8mb4 takes more space public $uri; // varchar(191) not 255 because utf8mb4 takes more space @@ -44,8 +46,8 @@ class Subscription extends Managed_DataObject 'fields' => array( 'subscriber' => array('type' => 'int', 'not null' => true, 'description' => 'profile listening'), 'subscribed' => array('type' => 'int', 'not null' => true, 'description' => 'profile being listened to'), - 'jabber' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'deliver jabber messages'), - 'sms' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'deliver sms messages'), + 'jabber' => array('type' => 'bool', 'default' => true, 'description' => 'deliver jabber messages'), + 'sms' => array('type' => 'bool', 'default' => true, 'description' => 'deliver sms messages'), 'token' => array('type' => 'varchar', 'length' => 191, 'description' => 'authorization token'), 'secret' => array('type' => 'varchar', 'length' => 191, 'description' => 'token secret'), 'uri' => array('type' => 'varchar', 'length' => 191, 'description' => 'universally unique identifier'), @@ -74,7 +76,7 @@ class Subscription extends Managed_DataObject * @return mixed Subscription or Subscription_queue: new subscription info */ - static function start(Profile $subscriber, Profile $other, $force=false) + public static function start(Profile $subscriber, Profile $other, $force = false) { if (!$subscriber->hasRight(Right::SUBSCRIBE)) { // TRANS: Exception thrown when trying to subscribe while being banned from subscribing. @@ -117,7 +119,6 @@ class Subscription extends Managed_DataObject $otherUser->autosubscribe && !self::exists($other, $subscriber) && !$subscriber->hasBlocked($other)) { - try { self::start($other, $subscriber); } catch (AlreadyFulfilledException $e) { @@ -137,7 +138,7 @@ class Subscription extends Managed_DataObject return $sub; } - static function ensureStart(Profile $subscriber, Profile $other, $force=false) + public static function ensureStart(Profile $subscriber, Profile $other, $force = false) { try { $sub = self::start($subscriber, $other, $force); @@ -157,12 +158,14 @@ class Subscription extends Managed_DataObject $sub->subscriber = $subscriber->getID(); $sub->subscribed = $other->getID(); - $sub->jabber = 1; - $sub->sms = 1; + $sub->jabber = true; + $sub->sms = true; $sub->created = common_sql_now(); - $sub->uri = self::newUri($subscriber, - $other, - $sub->created); + $sub->uri = self::newUri( + $subscriber, + $other, + $sub->created + ); $result = $sub->insert(); @@ -175,7 +178,7 @@ class Subscription extends Managed_DataObject return $sub; } - function notify() + public function notify() { // XXX: add other notifications (Jabber, SMS) here // XXX: queue this and handle it offline @@ -184,12 +187,11 @@ class Subscription extends Managed_DataObject $this->notifyEmail(); } - function notifyEmail() + public function notifyEmail() { $subscribedUser = User::getKV('id', $this->subscribed); if ($subscribedUser instanceof User) { - $subscriber = Profile::getKV('id', $this->subscriber); mail_subscribe_notify_profile($subscribedUser, $subscriber); @@ -200,7 +202,7 @@ class Subscription extends Managed_DataObject * Cancel a subscription * */ - static function cancel(Profile $subscriber, Profile $other) + public static function cancel(Profile $subscriber, Profile $other) { if (!self::exists($subscriber, $other)) { // TRANS: Exception thrown when trying to unsibscribe without a subscription. @@ -215,7 +217,6 @@ class Subscription extends Managed_DataObject } if (Event::handle('StartUnsubscribe', array($subscriber, $other))) { - $sub = Subscription::pkeyGet(array('subscriber' => $subscriber->id, 'subscribed' => $other->id)); @@ -245,7 +246,7 @@ class Subscription extends Managed_DataObject return; } - static function exists(Profile $subscriber, Profile $other) + public static function exists(Profile $subscriber, Profile $other) { try { $sub = self::getSubscription($subscriber, $other); @@ -256,7 +257,7 @@ class Subscription extends Managed_DataObject return true; } - static function getSubscription(Profile $subscriber, Profile $other) + public static function getSubscription(Profile $subscriber, Profile $other) { // This is essentially a pkeyGet but we have an object to return in NoResultException $sub = new Subscription(); @@ -278,7 +279,7 @@ class Subscription extends Managed_DataObject return Profile::getByID($this->subscribed); } - function asActivity() + public function asActivity() { $subscriber = $this->getSubscriber(); $subscribed = $this->getSubscribed(); @@ -293,19 +294,25 @@ class Subscription extends Managed_DataObject $act->time = strtotime($this->created); // TRANS: Activity title when subscribing to another person. - $act->title = _m('TITLE','Follow'); + $act->title = _m('TITLE', 'Follow'); // TRANS: Notification given when one person starts following another. // TRANS: %1$s is the subscriber, %2$s is the subscribed. - $act->content = sprintf(_('%1$s is now following %2$s.'), - $subscriber->getBestName(), - $subscribed->getBestName()); + $act->content = sprintf( + _('%1$s is now following %2$s.'), + $subscriber->getBestName(), + $subscribed->getBestName() + ); $act->actor = $subscriber->asActivityObject(); $act->objects[] = $subscribed->asActivityObject(); - $url = common_local_url('AtomPubShowSubscription', - array('subscriber' => $subscriber->id, - 'subscribed' => $subscribed->id)); + $url = common_local_url( + 'AtomPubShowSubscription', + [ + 'subscriber' => $subscriber->id, + 'subscribed' => $subscribed->id, + ] + ); $act->selfLink = $url; $act->editLink = $url; @@ -356,11 +363,13 @@ class Subscription extends Managed_DataObject // The following are helper functions to the subscription lists, // notably the public ones get used in places such as Profile - public static function getSubscribedIDs($profile_id, $offset, $limit) { + public static function getSubscribedIDs($profile_id, $offset, $limit) + { return self::getSubscriptionIDs('subscribed', $profile_id, $offset, $limit); } - public static function getSubscriberIDs($profile_id, $offset, $limit) { + public static function getSubscriberIDs($profile_id, $offset, $limit) + { return self::getSubscriptionIDs('subscriber', $profile_id, $offset, $limit); } @@ -426,7 +435,7 @@ class Subscription extends Managed_DataObject * * @return boolean success flag. */ - function update($dataObject=false) + public function update($dataObject = false) { self::blow('subscription:by-subscriber:'.$this->subscriber); self::blow('subscription:by-subscribed:'.$this->subscribed); diff --git a/classes/User.php b/classes/User.php index 49415d4d59..46d28443a1 100644 --- a/classes/User.php +++ b/classes/User.php @@ -34,24 +34,24 @@ class User extends Managed_DataObject public $password; // varchar(191) not 255 because utf8mb4 takes more space public $email; // varchar(191) unique_key not 255 because utf8mb4 takes more space public $incomingemail; // varchar(191) unique_key not 255 because utf8mb4 takes more space - public $emailnotifysub; // tinyint(1) default_1 - public $emailnotifyfav; // tinyint(1) default_1 - public $emailnotifynudge; // tinyint(1) default_1 - public $emailnotifymsg; // tinyint(1) default_1 - public $emailnotifyattn; // tinyint(1) default_1 + public $emailnotifysub; // bool default_true + public $emailnotifyfav; // tinyint(1) default_null + public $emailnotifynudge; // bool default_true + public $emailnotifymsg; // bool default_true + public $emailnotifyattn; // bool default_true public $language; // varchar(50) public $timezone; // varchar(50) - public $emailpost; // tinyint(1) default_1 + public $emailpost; // bool default_true public $sms; // varchar(64) unique_key public $carrier; // int(4) - public $smsnotify; // tinyint(1) - public $smsreplies; // tinyint(1) + public $smsnotify; // bool default_false + public $smsreplies; // bool default_false public $smsemail; // varchar(191) not 255 because utf8mb4 takes more space public $uri; // varchar(191) unique_key not 255 because utf8mb4 takes more space - public $autosubscribe; // tinyint(1) + public $autosubscribe; // bool default_false public $subscribe_policy; // tinyint(1) public $urlshorteningservice; // varchar(50) default_ur1.ca - public $private_stream; // tinyint(1) default_0 + public $private_stream; // bool default_false public $created; // datetime() not_null default_0000-00-00%2000%3A00%3A00 public $modified; // datetime() not_null default_CURRENT_TIMESTAMP @@ -68,24 +68,24 @@ class User extends Managed_DataObject 'password' => array('type' => 'varchar', 'length' => 191, 'description' => 'salted password, can be null for OpenID users'), 'email' => array('type' => 'varchar', 'length' => 191, 'description' => 'email address for password recovery etc.'), 'incomingemail' => array('type' => 'varchar', 'length' => 191, 'description' => 'email address for post-by-email'), - 'emailnotifysub' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of subscriptions'), + 'emailnotifysub' => array('type' => 'bool', 'default' => true, 'description' => 'Notify by email of subscriptions'), 'emailnotifyfav' => array('type' => 'int', 'size' => 'tiny', 'default' => null, 'description' => 'Notify by email of favorites'), - 'emailnotifynudge' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of nudges'), - 'emailnotifymsg' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of direct messages'), - 'emailnotifyattn' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Notify by email of @-replies'), + 'emailnotifynudge' => array('type' => 'bool', 'default' => true, 'description' => 'Notify by email of nudges'), + 'emailnotifymsg' => array('type' => 'bool', 'default' => true, 'description' => 'Notify by email of direct messages'), + 'emailnotifyattn' => array('type' => 'bool', 'default' => true, 'description' => 'Notify by email of @-replies'), 'language' => array('type' => 'varchar', 'length' => 50, 'description' => 'preferred language'), 'timezone' => array('type' => 'varchar', 'length' => 50, 'description' => 'timezone'), - 'emailpost' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Post by email'), + 'emailpost' => array('type' => 'bool', 'default' => true, 'description' => 'Post by email'), 'sms' => array('type' => 'varchar', 'length' => 64, 'description' => 'sms phone number'), 'carrier' => array('type' => 'int', 'description' => 'foreign key to sms_carrier'), - 'smsnotify' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to send notices to SMS'), - 'smsreplies' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to send notices to SMS on replies'), + 'smsnotify' => array('type' => 'bool', 'default' => false, 'description' => 'whether to send notices to SMS'), + 'smsreplies' => array('type' => 'bool', 'default' => false, 'description' => 'whether to send notices to SMS on replies'), 'smsemail' => array('type' => 'varchar', 'length' => 191, 'description' => 'built from sms and carrier'), 'uri' => array('type' => 'varchar', 'length' => 191, 'description' => 'universally unique identifier, usually a tag URI'), - 'autosubscribe' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'automatically subscribe to users who subscribe to us'), + 'autosubscribe' => array('type' => 'bool', 'default' => false, 'description' => 'automatically subscribe to users who subscribe to us'), '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'), - 'private_stream' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'whether to limit all notices to followers only'), + 'private_stream' => array('type' => 'bool', 'default' => false, 'description' => 'whether to limit all notices to followers only'), 'created' => array('type' => 'datetime', 'not null' => true, 'default' => '0000-00-00 00:00:00', 'description' => 'date this record was created'), 'modified' => array('type' => 'datetime', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'), ), @@ -265,11 +265,11 @@ class User extends Managed_DataObject // Set default-on options here, otherwise they'll be disabled // initially for sites using caching, since the initial encache // doesn't know about the defaults in the database. - $user->emailnotifysub = 1; - $user->emailnotifynudge = 1; - $user->emailnotifymsg = 1; - $user->emailnotifyattn = 1; - $user->emailpost = 1; + $user->emailnotifysub = true; + $user->emailnotifynudge = true; + $user->emailnotifymsg = true; + $user->emailnotifyattn = true; + $user->emailpost = true; $user->created = common_sql_now(); diff --git a/classes/User_group.php b/classes/User_group.php index 80a1160a27..92ea7ce151 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -248,7 +248,7 @@ class User_group extends Managed_DataObject { $block = new Group_member(); $block->group_id = $this->id; - $block->is_admin = 1; + $block->is_admin = true; return $block->count(); } @@ -300,7 +300,7 @@ class User_group extends Managed_DataObject { $admins = new Profile(); $admins->joinAdd(array('id', 'group_member:profile_id')); - $admins->whereAdd(sprintf('group_member.group_id = %u AND group_member.is_admin = 1', $this->id)); + $admins->whereAdd('group_member.group_id = ' . $this->id . ' AND group_member.is_admin = true'); $admins->orderBy('group_member.modified ASC'); $admins->limit($offset, $limit); $admins->find(); @@ -692,7 +692,7 @@ class User_group extends Managed_DataObject $member->group_id = $group->id; $member->profile_id = $userid; - $member->is_admin = 1; + $member->is_admin = true; $member->created = $group->created; $result = $member->insert(); diff --git a/classes/User_im_prefs.php b/classes/User_im_prefs.php index af11f7b2f4..11a8bedc4b 100644 --- a/classes/User_im_prefs.php +++ b/classes/User_im_prefs.php @@ -1,32 +1,31 @@ . + /** - * StatusNet, the distributed open-source microblogging tool - * * Data class for user IM preferences * - * PHP version 5 - * - * LICENCE: This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * * @category Data - * @package StatusNet + * @package GNUsocial * @author Craig Andrews * @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/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ +defined('GNUSOCIAL') || die(); + require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; class User_im_prefs extends Managed_DataObject @@ -38,9 +37,9 @@ class User_im_prefs extends Managed_DataObject public $user_id; // int(4) primary_key not_null public $screenname; // varchar(191) not_null not 255 because utf8mb4 takes more space public $transport; // varchar(191) not_null not 255 because utf8mb4 takes more space - public $notify; // tinyint(1) - public $replies; // tinyint(1) - public $updatefrompresence; // tinyint(1) + public $notify; // bool not_null default_false + public $replies; // bool not_null default_false + public $updatefrompresence; // bool not_null default_false public $created; // datetime() not_null default_0000-00-00%2000%3A00%3A00 public $modified; // datetime() not_null default_CURRENT_TIMESTAMP @@ -54,9 +53,9 @@ class User_im_prefs extends Managed_DataObject 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user'), 'screenname' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'screenname on this service'), 'transport' => array('type' => 'varchar', 'length' => 191, 'not null' => true, 'description' => 'transport (ex xmpp, aim)'), - 'notify' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 0, 'description' => 'Notify when a new notice is sent'), - 'replies' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 0, 'description' => 'Send replies from people not subscribed to'), - 'updatefrompresence' => array('type' => 'int', 'size' => 'tiny', 'not null' => true, 'default' => 0, 'description' => 'Send replies from people not subscribed to.'), + 'notify' => array('type' => 'bool', 'not null' => true, 'default' => false, 'description' => 'Notify when a new notice is sent'), + 'replies' => array('type' => 'bool', 'not null' => true, 'default' => false, 'description' => 'Send replies from people not subscribed to'), + 'updatefrompresence' => array('type' => 'bool', 'not null' => true, 'default' => false, 'description' => 'Update from presence.'), 'created' => array('type' => 'datetime', 'not null' => true, 'default' => '0000-00-00 00:00:00', 'description' => 'date this record was created'), 'modified' => array('type' => 'datetime', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'), ), @@ -69,5 +68,4 @@ class User_im_prefs extends Managed_DataObject ), ); } - } diff --git a/classes/User_location_prefs.php b/classes/User_location_prefs.php index a55804f776..b825999e21 100644 --- a/classes/User_location_prefs.php +++ b/classes/User_location_prefs.php @@ -1,30 +1,27 @@ . + /** - * StatusNet, the distributed open-source microblogging tool - * * Data class for user location preferences * - * PHP version 5 - * - * LICENCE: This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * * @category Data - * @package StatusNet + * @package GNUsocial * @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/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; @@ -36,7 +33,7 @@ class User_location_prefs extends Managed_DataObject public $__table = 'user_location_prefs'; // table name public $user_id; // int(4) primary_key not_null - public $share_location; // tinyint(1) default_1 + public $share_location; // bool default_true public $created; // datetime() not_null default_0000-00-00%2000%3A00%3A00 public $modified; // datetime() not_null default_CURRENT_TIMESTAMP @@ -48,7 +45,7 @@ class User_location_prefs extends Managed_DataObject return array( 'fields' => array( 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user who has the preference'), - 'share_location' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'description' => 'Whether to share location data'), + 'share_location' => array('type' => 'bool', 'default' => true, 'description' => 'Whether to share location data'), 'created' => array('type' => 'datetime', 'not null' => true, 'default' => '0000-00-00 00:00:00', 'description' => 'date this record was created'), 'modified' => array('type' => 'datetime', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was modified'), ), diff --git a/db/core.php b/db/core.php index 56213eb338..171a21cd0b 100644 --- a/db/core.php +++ b/db/core.php @@ -4,10 +4,6 @@ * * Some notes... * - * Drupal docs don't list a bool type, but it might be nice to use rather than 'tinyint' - * Note however that we use bitfields and things as well in tinyints, and PG's - * "bool" type isn't 100% compatible with 0/1 checks. Just keeping tinyints. :) - * * decimal <-> numeric * * MySQL 'timestamp' columns were formerly used for 'modified' files for their diff --git a/extlib/DB/DataObject.php b/extlib/DB/DataObject.php index bf16d87eba..e58c3e544d 100644 --- a/extlib/DB/DataObject.php +++ b/extlib/DB/DataObject.php @@ -1787,12 +1787,27 @@ class DB_DataObject extends DB_DataObject_Overload // note: we dont declare this to keep the print_r size down. $_DB_DATAOBJECT['RESULTFIELDS'][$this->_DB_resultid] = array_flip(array_keys($array)); } + + $dbtype = $_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]->dsn['phptype']; + if ($dbtype === 'pgsql') { + if (($_DB_DATAOBJECT['CONFIG']['db_driver'] ?? 'DB') === 'DB') { + $tableInfo = $result->tableInfo(); + } elseif ($result->db->supports('result_introspection')) { // MDB2 + $result->db->loadModule('Reverse', null, true); + $tableInfo = $result->db->reverse->tableInfo($result); + } + } + $replace = array('.', ' '); - foreach ($array as $k => $v) { + foreach (array_keys($array) as $i => $k) { // use strpos as str_replace is slow. $kk = (strpos($k, '.') === false && strpos($k, ' ') === false) ? $k : str_replace($replace, '_', $k); + if ($dbtype === 'pgsql' && $tableInfo[$i]['type'] == 'bool') { + $array[$k] = str_replace(['t', 'f'], ['1', '0'], $array[$k]); + } + if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) { $this->debug("$kk = " . $array[$k], "fetchrow LINE", 3); } @@ -2949,12 +2964,27 @@ class DB_DataObject extends DB_DataObject_Overload $this->raiseError("fetchrow: No results available", DB_DATAOBJECT_ERROR_NODATA); return false; } + + $dbtype = $_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]->dsn['phptype']; + if ($dbtype === 'pgsql') { + if (($_DB_DATAOBJECT['CONFIG']['db_driver'] ?? 'DB') === 'DB') { + $tableInfo = $result->tableInfo(); + } elseif ($result->db->supports('result_introspection')) { // MDB2 + $result->db->loadModule('Reverse', null, true); + $tableInfo = $result->db->reverse->tableInfo($result); + } + } + $replace = array('.', ' '); - foreach ($array as $k => $v) { + foreach (array_keys($array) as $i => $k) { // use strpos as str_replace is slow. $kk = (strpos($k, '.') === false && strpos($k, ' ') === false) ? $k : str_replace($replace, '_', $k); + if ($dbtype === 'pgsql' && $tableInfo[$i]['type'] == 'bool') { + $array[$k] = str_replace(['t', 'f'], ['1', '0'], $array[$k]); + } + if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) { $this->debug("$kk = " . $array[$k], "fetchrow LINE", 3); } diff --git a/lib/action/action.php b/lib/action/action.php index 1f50351d3a..a768264357 100644 --- a/lib/action/action.php +++ b/lib/action/action.php @@ -1,36 +1,31 @@ . + /** - * StatusNet, the distributed open-source microblogging tool - * * Base class for all actions (~views) * - * PHP version 5 - * - * LICENCE: This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * * @category Action - * @package StatusNet + * @package GNUsocial * @author Evan Prodromou * @author Sarven Capadisli * @copyright 2008 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/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('GNUSOCIAL')) { - exit(1); -} +defined('GNUSOCIAL') || die(); /** * Base class for all actions @@ -41,14 +36,11 @@ if (!defined('GNUSOCIAL')) { * Actions are responsible for extracting and validating parameters; using * model classes to read and write to the database; and doing ouput. * - * @category Output - * @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/ + * @category Output + * @copyright 2008 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later * - * @see HTMLOutputter + * @see HTMLOutputter */ class Action extends HTMLOutputter // lawsuit { @@ -1566,19 +1558,6 @@ class Action extends HTMLOutputter // lawsuit // needs to be defined by the class } - /** - * This is a cheap hack to avoid a bug in DB_DataObject - * where '' is non-type-aware compared to 0, which means it - * will always be true for values like false and 0 too... - * - * Upstream bug is:: - * https://pear.php.net/bugs/bug.php?id=20291 - */ - public function booleanintstring($key, $def = false) - { - return $this->boolean($key, $def) ? '1' : '0'; - } - /** * Integer value of an argument * diff --git a/lib/database/mysqlschema.php b/lib/database/mysqlschema.php index bd4ac34a3d..ea096406f3 100644 --- a/lib/database/mysqlschema.php +++ b/lib/database/mysqlschema.php @@ -396,9 +396,9 @@ class MysqlSchema extends Schema function mapType($column) { $map = [ - 'serial' => 'int', 'integer' => 'int', - 'numeric' => 'decimal' + 'bool' => 'tinyint', + 'numeric' => 'decimal', ]; $type = $column['type']; diff --git a/lib/database/pgsqlschema.php b/lib/database/pgsqlschema.php index 95d63dce0e..d02d7ecc98 100644 --- a/lib/database/pgsqlschema.php +++ b/lib/database/pgsqlschema.php @@ -348,10 +348,11 @@ class PgsqlSchema extends Schema public function mapType($column) { $map = [ - 'serial' => 'bigserial', // FIXME: creates the wrong name for the sequence for some internal sequence-lookup function, so better fix this to do the real 'create sequence' dance. - 'numeric' => 'decimal', + 'serial' => 'bigserial', // FIXME: creates the wrong name for the sequence for some internal sequence-lookup function, so better fix this to do the real 'create sequence' dance. + 'bool' => 'boolean', + 'numeric' => 'decimal', 'datetime' => 'timestamp', - 'blob' => 'bytea' + 'blob' => 'bytea', ]; $type = $column['type']; diff --git a/lib/util/mail.php b/lib/util/mail.php index 922e28ed89..18c00f1d2e 100644 --- a/lib/util/mail.php +++ b/lib/util/mail.php @@ -434,11 +434,11 @@ function mail_broadcast_notice_sms($notice) // Users (other than the sender) who `want SMS notices': 'WHERE %1$s.id <> %2$d ' . 'AND %1$s.smsemail IS NOT NULL ' . - 'AND %1$s.smsnotify = 1 ' . + 'AND %1$s.smsnotify = TRUE ' . // ... where either the user _is_ subscribed to the sender // (any of the "subscription" fields IS NOT NULL) // and wants to get SMS for all of this scribe's notices... - 'AND (subscription.sms = 1 ' . + 'AND (subscription.sms = TRUE ' . // ... or where the user was mentioned in // or replied-to with the notice: $repliesQry . diff --git a/modules/Favorite/FavoriteModule.php b/modules/Favorite/FavoriteModule.php index e7fa907dab..3bd7e7a6cd 100644 --- a/modules/Favorite/FavoriteModule.php +++ b/modules/Favorite/FavoriteModule.php @@ -507,9 +507,9 @@ class FavoriteModule extends ActivityVerbHandlerModule public function onStartEmailSaveForm(Action $action, Profile $scoped) { - $emailfave = $action->booleanintstring('email-notify_fave'); + $emailfave = $action->boolean('email-notify_fave'); try { - if ($emailfave == $scoped->getPref('email', 'notify_fave')) { + if ($emailfave == (bool) $scoped->getPref('email', 'notify_fave')) { // No need to update setting return true; } diff --git a/plugins/ActivitySpam/classes/spam_score.php b/plugins/ActivitySpam/classes/Spam_score.php similarity index 78% rename from plugins/ActivitySpam/classes/spam_score.php rename to plugins/ActivitySpam/classes/Spam_score.php index 36e03aa9a8..e8b3311fe9 100644 --- a/plugins/ActivitySpam/classes/spam_score.php +++ b/plugins/ActivitySpam/classes/Spam_score.php @@ -1,47 +1,38 @@ . + /** - * StatusNet - the distributed open-source microblogging tool - * Copyright (C) 2011, StatusNet, Inc. - * * Score of a notice by activity spam service * - * PHP version 5 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * * @category Spam - * @package StatusNet + * @package GNUsocial * @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/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('STATUSNET')) { - exit(1); -} +defined('GNUSOCIAL') || die(); /** * Score of a notice per the activity spam service * - * @category Spam - * @package StatusNet - * @author Evan Prodromou - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ + * @copyright 2011 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later * - * @see DB_DataObject + * @see DB_DataObject */ class Spam_score extends Managed_DataObject { @@ -54,7 +45,6 @@ class Spam_score extends Managed_DataObject public static function save($notice, $result) { - $orig = null; $score = Spam_score::getKV('notice_id', $notice->id); @@ -98,7 +88,7 @@ class Spam_score extends Managed_DataObject 'description' => 'score for the notice (0.0, 1.0)'), 'scaled' => array('type' => 'int', 'description' => 'scaled score for the notice (0, 10000)'), - 'is_spam' => array('type' => 'tinyint', + 'is_spam' => array('type' => 'bool', 'description' => 'flag for spamosity'), 'created' => array('type' => 'datetime', 'not null' => true, @@ -146,7 +136,7 @@ class Spam_score extends Managed_DataObject if ($score->find()) { while ($score->fetch()) { $orig = clone($score); - $score->is_spam = ($score->score >= 0.90) ? 1 : 0; + $score->is_spam = ($score->score >= 0.90) ? true : false; $score->update($orig); } } @@ -169,9 +159,8 @@ class Spam_score extends Managed_DataObject } } - function saveNew($notice, $result) + public function saveNew($notice, $result) { - $score = new Spam_score(); $score->notice_id = $notice->id; diff --git a/plugins/ActivitySpam/lib/spamnoticestream.php b/plugins/ActivitySpam/lib/spamnoticestream.php index d19814509c..19bc73a2d7 100644 --- a/plugins/ActivitySpam/lib/spamnoticestream.php +++ b/plugins/ActivitySpam/lib/spamnoticestream.php @@ -1,52 +1,45 @@ . - * - * @category Spam - * @package StatusNet - * @author Evan Prodromou - * @copyright 2012 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ - */ - -if (!defined('GNUSOCIAL')) { exit(1); } +// This file is part of GNU social - https://www.gnu.org/software/social +// +// GNU social is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// GNU social is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with GNU social. If not, see . /** * Spam notice stream * * @category Spam - * @package StatusNet + * @package GNUsocial * @author Evan Prodromou * @copyright 2012 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ +defined('GNUSOCIAL') || die(); + +/** + * Spam notice stream + * + * @copyright 2012 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + */ class SpamNoticeStream extends ScopingNoticeStream { - function __construct(Profile $scoped=null) + public function __construct(Profile $scoped = null) { - parent::__construct(new CachingNoticeStream(new RawSpamNoticeStream(), 'spam_score:notice_ids'), - $scoped); + parent::__construct( + new CachingNoticeStream(new RawSpamNoticeStream(), 'spam_score:notice_ids'), + $scoped + ); } } @@ -54,20 +47,16 @@ class SpamNoticeStream extends ScopingNoticeStream * Raw stream of spammy notices * * @category Stream - * @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 RawSpamNoticeStream extends NoticeStream { - function getNoticeIds($offset, $limit, $since_id, $max_id) + public function getNoticeIds($offset, $limit, $since_id, $max_id) { $ss = new Spam_score(); - $ss->is_spam = 1; + $ss->is_spam = true; $ss->selectAdd(); $ss->selectAdd('notice_id'); diff --git a/plugins/ActivitySpam/scripts/silencespammer.php b/plugins/ActivitySpam/scripts/silencespammer.php index 3a5e585fd5..d63995d9bb 100644 --- a/plugins/ActivitySpam/scripts/silencespammer.php +++ b/plugins/ActivitySpam/scripts/silencespammer.php @@ -1,20 +1,22 @@ . +// This file is part of GNU social - https://www.gnu.org/software/social +// +// GNU social is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// GNU social is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with GNU social. If not, see . + +/** + * @copyright 2013 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..')); @@ -33,13 +35,13 @@ END_OF_SILENCESPAMMER_HELP; require_once INSTALLDIR.'/scripts/commandline.inc'; -function testAllUsers($filter, $minimum, $percent) { +function testAllUsers($filter, $minimum, $percent) +{ $found = false; $offset = 0; $limit = 1000; do { - $user = new User(); $user->orderBy('created'); $user->limit($offset, $limit); @@ -56,37 +58,36 @@ function testAllUsers($filter, $minimum, $percent) { } $offset += $found; } - } while ($found > 0); } -function silencespammer($filter, $user, $minimum, $percent) { - +function silencespammer($filter, $user, $minimum, $percent) +{ printfnq("Testing user %s\n", $user->nickname); $profile = Profile::getKV('id', $user->id); if ($profile->isSilenced()) { - printfnq("Already silenced %s\n", $user->nickname); - return; + printfnq("Already silenced %s\n", $user->nickname); + return; } $cnt = $profile->noticeCount(); if ($cnt < $minimum) { printfnq("Only %d notices posted (minimum %d); skipping\n", $cnt, $minimum); - return; + return; } $ss = new Spam_score(); $ss->query(sprintf("SELECT count(*) as spam_count ". "FROM notice join spam_score on notice.id = spam_score.notice_id ". - "WHERE notice.profile_id = %d AND spam_score.is_spam = 1", $profile->id)); + 'WHERE notice.profile_id = %d AND spam_score.is_spam = TRUE', $profile->id)); while ($ss->fetch()) { $spam_count = $ss->spam_count; - } + } $spam_percent = ($spam_count * 100.0 / $cnt); @@ -94,10 +95,10 @@ function silencespammer($filter, $user, $minimum, $percent) { printfnq("Silencing user %s (%d/%d = %0.2f%% spam)\n", $user->nickname, $spam_count, $cnt, $spam_percent); try { $profile->silence(); - } catch(Exception $e) { + } catch (Exception $e) { printfnq("Error: %s", $e->getMessage()); - } - } + } + } } try { diff --git a/plugins/EmailSummary/classes/Email_summary_status.php b/plugins/EmailSummary/classes/Email_summary_status.php index 460053f9f8..a2e65d2ca2 100644 --- a/plugins/EmailSummary/classes/Email_summary_status.php +++ b/plugins/EmailSummary/classes/Email_summary_status.php @@ -1,35 +1,30 @@ . + /** * Data class for email summary status * - * PHP version 5 - * - * @category Data - * @package StatusNet - * @author Evan Prodromou - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ - * - * StatusNet - the distributed open-source microblogging tool - * Copyright (C) 2010, StatusNet, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * @category Data + * @package GNUsocial + * @author Evan Prodromou + * @copyright 2010, StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('STATUSNET')) { - exit(1); -} +defined('GNUSOCIAL') || die(); require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; @@ -38,19 +33,17 @@ require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; * * Email summary information for users * - * @category Action - * @package StatusNet - * @author Evan Prodromou - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ + * @category Action + * @copyright 2010, StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later * - * @see DB_DataObject + * @see DB_DataObject */ class Email_summary_status extends Managed_DataObject { public $__table = 'email_summary_status'; // table name public $user_id; // int(4) primary_key not_null - public $send_summary; // tinyint not_null + public $send_summary; // bool not_null default_true public $last_summary_id; // int(4) null public $created; // datetime not_null public $modified; // datetime not_null @@ -60,9 +53,9 @@ class Email_summary_status extends Managed_DataObject return array( 'fields' => array( 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user id'), - 'send_summary' => array('type' => 'int', 'size' => 'tiny', 'default' => 1, 'not null' => true, 'description' => 'whether to send a summary or not'), + 'send_summary' => array('type' => 'bool', 'default' => true, 'not null' => true, 'description' => 'whether to send a summary or not'), 'last_summary_id' => array('type' => 'int', 'description' => 'last summary id'), - 'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'), + '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'), ), 'primary key' => array('user_id'), @@ -79,7 +72,7 @@ class Email_summary_status extends Managed_DataObject * * @return int flag for whether to send this user a summary email */ - static function getSendSummary($user_id) + public static function getSendSummary($user_id) { $ess = Email_summary_status::getKV('user_id', $user_id); @@ -97,7 +90,7 @@ class Email_summary_status extends Managed_DataObject * * @return Email_summary_status instance for this user, with count already incremented. */ - static function getLastSummaryID($user_id) + public static function getLastSummaryID($user_id) { $ess = Email_summary_status::getKV('user_id', $user_id); diff --git a/plugins/FollowEveryone/classes/User_followeveryone_prefs.php b/plugins/FollowEveryone/classes/User_followeveryone_prefs.php index c1a654df92..3c9b0917c2 100644 --- a/plugins/FollowEveryone/classes/User_followeveryone_prefs.php +++ b/plugins/FollowEveryone/classes/User_followeveryone_prefs.php @@ -1,35 +1,30 @@ . + /** * Data class for counting greetings * - * PHP version 5 - * - * @category Data - * @package StatusNet - * @author Evan Prodromou - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ - * - * StatusNet - the distributed open-source microblogging tool - * Copyright (C) 2009, StatusNet, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * @category Data + * @package GNUsocial + * @author Evan Prodromou + * @copyright 2009, StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('STATUSNET')) { - exit(1); -} +defined('GNUSOCIAL') || die(); require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; @@ -44,19 +39,17 @@ require_once INSTALLDIR . '/classes/Memcached_DataObject.php'; * extension of DB_DataObject that provides caching, internationalization, * and other bits of good functionality to StatusNet-specific data classes. * - * @category Action - * @package StatusNet - * @author Evan Prodromou - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ + * @category Action + * @copyright 2009, StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later * - * @see DB_DataObject + * @see DB_DataObject */ class User_followeveryone_prefs extends Managed_DataObject { public $__table = 'user_followeveryone_prefs'; // table name public $user_id; // int(4) primary_key not_null - public $followeveryone; // tinyint(1) + public $followeveryone; // bool default_true public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -65,7 +58,7 @@ class User_followeveryone_prefs extends Managed_DataObject return array( 'fields' => array( 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user id'), - 'followeveryone' => array('type' => 'int', 'default' => 1, 'size' => 'tiny', 'description' => 'whether to follow everyone'), + 'followeveryone' => array('type' => 'bool', 'default' => true, 'description' => 'whether to follow everyone'), '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'), ), @@ -76,7 +69,7 @@ class User_followeveryone_prefs extends Managed_DataObject ); } - static function followEveryone($user_id) + public static function followEveryone($user_id) { $ufep = self::getKV('user_id', $user_id); @@ -87,7 +80,7 @@ class User_followeveryone_prefs extends Managed_DataObject } } - static function savePref($user_id, $followEveryone) + public static function savePref($user_id, $followEveryone) { $ufep = self::getKV('user_id', $user_id); diff --git a/plugins/ModLog/ModLogPlugin.php b/plugins/ModLog/ModLogPlugin.php index d805dba408..44a5529e90 100644 --- a/plugins/ModLog/ModLogPlugin.php +++ b/plugins/ModLog/ModLogPlugin.php @@ -1,52 +1,37 @@ . + /** - * StatusNet - the distributed open-source microblogging tool - * Copyright (C) 2012, StatusNet, Inc. - * - * ModLogPlugin.php - * - * PHP version 5 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * * @category Moderation - * @package StatusNet + * @package GNUsocial * @author Evan Prodromou * @copyright 2012 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('STATUSNET')) { - // This check helps protect against security problems; - // your code file can't be executed directly from the web. - exit(1); -} +defined('GNUSOCIAL') || die(); /** * Moderation logging * * Shows a history of moderation for this user in the sidebar * - * @category Moderation - * @package StatusNet - * @author Evan Prodromou * @copyright 2012 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ - class ModLogPlugin extends Plugin { const PLUGIN_VERSION = '2.0.0'; @@ -63,7 +48,7 @@ class ModLogPlugin extends Plugin * @return boolean hook value; true means continue processing, false means stop. */ - function onCheckSchema() + public function onCheckSchema() { $schema = Schema::get(); @@ -72,7 +57,7 @@ class ModLogPlugin extends Plugin return true; } - function onEndGrantRole($profile, $role) + public function onEndGrantRole($profile, $role) { $modlog = new ModLog(); @@ -86,7 +71,7 @@ class ModLogPlugin extends Plugin } $modlog->role = $role; - $modlog->is_grant = 1; + $modlog->is_grant = true; $modlog->created = common_sql_now(); $modlog->insert(); @@ -94,7 +79,7 @@ class ModLogPlugin extends Plugin return true; } - function onEndRevokeRole($profile, $role) + public function onEndRevokeRole($profile, $role) { $modlog = new ModLog(); @@ -109,7 +94,7 @@ class ModLogPlugin extends Plugin } $modlog->role = $role; - $modlog->is_grant = 0; + $modlog->is_grant = false; $modlog->created = common_sql_now(); $modlog->insert(); @@ -117,7 +102,7 @@ class ModLogPlugin extends Plugin return true; } - function onEndShowSections(Action $action) + public function onEndShowSections(Action $action) { if (!$action instanceof ShowstreamAction) { // early return for actions we're not interested in @@ -140,7 +125,6 @@ class ModLogPlugin extends Plugin $cnt = $ml->find(); if ($cnt > 0) { - $action->elementStart('div', array('id' => 'entity_mod_log', 'class' => 'section')); @@ -158,9 +142,14 @@ class ModLogPlugin extends Plugin if (empty($mod)) { $action->text(_('[unknown]')); } else { - $action->element('a', array('href' => $mod->getUrl(), - 'title' => $mod->getFullname()), - $mod->getNickname()); + $action->element( + 'a', + [ + 'href' => $mod->getUrl(), + 'title' => $mod->getFullname(), + ], + $mod->getNickname() + ); } } else { $action->text(_('[unknown]')); @@ -175,7 +164,8 @@ class ModLogPlugin extends Plugin } } - function onUserRightsCheck($profile, $right, &$result) { + public function onUserRightsCheck($profile, $right, &$result) + { switch ($right) { case self::VIEWMODLOG: $result = ($profile->hasRole(Profile_role::MODERATOR) || $profile->hasRole('modhelper')); diff --git a/plugins/ModLog/classes/ModLog.php b/plugins/ModLog/classes/ModLog.php index 606b786b29..12af1fa2f2 100644 --- a/plugins/ModLog/classes/ModLog.php +++ b/plugins/ModLog/classes/ModLog.php @@ -1,49 +1,37 @@ . + /** - * StatusNet - the distributed open-source microblogging tool - * Copyright (C) 2012, StatusNet, Inc. - * - * ModLog.php -- data object to store moderation logs - * - * PHP version 5 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * Data object to store moderation logs * * @category Moderation - * @package StatusNet + * @package GNUsocial * @author Evan Prodromou * @copyright 2012 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('STATUSNET')) { - exit(1); -} +defined('GNUSOCIAL') || die(); /** - * Class comment here + * @copyright 2012 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later * - * @category Category here - * @package StatusNet - * @author Evan Prodromou - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ - * - * @see DB_DataObject + * @see DB_DataObject */ - class ModLog extends Managed_DataObject { public $__table = 'mod_log'; // table name @@ -52,7 +40,7 @@ class ModLog extends Managed_DataObject public $profile_id; // profile id public $moderator_id; // profile id public $role; // the role - public $grant; // 1 = grant, 0 = revoke + public $is_grant; // true = grant, false = revoke public $created; // datetime /** @@ -75,9 +63,8 @@ class ModLog extends Managed_DataObject 'length' => 32, 'not null' => true, 'description' => 'role granted or revoked'), - 'is_grant' => array('type' => 'int', - 'size' => 'tiny', - 'default' => 1, + 'is_grant' => array('type' => 'bool', + 'default' => true, 'description' => 'Was this a grant or revocation of a role'), 'created' => array('type' => 'datetime', 'not null' => true, diff --git a/plugins/OpenID/actions/openidsettings.php b/plugins/OpenID/actions/openidsettings.php index c3573f9b25..4bc212b028 100644 --- a/plugins/OpenID/actions/openidsettings.php +++ b/plugins/OpenID/actions/openidsettings.php @@ -1,35 +1,30 @@ . + /** - * StatusNet, the distributed open-source microblogging tool - * * Settings for OpenID * - * PHP version 5 - * - * LICENCE: This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * * @category Settings - * @package StatusNet + * @package GNUsocial * @author Evan Prodromou * @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/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('GNUSOCIAL')) { - exit(1); -} +defined('GNUSOCIAL') || die(); require_once INSTALLDIR.'/plugins/OpenID/openid.php'; @@ -38,11 +33,8 @@ require_once INSTALLDIR.'/plugins/OpenID/openid.php'; * * Lets users add, edit and delete OpenIDs from their account * - * @category Settings - * @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/ + * @copyright 2008-2009 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ class OpenidsettingsAction extends SettingsAction { @@ -100,17 +92,26 @@ class OpenidsettingsAction extends SettingsAction $this->elementStart('ul', 'form_data'); $this->elementStart('li'); // TRANS: Field label. - $this->input('openid_url', _m('OpenID URL'), null, - // TRANS: Form guide. - _m('An OpenID URL which identifies you.'), - null, true, - ['placeholder'=>'https://example.com/you']); + $this->input( + 'openid_url', + _m('OpenID URL'), + null, + // TRANS: Form guide. + _m('An OpenID URL which identifies you.'), + null, + true, + ['placeholder' => 'https://example.com/you'] + ); $this->elementEnd('li'); $this->elementStart('li'); // TRANS: Field label. - $this->checkbox('openid-synch', _m('Synchronize Account'), false, - // TRANS: Form guide. - _m('Synchronize GNU social profile with this OpenID identity.')); + $this->checkbox( + 'openid-synch', + _m('Synchronize Account'), + false, + // TRANS: Form guide. + _m('Synchronize GNU social profile with this OpenID identity.') + ); $this->elementEnd('li'); $this->elementEnd('ul'); // TRANS: Button text for adding an OpenID URL. @@ -129,13 +130,16 @@ class OpenidsettingsAction extends SettingsAction $this->element('h2', null, _m('HEADER', 'OpenID Actions')); if ($cnt == 1 && !$this->scoped->hasPassword()) { - $this->element('p', 'form_guide', - // TRANS: Form guide. - _m('You can\'t remove your main OpenID account ' . - 'without either adding a password to your ' . - 'GNU social account or another OpenID account. ' . - 'You can synchronize your profile with your ' . - 'OpenID by clicking the button labeled "Synchronize".')); + $this->element( + 'p', + 'form_guide', + // TRANS: Form guide. + _m('You can\'t remove your main OpenID account ' . + 'without either adding a password to your ' . + 'GNU social account or another OpenID account. ' . + 'You can synchronize your profile with your ' . + 'OpenID by clicking the button labeled "Synchronize".') + ); if ($oid->fetch()) { $this->elementStart('form', ['method' => 'POST', @@ -152,12 +156,15 @@ class OpenidsettingsAction extends SettingsAction $this->elementEnd('form'); } } else { - $this->element('p', 'form_guide', - // TRANS: Form guide. - _m('You can remove an OpenID from your account ' . - 'by clicking the button labeled "Remove". ' . - 'You can synchronize your profile with an OpenID ' . - 'by clicking the button labeled "Synchronize".')); + $this->element( + 'p', + 'form_guide', + // TRANS: Form guide. + _m('You can remove an OpenID from your account ' . + 'by clicking the button labeled "Remove". ' . + 'You can synchronize your profile with an OpenID ' . + 'by clicking the button labeled "Synchronize".') + ); $idx = 0; while ($oid->fetch()) { @@ -191,26 +198,38 @@ class OpenidsettingsAction extends SettingsAction // TRANS: Fieldset legend. $this->element('legend', null, _m('OpenID Trusted Sites')); $this->hidden('token', common_session_token()); - $this->element('p', 'form_guide', - // TRANS: Form guide. - _m('The following sites are allowed to access your ' . - 'identity and log you in. You can remove a site from ' . - 'this list to deny it access to your OpenID.')); + $this->element( + 'p', + 'form_guide', + // TRANS: Form guide. + _m('The following sites are allowed to access your ' . + 'identity and log you in. You can remove a site from ' . + 'this list to deny it access to your OpenID.') + ); $this->elementStart('ul', 'form_data'); $user_openid_trustroot = new User_openid_trustroot(); $user_openid_trustroot->user_id = $this->scoped->getID(); if ($user_openid_trustroot->find()) { while ($user_openid_trustroot->fetch()) { $this->elementStart('li'); - $this->element('input', ['name' => 'openid_trustroot[]', - 'type' => 'checkbox', - 'class' => 'checkbox', - 'value' => $user_openid_trustroot->trustroot, - 'id' => 'openid_trustroot_' . crc32($user_openid_trustroot->trustroot)]); - $this->element('label', - ['class'=>'checkbox', - 'for' => 'openid_trustroot_' . crc32($user_openid_trustroot->trustroot)], - $user_openid_trustroot->trustroot); + $this->element( + 'input', + [ + 'name' => 'openid_trustroot[]', + 'type' => 'checkbox', + 'class' => 'checkbox', + 'value' => $user_openid_trustroot->trustroot, + 'id' => 'openid_trustroot_' . crc32($user_openid_trustroot->trustroot), + ] + ); + $this->element( + 'label', + [ + 'class'=>'checkbox', + 'for' => 'openid_trustroot_' . crc32($user_openid_trustroot->trustroot), + ], + $user_openid_trustroot->trustroot + ); $this->elementEnd('li'); } } @@ -363,7 +382,7 @@ class OpenidsettingsAction extends SettingsAction $orig = clone($prefs); } - $prefs->hide_profile_link = $this->booleanintstring('hide_profile_link'); + $prefs->hide_profile_link = $this->boolean('hide_profile_link'); if ($orig instanceof User_openid_prefs) { $prefs->update($orig); diff --git a/plugins/Poll/classes/User_poll_prefs.php b/plugins/Poll/classes/User_poll_prefs.php index 450a6b9cfb..cf3272e2bc 100644 --- a/plugins/Poll/classes/User_poll_prefs.php +++ b/plugins/Poll/classes/User_poll_prefs.php @@ -1,44 +1,37 @@ . + /** * Data class to record user prefs for polls * - * PHP version 5 - * - * @category PollPlugin - * @package StatusNet - * @author Evan Prodromou - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ - * - * StatusNet - the distributed open-source microblogging tool - * Copyright (C) 2012, StatusNet, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * @category PollPlugin + * @package GNUsocial + * @author Brion Vibber + * @author Evan Prodromou + * @copyright 2012, StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('STATUSNET')) { - exit(1); -} +defined('GNUSOCIAL') || die(); /** * For storing the poll prefs * - * @category PollPlugin - * @package StatusNet - * @author Brion Vibber - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ + * @copyright 2012, StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later * * @see DB_DataObject */ @@ -46,7 +39,7 @@ class User_poll_prefs extends Managed_DataObject { public $__table = 'user_poll_prefs'; // table name public $user_id; // int id - public $hide_responses; // boolean + public $hide_responses; // bool public $created; // datetime public $modified; // datetime @@ -59,7 +52,7 @@ class User_poll_prefs extends Managed_DataObject 'description' => 'Record of user preferences for polls', 'fields' => array( 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user id'), - 'hide_responses' => array('type' => 'int', 'size' => 'tiny', 'default' => 0, 'description' => 'Hide all poll responses'), + 'hide_responses' => array('type' => 'bool', 'default' => false, 'description' => 'Hide all poll responses'), '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'), ), diff --git a/plugins/QnA/actions/qnaclosequestion.php b/plugins/QnA/actions/qnaclosequestion.php index 4c2abb6536..57ab3ee1fd 100644 --- a/plugins/QnA/actions/qnaclosequestion.php +++ b/plugins/QnA/actions/qnaclosequestion.php @@ -1,47 +1,36 @@ . + /** - * StatusNet - the distributed open-source microblogging tool - * Copyright (C) 2011, StatusNet, Inc. - * * Close a question to further answers * - * PHP version 5 - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * * @category QnA - * @package StatusNet + * @package GNUsocial * @author Zach Copley * @copyright 2011 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or late */ -if (!defined('STATUSNET')) { - // This check helps protect against security problems; - // your code file can't be executed directly from the web. - exit(1); -} + +defined('GNUSOCIAL') || die(); /** * Close a question to new answers * - * @category QnA - * @package StatusNet - * @author Zach Copley * @copyright 2010 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or late */ class QnaclosequestionAction extends Action { @@ -57,7 +46,7 @@ class QnaclosequestionAction extends Action * * @return string Action title */ - function title() + public function title() { // TRANS: Page title for close a question return _m('Close question'); @@ -71,7 +60,7 @@ class QnaclosequestionAction extends Action * @return boolean true * @throws ClientException */ - function prepare(array $args = []) + public function prepare(array $args = []) { parent::prepare($args); if ($this->boolean('ajax')) { @@ -107,7 +96,7 @@ class QnaclosequestionAction extends Action * * @return void */ - function handle() + public function handle() { parent::handle(); @@ -125,7 +114,7 @@ class QnaclosequestionAction extends Action * * @return void */ - function closeQuestion() + public function closeQuestion() { $user = common_current_user(); @@ -136,9 +125,8 @@ class QnaclosequestionAction extends Action } $orig = clone($this->question); - $this->question->closed = 1; + $this->question->closed = true; $this->question->update($orig); - } catch (ClientException $ce) { $this->error = $ce->getMessage(); $this->showPage(); @@ -166,7 +154,7 @@ class QnaclosequestionAction extends Action * * @return void */ - function showContent() + public function showContent() { if (!empty($this->error)) { $this->element('p', 'error', $this->error); @@ -184,7 +172,7 @@ class QnaclosequestionAction extends Action * * @return boolean is read only action? */ - function isReadOnly($args) + public function isReadOnly($args) { if ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD') { diff --git a/plugins/QnA/actions/qnareviseanswer.php b/plugins/QnA/actions/qnareviseanswer.php index e23195531f..7ae912c68d 100644 --- a/plugins/QnA/actions/qnareviseanswer.php +++ b/plugins/QnA/actions/qnareviseanswer.php @@ -1,47 +1,36 @@ . - * - * @category QnA - * @package StatusNet - * @author Zach Copley - * @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); -} +// This file is part of GNU social - https://www.gnu.org/software/social +// +// GNU social is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// GNU social is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with GNU social. If not, see . /** * Revise an answer * * @category QnA - * @package StatusNet + * @package GNUsocial * @author Zach Copley + * @copyright 2011 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later + */ + +defined('GNUSOCIAL') || die(); + +/** + * Revise an answer + * * @copyright 2010 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ class QnareviseanswerAction extends Action { @@ -56,7 +45,7 @@ class QnareviseanswerAction extends Action * * @return string Action title */ - function title() + public function title() { // TRANS: Page title for revising a question return _m('Revise answer'); @@ -70,7 +59,7 @@ class QnareviseanswerAction extends Action * @return boolean true * @throws ClientException */ - function prepare(array $args = []) + public function prepare(array $args = []) { parent::prepare($args); if ($this->boolean('ajax')) { @@ -110,7 +99,7 @@ class QnareviseanswerAction extends Action * * @return void */ - function handle() + public function handle() { parent::handle(); @@ -119,7 +108,7 @@ class QnareviseanswerAction extends Action if ($this->arg('revise')) { $this->showContent(); return; - } else if ($this->arg('best')) { + } elseif ($this->arg('best')) { if ($this->user->id == $this->question->profile_id) { $this->markBest(); return; @@ -138,7 +127,7 @@ class QnareviseanswerAction extends Action * * @return void */ - function showContent() + public function showContent() { if (!empty($this->error)) { $this->element('p', 'error', $this->error); @@ -154,7 +143,7 @@ class QnareviseanswerAction extends Action return; } - function showAjaxReviseForm() + public function showAjaxReviseForm() { $this->startHTML('text/xml;charset=utf-8'); $this->elementStart('head'); @@ -173,7 +162,7 @@ class QnareviseanswerAction extends Action * * @return void */ - function markBest() + public function markBest() { $question = $this->question; $answer = $this->answer; @@ -181,12 +170,12 @@ class QnareviseanswerAction extends Action try { // close the question to further answers $orig = clone($question); - $question->closed = 1; + $question->closed = true; $result = $question->update($orig); // mark this answer an the best answer $orig = clone($answer); - $answer->best = 1; + $answer->best = true; $result = $answer->update($orig); } catch (ClientException $ce) { $this->error = $ce->getMessage(); @@ -215,7 +204,7 @@ class QnareviseanswerAction extends Action * * @return void */ - function reviseAnswer() + public function reviseAnswer() { $answer = $this->answer; @@ -255,7 +244,7 @@ class QnareviseanswerAction extends Action * * @return boolean is read only action? */ - function isReadOnly($args) + public function isReadOnly($args) { if ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD') { diff --git a/plugins/QnA/classes/QnA_Answer.php b/plugins/QnA/classes/QnA_Answer.php index 2aa69cf5a3..73a73154fe 100644 --- a/plugins/QnA/classes/QnA_Answer.php +++ b/plugins/QnA/classes/QnA_Answer.php @@ -1,46 +1,38 @@ . + /** * Data class to save answers to questions * - * PHP version 5 - * - * @category QnA - * @package StatusNet - * @author Zach Copley - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ - * - * StatusNet - the distributed open-source microblogging tool - * Copyright (C) 2011, StatusNet, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * @category QnA + * @package GNUsocial + * @author Zach Copley + * @copyright 2011 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('STATUSNET')) { - exit(1); -} +defined('STATUSNET') || die(); /** * For storing answers * - * @category QnA - * @package StatusNet - * @author Zach Copley - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ + * @copyright 2011 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later * - * @see DB_DataObject + * @see DB_DataObject */ class QnA_Answer extends Managed_DataObject { @@ -51,7 +43,7 @@ class QnA_Answer extends Managed_DataObject public $uri; // varchar(191) not 255 because utf8mb4 takes more space public $question_id; // char(36) -> question.id UUID public $profile_id; // int -> question.id - public $best; // (boolean) int -> whether the question asker has marked this as the best answer + public $best; // bool -> whether the question asker has marked this as the best answer public $revisions; // int -> count of revisions to this answer public $content; // text -> response text public $created; // datetime @@ -82,7 +74,7 @@ class QnA_Answer extends Managed_DataObject 'description' => 'UUID of question being responded to', ), 'content' => array('type' => 'text'), // got a better name? - 'best' => array('type' => 'int', 'size' => 'tiny'), + 'best' => array('type' => 'bool'), 'revisions' => array('type' => 'int'), 'profile_id' => array('type' => 'int'), 'created' => array('type' => 'datetime', 'not null' => true), @@ -105,7 +97,7 @@ class QnA_Answer extends Managed_DataObject * * @return QnA_Answer found response or null */ - static function getByNotice($notice) + public static function getByNotice($notice) { $answer = self::getKV('uri', $notice->uri); if (empty($answer)) { @@ -119,17 +111,17 @@ class QnA_Answer extends Managed_DataObject * * @return Notice */ - function getNotice() + public function getNotice() { return Notice::getKV('uri', $this->uri); } - static function fromNotice($notice) + public static function fromNotice($notice) { return QnA_Answer::getKV('uri', $notice->uri); } - function getUrl() + public function getUrl() { return $this->getNotice()->getUrl(); } @@ -139,29 +131,29 @@ class QnA_Answer extends Managed_DataObject * * @return QnA_Question */ - function getQuestion() + public function getQuestion() { $question = QnA_Question::getKV('id', $this->question_id); if (empty($question)) { // TRANS: Exception thown when getting a question with a non-existing ID. // TRANS: %s is the non-existing question ID. - throw new Exception(sprintf(_m('No question with ID %s'),$this->question_id)); + throw new Exception(sprintf(_m('No question with ID %s'), $this->question_id)); } return $question; } - function getProfile() + public function getProfile() { $profile = Profile::getKV('id', $this->profile_id); if (empty($profile)) { // TRANS: Exception thown when getting a profile with a non-existing ID. // TRANS: %s is the non-existing profile ID. - throw new Exception(sprintf(_m('No profile with ID %s'),$this->profile_id)); + throw new Exception(sprintf(_m('No profile with ID %s'), $this->profile_id)); } return $profile; } - function asHTML() + public function asHTML() { return self::toHTML( $this->getProfile(), @@ -170,7 +162,7 @@ class QnA_Answer extends Managed_DataObject ); } - function asString() + public function asString() { return self::toString( $this->getProfile(), @@ -179,7 +171,7 @@ class QnA_Answer extends Managed_DataObject ); } - static function toHTML($profile, $question, $answer) + public static function toHTML($profile, $question, $answer) { $notice = $question->getNotice(); @@ -201,7 +193,7 @@ class QnA_Answer extends Managed_DataObject htmlspecialchars( // Notification of how often an answer was revised. // TRANS: %s is the number of answer revisions. - sprintf(_m('%s revision','%s revisions',$answer->revisions), $answer->revisions) + sprintf(_m('%s revision', '%s revisions', $answer->revisions), $answer->revisions) ) ); $out->elementEnd('span'); @@ -212,7 +204,7 @@ class QnA_Answer extends Managed_DataObject return $out->getString(); } - static function toString($profile, $question, $answer) + public static function toString($profile, $question, $answer) { // @todo FIXME: unused variable? $notice = $question->getNotice(); @@ -237,7 +229,7 @@ class QnA_Answer extends Managed_DataObject * * @return Notice saved notice */ - static function saveNew($profile, $question, $text, $options = null) + public static function saveNew($profile, $question, $text, $options = null) { if (empty($options)) { $options = array(); @@ -248,7 +240,7 @@ class QnA_Answer extends Managed_DataObject $answer->profile_id = $profile->id; $answer->question_id = $question->id; $answer->revisions = 0; - $answer->best = 0; + $answer->best = false; $answer->content = $text; $answer->created = common_sql_now(); $answer->uri = common_local_url( diff --git a/plugins/QnA/classes/QnA_Question.php b/plugins/QnA/classes/QnA_Question.php index b531838677..d90e3a2c1f 100644 --- a/plugins/QnA/classes/QnA_Question.php +++ b/plugins/QnA/classes/QnA_Question.php @@ -1,46 +1,38 @@ . + /** * Data class to mark a notice as a question * - * PHP version 5 - * - * @category QnA - * @package StatusNet - * @author Zach Copley - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ - * - * StatusNet - the distributed open-source microblogging tool - * Copyright (C) 2011, StatusNet, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * @category QnA + * @package GNUsocial + * @author Zach Copley + * @copyright 2011 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('STATUSNET')) { - exit(1); -} +defined('GNUSOCIAL') || die(); /** * For storing a question * - * @category QnA - * @package StatusNet - * @author Zach Copley - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ + * @copyright 2011 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later * - * @see DB_DataObject + * @see DB_DataObject */ class QnA_Question extends Managed_DataObject { @@ -52,7 +44,7 @@ class QnA_Question extends Managed_DataObject public $profile_id; // int -> profile.id public $title; // text public $description; // text - public $closed; // int (boolean) whether a question is closed + public $closed; // bool -> whether a question is closed public $created; // datetime /** @@ -76,7 +68,7 @@ class QnA_Question extends Managed_DataObject ), 'profile_id' => array('type' => 'int'), 'title' => array('type' => 'text'), - 'closed' => array('type' => 'int', 'size' => 'tiny'), + 'closed' => array('type' => 'bool'), 'description' => array('type' => 'text'), 'created' => array( 'type' => 'datetime', @@ -97,28 +89,28 @@ class QnA_Question extends Managed_DataObject * * @return Question found question or null */ - static function getByNotice($notice) + public static function getByNotice($notice) { return self::getKV('uri', $notice->uri); } - function getNotice() + public function getNotice() { return Notice::getKV('uri', $this->uri); } - function getUrl() + public function getUrl() { return $this->getNotice()->getUrl(); } - function getProfile() + public function getProfile() { $profile = Profile::getKV('id', $this->profile_id); if (empty($profile)) { // TRANS: Exception trown when getting a profile for a non-existing ID. // TRANS: %s is the provided profile ID. - throw new Exception(sprintf(_m('No profile with ID %s'),$this->profile_id)); + throw new Exception(sprintf(_m('No profile with ID %s'), $this->profile_id)); } return $profile; } @@ -130,7 +122,7 @@ class QnA_Question extends Managed_DataObject * * @return Answer object or null */ - function getAnswer(Profile $profile) + public function getAnswer(Profile $profile) { $a = new QnA_Answer(); $a->question_id = $this->id; @@ -143,7 +135,7 @@ class QnA_Question extends Managed_DataObject } } - function getAnswers() + public function getAnswers() { $a = new QnA_Answer(); $a->question_id = $this->id; @@ -155,7 +147,7 @@ class QnA_Question extends Managed_DataObject } } - function countAnswers() + public function countAnswers() { $a = new QnA_Answer(); @@ -164,22 +156,22 @@ class QnA_Question extends Managed_DataObject return $a->count(); } - static function fromNotice($notice) + public static function fromNotice($notice) { return QnA_Question::getKV('uri', $notice->uri); } - function asHTML() + public function asHTML() { return self::toHTML($this->getProfile(), $this); } - function asString() + public function asString() { return self::toString($this->getProfile(), $this); } - static function toHTML($profile, $question) + public static function toHTML($profile, $question) { $notice = $question->getNotice(); @@ -205,7 +197,7 @@ class QnA_Question extends Managed_DataObject $out->elementStart('span', 'answer-count'); // TRANS: Number of given answers to a question. // TRANS: %s is the number of given answers. - $out->text(sprintf(_m('%s answer','%s answers',$cnt), $cnt)); + $out->text(sprintf(_m('%s answer', '%s answers', $cnt), $cnt)); $out->elementEnd('span'); } @@ -221,7 +213,7 @@ class QnA_Question extends Managed_DataObject return $out->getString(); } - static function toString($profile, $question, $answers) + public static function toString($profile, $question, $answers) { return sprintf(htmlspecialchars($question->description)); } @@ -237,7 +229,7 @@ class QnA_Question extends Managed_DataObject * * @return Notice saved notice */ - static function saveNew($profile, $title, $description, $options = array()) + public static function saveNew($profile, $title, $description, $options = []) { $q = new QnA_Question(); diff --git a/plugins/SensitiveContent/actions/sensitivecontentsettings.php b/plugins/SensitiveContent/actions/sensitivecontentsettings.php index 482a893958..0c7171bc0a 100644 --- a/plugins/SensitiveContent/actions/sensitivecontentsettings.php +++ b/plugins/SensitiveContent/actions/sensitivecontentsettings.php @@ -1,51 +1,72 @@ . -if (!defined('GNUSOCIAL')) { exit(1); } +defined('GNUSOCIAL') || die(); class SensitiveContentSettingsAction extends SettingsAction { - function title() - { - return _m('Sensitive content settings'); - } + public function title() + { + return _m('Sensitive content settings'); + } - function getInstructions() - { - return _m('Set preferences for display of "sensitive" content'); - } + public function getInstructions() + { + return _m('Set preferences for display of "sensitive" content'); + } - function showContent() - { + public function showContent() + { + $user = $this->scoped->getUser(); - $user = $this->scoped->getUser(); + $this->elementStart( + 'form', + [ + 'method' => 'post', + 'id' => 'sensitivecontent', + 'class' => 'form_settings', + 'action' => common_local_url('sensitivecontentsettings'), + ] + ); - $this->elementStart('form', array('method' => 'post', - 'id' => 'sensitivecontent', - 'class' => 'form_settings', - 'action' => common_local_url('sensitivecontentsettings'))); + $this->elementStart('fieldset'); + $this->hidden('token', common_session_token()); + $this->elementStart('ul', 'form_data'); - $this->elementStart('fieldset'); - $this->hidden('token', common_session_token()); - $this->elementStart('ul', 'form_data'); - - $this->elementStart('li'); - $this->checkbox('hidesensitive', _('Hide attachments in posts hashtagged #NSFW'), - ($this->arg('hidesensitive')) ? - $this->boolean('hidesensitive') : $this->scoped->getPref('MoonMan','hide_sensitive',0)); - $this->elementEnd('li'); + $this->elementStart('li'); + $this->checkbox( + 'hidesensitive', + _('Hide attachments in posts hashtagged #NSFW'), + ($this->arg('hidesensitive') ? + $this->boolean('hidesensitive') : $this->scoped->getPref('MoonMan', 'hide_sensitive', 0)) + ); + $this->elementEnd('li'); - $this->elementEnd('ul'); - $this->submit('save', _m('BUTTON','Save')); + $this->elementEnd('ul'); + $this->submit('save', _m('BUTTON', 'Save')); - $this->elementEnd('fieldset'); - $this->elementEnd('form'); - } + $this->elementEnd('fieldset'); + $this->elementEnd('form'); + } - function doPost() - { - $hidesensitive = $this->booleanintstring('hidesensitive'); - $this->scoped->setPref('MoonMan','hide_sensitive', $hidesensitive); - return _('Settings saved.'); - } + public function doPost() + { + $hidesensitive = $this->boolean('hidesensitive') ? '1' : '0'; + $this->scoped->setPref('MoonMan', 'hide_sensitive', $hidesensitive); + return _('Settings saved.'); + } } diff --git a/plugins/TwitterBridge/lib/twitterimport.php b/plugins/TwitterBridge/lib/twitterimport.php index cdbe4a3a69..57ed90fc38 100644 --- a/plugins/TwitterBridge/lib/twitterimport.php +++ b/plugins/TwitterBridge/lib/twitterimport.php @@ -1,35 +1,30 @@ . + /** - * StatusNet, the distributed open-source microblogging tool - * - * PHP version 5 - * - * LICENCE: This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - * * @category Plugin - * @package StatusNet + * @package GNUsocial * @author Zach Copley * @author Julien C * @author Brion Vibber * @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/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('STATUSNET')) { - exit(1); -} +defined('GNUSOCIAL') || die(); require_once dirname(__DIR__) . '/twitter.php'; @@ -38,14 +33,8 @@ require_once dirname(__DIR__) . '/twitter.php'; * Is used by both the polling twitterstatusfetcher.php daemon, and the * in-progress streaming import. * - * @category Plugin - * @package StatusNet - * @author Zach Copley - * @author Julien C - * @author Brion Vibber - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - * @link http://twitter.com/ + * @copyright 2009-2010 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ class TwitterImport { @@ -74,12 +63,12 @@ class TwitterImport return $notice; } - function name() + public function name() { return get_class($this); } - function saveStatus($status) + public function saveStatus($status) { $profile = $this->ensureProfile($status->user); @@ -103,7 +92,7 @@ class TwitterImport } $dupe = Notice::getKV('uri', $statusUri); - if($dupe instanceof Notice) { + if ($dupe instanceof Notice) { // Add it to our record Notice_to_status::saveNew($dupe->id, $statusId); common_log( @@ -123,24 +112,29 @@ class TwitterImport $author = $original->getProfile(); // TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. // TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. - $content = sprintf(_m('RT @%1$s %2$s'), - $author->nickname, - $original->content); + $content = sprintf( + _m('RT @%1$s %2$s'), + $author->nickname, + $original->content + ); if (Notice::contentTooLong($content)) { $contentlimit = Notice::maxContent(); $content = mb_substr($content, 0, $contentlimit - 4) . ' ...'; } - $repeat = Notice::saveNew($profile->id, - $content, - 'twitter', - array('repeat_of' => $original->id, - 'uri' => $statusUri, - 'is_local' => Notice::GATEWAY, - 'object_type' => ActivityObject::NOTE, - 'verb' => ActivityVerb::POST - )); + $repeat = Notice::saveNew( + $profile->id, + $content, + 'twitter', + [ + 'repeat_of' => $original->id, + 'uri' => $statusUri, + 'is_local' => Notice::GATEWAY, + 'object_type' => ActivityObject::NOTE, + 'verb' => ActivityVerb::POST, + ] + ); common_log(LOG_INFO, "Saved {$repeat->id} as a repeat of {$original->id}"); Notice_to_status::saveNew($repeat->id, $statusId); return $repeat; @@ -183,11 +177,10 @@ class TwitterImport $notice->is_local = Notice::GATEWAY; - $notice->content = html_entity_decode($this->linkify($status, FALSE), ENT_QUOTES, 'UTF-8'); - $notice->rendered = $this->linkify($status, TRUE); + $notice->content = html_entity_decode($this->linkify($status, false), ENT_QUOTES, 'UTF-8'); + $notice->rendered = $this->linkify($status, true); if (Event::handle('StartNoticeSave', array(&$notice))) { - if (empty($notice->conversation)) { $conv = Conversation::create(); common_log(LOG_INFO, "No known conversation for status {$statusId} so a new one ({$conv->getID()}) was created."); @@ -221,7 +214,7 @@ class TwitterImport * * @return string URI */ - function makeStatusURI($username, $id) + public function makeStatusURI($username, $id) { return 'https://twitter.com/' . $username @@ -283,7 +276,7 @@ class TwitterImport if (empty($id)) { throw new Exception('Failed insert'); } - } catch(Exception $e) { + } catch (Exception $e) { common_log(LOG_WARNING, __METHOD__ . " Couldn't insert profile: " . $e->getMessage()); common_log_db_error($profile, 'INSERT', __FILE__); $profile->query("ROLLBACK"); @@ -314,8 +307,13 @@ class TwitterImport if ($avatar->filename === $filename) { return null; } - common_debug(__METHOD__ . " - Updating profile avatar (profile_id={$profile->id}) " . - "from {$avatar->filename} to {$filename}"); + common_debug(sprintf( + '%s - Updating profile avatar (profile_id=%d) from %s to %s', + __METHOD__, + $profile->id, + $avatar->filename, + $filename + )); // else we continue with creating a new avatar } catch (NoAvatarException $e) { // Avatar was not found. We can catch NoAvatarException or FileNotFoundException @@ -367,7 +365,7 @@ class TwitterImport $avatar = new Avatar(); $avatar->profile_id = $profile->id; - $avatar->original = 1; // this is an original/"uploaded" avatar + $avatar->original = true; // this is an original/"uploaded" avatar $avatar->mediatype = $mediatype; $avatar->filename = $filename; $avatar->width = $this->avatarsize; @@ -416,7 +414,7 @@ class TwitterImport const HASHTAG = 2; const MENTION = 3; - function linkify($status, $html = FALSE) + public function linkify($status, $html = false) { $text = $status->text; @@ -424,10 +422,20 @@ class TwitterImport $statusId = twitter_id($status); common_log(LOG_WARNING, "No entities data for {$statusId}; trying to fake up links ourselves."); $text = common_replace_urls_callback($text, 'common_linkify'); - $text = preg_replace_callback('/(^|\"\;|\'|\(|\[|\{|\s+)#([\pL\pN_\-\.]{1,64})/', - function ($m) { return $m[1].'#'.TwitterStatusFetcher::tagLink($m[2]); }, $text); - $text = preg_replace_callback('/(^|\s+)@([a-z0-9A-Z_]{1,64})/', - function ($m) { return $m[1].'@'.TwitterStatusFetcher::atLink($m[2]); }, $text); + $text = preg_replace_callback( + '/(^|\"\;|\'|\(|\[|\{|\s+)#([\pL\pN_\-\.]{1,64})/', + function ($m) { + return $m[1] . '#'.TwitterStatusFetcher::tagLink($m[2]); + }, + $text + ); + $text = preg_replace_callback( + '/(^|\s+)@([a-z0-9A-Z_]{1,64})/', + function ($m) { + return $m[1] . '@'.TwitterStatusFetcher::atLink($m[2]); + }, + $text + ); return $text; } @@ -472,21 +480,21 @@ class TwitterImport $cursor = $start; } $orig = $this->twitEscape(mb_substr($text, $start, $end - $start)); - switch($type) { + switch ($type) { case self::URL: $linkText = $this->makeUrlLink($object, $orig, $html); break; case self::HASHTAG: if ($html) { $linkText = $this->makeHashtagLink($object, $orig); - }else{ + } else { $linkText = $orig; } break; case self::MENTION: if ($html) { $linkText = $this->makeMentionLink($object, $orig); - }else{ + } else { $linkText = $orig; } break; @@ -503,7 +511,7 @@ class TwitterImport return $result; } - function twitEscape($str) + public function twitEscape($str) { // Twitter seems to preemptive turn < and > into < and > // but doesn't for &, so while you may have some magic protection @@ -516,31 +524,31 @@ class TwitterImport return htmlspecialchars(html_entity_decode($str, ENT_COMPAT, 'UTF-8')); } - function makeUrlLink($object, $orig, $html) + public function makeUrlLink($object, $orig, $html) { if ($html) { return ''.htmlspecialchars($object->display_url).''; - }else{ + } else { return htmlspecialchars($object->expanded_url); } } - function makeHashtagLink($object, $orig) + public function makeHashtagLink($object, $orig) { return "#" . self::tagLink($object->text, substr($orig, 1)); } - function makeMentionLink($object, $orig) + public function makeMentionLink($object, $orig) { return "@".self::atLink($object->screen_name, $object->name, substr($orig, 1)); } - static function tagLink($tag, $orig) + public static function tagLink($tag, $orig) { return "{$orig}"; } - static function atLink($screenName, $fullName, $orig) + public static function atLink($screenName, $fullName, $orig) { if (!empty($fullName)) { return "{$orig}"; @@ -549,7 +557,7 @@ class TwitterImport } } - function saveStatusMentions($notice, $status) + public function saveStatusMentions($notice, $status) { $mentions = array(); @@ -582,7 +590,7 @@ class TwitterImport * @param Notice $notice * @param object $status */ - function saveStatusAttachments(Notice $notice, $status) + public function saveStatusAttachments(Notice $notice, $status) { if (common_config('attachments', 'process_links')) { if (!empty($status->entities) && !empty($status->entities->urls)) { diff --git a/scripts/makegroupadmin.php b/scripts/makegroupadmin.php index 58277c9ea2..4e2eb4ed32 100755 --- a/scripts/makegroupadmin.php +++ b/scripts/makegroupadmin.php @@ -1,21 +1,25 @@ #!/usr/bin/env php . +// This file is part of GNU social - https://www.gnu.org/software/social +// +// GNU social is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// GNU social is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with GNU social. If not, see . + +/** + * @package GNUsocial + * @author Evan Prodromou + * @copyright 2008, 2009 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ define('INSTALLDIR', dirname(__DIR__)); @@ -44,7 +48,6 @@ if (empty($nickname) || empty($groupname)) { } try { - $user = User::getKV('nickname', $nickname); if (empty($user)) { @@ -78,12 +81,11 @@ try { $orig = clone($member); - $member->is_admin = 1; + $member->is_admin = true; if (!$member->update($orig)) { throw new Exception("Can't make '$nickname' admin of '$groupname'."); } - } catch (Exception $e) { print $e->getMessage() . "\n"; exit(1); diff --git a/scripts/upgrade.php b/scripts/upgrade.php index 7069b09f1e..d60e072781 100755 --- a/scripts/upgrade.php +++ b/scripts/upgrade.php @@ -443,7 +443,7 @@ function initProfileLists() $plist->tagger = $ptag->tagger; $plist->tag = $ptag->tag; - $plist->private = 0; + $plist->private = false; $plist->created = common_sql_now(); $plist->modified = $plist->created; $plist->mainpage = common_local_url(