diff --git a/DOCUMENTATION/SYSTEM_ADMINISTRATORS/CONFIGURE.md b/DOCUMENTATION/SYSTEM_ADMINISTRATORS/CONFIGURE.md index dce3ffa905..39d3fdfb75 100644 --- a/DOCUMENTATION/SYSTEM_ADMINISTRATORS/CONFIGURE.md +++ b/DOCUMENTATION/SYSTEM_ADMINISTRATORS/CONFIGURE.md @@ -178,9 +178,6 @@ The ones that you may want to set are listed below for clarity. 'MDB2' to use the other driver type for DB_DataObject, but note that it breaks the OpenID libraries, which only support PEAR::DB. -* `quote_identifiers`(boolean, default false): Set this to true if you're using - postgresql. - * `type` (enum["mysql", "postgresql"], default 'mysql'): Used for certain database-specific optimization code. Assumes mysql if not set. MySQL also covers MySQLi and MariaDB. diff --git a/actions/featured.php b/actions/featured.php index f5aaaa130f..b4273a5d4e 100644 --- a/actions/featured.php +++ b/actions/featured.php @@ -1,36 +1,31 @@ . + /** - * StatusNet, the distributed open-source microblogging tool - * * List of featured users * - * 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 Public - * @package StatusNet + * @package GNUsocial * @author Zach Copley * @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('STATUSNET') && !defined('LACONICA')) { - exit(1); -} +defined('GNUSOCIAL') || die(); require_once INSTALLDIR . '/lib/profile/profilelist.php'; require_once INSTALLDIR . '/lib/groups/publicgroupnav.php'; @@ -38,23 +33,19 @@ require_once INSTALLDIR . '/lib/groups/publicgroupnav.php'; /** * List of featured users * - * @category Public - * @package StatusNet - * @author Zach Copley - * @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 FeaturedAction extends Action { - var $page = null; + public $page = null; - function isReadOnly($args) + public function isReadOnly($args) { return true; } - function prepare(array $args = array()) + public function prepare(array $args = []) { parent::prepare($args); $this->page = ($this->arg('page')) ? ($this->arg('page')+0) : 1; @@ -62,7 +53,7 @@ class FeaturedAction extends Action return true; } - function title() + public function title() { if ($this->page == 1) { // TRANS: Page title for first page of featured users. @@ -74,14 +65,14 @@ class FeaturedAction extends Action } } - function handle() + public function handle() { parent::handle(); $this->showPage(); } - function showPageNotice() + public function showPageNotice() { $instr = $this->getInstructions(); $output = common_markup_to_html($instr); @@ -90,14 +81,16 @@ class FeaturedAction extends Action $this->elementEnd('div'); } - function getInstructions() + public function getInstructions() { // TRANS: Description on page displaying featured users. - return sprintf(_('A selection of some great users on %s.'), - common_config('site', 'name')); + return sprintf( + _('A selection of some great users on %s.'), + common_config('site', 'name') + ); } - function showContent() + public function showContent() { // XXX: Note I'm doing it this two-stage way because a raw query // with a JOIN was *not* working. --Zach @@ -105,7 +98,6 @@ class FeaturedAction extends Action $featured_nicks = common_config('nickname', 'featured'); if (count($featured_nicks) > 0) { - $quoted = array(); foreach ($featured_nicks as $nick) { @@ -115,7 +107,7 @@ class FeaturedAction extends Action $user = new User; $user->whereAdd(sprintf('nickname IN (%s)', implode(',', $quoted))); $user->limit(($this->page - 1) * PROFILES_PER_PAGE, PROFILES_PER_PAGE + 1); - $user->orderBy(common_database_tablename('user') .'.nickname ASC'); + $user->orderBy($user->escapedTableName() . '.nickname ASC'); $user->find(); @@ -138,8 +130,12 @@ class FeaturedAction extends Action $profile->free(); - $this->pagination($this->page > 1, $cnt > PROFILES_PER_PAGE, - $this->page, 'featured'); + $this->pagination( + $this->page > 1, + $cnt > PROFILES_PER_PAGE, + $this->page, + 'featured' + ); } } } diff --git a/classes/File.php b/classes/File.php index 7420eee977..4beef14807 100644 --- a/classes/File.php +++ b/classes/File.php @@ -1,29 +1,26 @@ . + /** - * GNU social - a federating social network - * - * Abstraction for files - * - * 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 Files * @package GNUsocial * @author Mikael Nordfeldth * @author Miguel Dantas * @copyright 2008-2009, 2019 Free Software Foundation http://fsf.org - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link https://www.gnu.org/software/social/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ defined('GNUSOCIAL') || die(); @@ -248,14 +245,14 @@ class File extends Managed_DataObject // TRANS: gettext support multiple plurals in the same message, unfortunately... throw new ClientException( sprintf( - _m( + _m( 'No file may be larger than %1$d byte and the file you sent was %2$s. Try to upload a smaller version.', 'No file may be larger than %1$d bytes and the file you sent was %2$s. Try to upload a smaller version.', $fileQuota ), - $fileQuota, - $fileSizeText - ) + $fileQuota, + $fileSizeText + ) ); } @@ -277,13 +274,13 @@ class File extends Managed_DataObject // TRANS: %d (number) is the user quota in bytes and is used for plural. throw new ClientException( sprintf( - _m( + _m( 'A file this large would exceed your user quota of %d byte.', 'A file this large would exceed your user quota of %d bytes.', common_config('attachments', 'user_quota') ), - common_config('attachments', 'user_quota') - ) + common_config('attachments', 'user_quota') + ) ); } $query .= ' AND EXTRACT(month FROM file.modified) = EXTRACT(month FROM now()) AND EXTRACT(year FROM file.modified) = EXTRACT(year FROM now())'; @@ -295,13 +292,13 @@ class File extends Managed_DataObject // TRANS: $d (number) is the monthly user quota in bytes and is used for plural. throw new ClientException( sprintf( - _m( + _m( 'A file this large would exceed your monthly quota of %d byte.', 'A file this large would exceed your monthly quota of %d bytes.', common_config('attachments', 'monthly_quota') ), - common_config('attachments', 'monthly_quota') - ) + common_config('attachments', 'monthly_quota') + ) ); } return true; @@ -346,7 +343,8 @@ class File extends Managed_DataObject * @param string $filename * @return string|bool Value from the 'extblacklist' array, in the config */ - public static function getSafeExtension(string $filename) { + public static function getSafeExtension(string $filename) + { if (preg_match('/^.+?\.([A-Za-z0-9]+)$/', $filename, $matches) === 1) { // we matched on a file extension, so let's see if it means something. $ext = mb_strtolower($matches[1]); @@ -888,7 +886,11 @@ class File extends Managed_DataObject echo "\nFound old $table table, upgrading it to contain 'urlhash' field..."; $file = new File(); - $file->query(sprintf('SELECT id, LEFT(url, 191) AS shortenedurl, COUNT(*) AS c FROM %1$s WHERE LENGTH(url)>191 GROUP BY shortenedurl HAVING c > 1', $schema->quoteIdentifier($table))); + $file->query(sprintf( + 'SELECT id, LEFT(url, 191) AS shortenedurl, COUNT(*) FROM %1$s ' . + 'WHERE LENGTH(url) > 191 GROUP BY id, shortenedurl HAVING COUNT(*) > 1', + common_database_tablename($table) + )); print "\nFound {$file->N} URLs with too long entries in file table\n"; while ($file->fetch()) { // We've got a URL that is too long for our future file table @@ -943,11 +945,10 @@ class File extends Managed_DataObject echo "Updating urlhash fields in $table table..."; // Maybe very MySQL specific :( $tablefix->query(sprintf( - 'UPDATE %1$s SET %2$s=%3$s;', - $schema->quoteIdentifier($table), - 'urlhash', - // The line below is "result of sha256 on column `url`" - 'SHA2(url, 256)' + 'UPDATE %1$s SET urlhash = %2$s;', + $tablefix->escapedTableName(), + // The line below is "result of sha256 on column `url`" + 'sha2(url, 256)' )); echo "DONE.\n"; echo "Resuming core schema upgrade..."; diff --git a/classes/File_redirection.php b/classes/File_redirection.php index d35c608565..e051f372f9 100644 --- a/classes/File_redirection.php +++ b/classes/File_redirection.php @@ -1,23 +1,20 @@ . - */ +// 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 . -if (!defined('GNUSOCIAL')) { exit(1); } +defined('GNUSOCIAL') || die(); /** * Table Definition for file_redirection @@ -59,12 +56,13 @@ class File_redirection extends Managed_DataObject ); } - static public function getByUrl($url) + public static function getByUrl($url) { return self::getByPK(array('urlhash' => File::hashurl($url))); } - static function _commonHttp($url, $redirs) { + public static function _commonHttp($url, $redirs) + { $request = new HTTPClient($url); $request->setConfig(array( 'connect_timeout' => 10, // # seconds to wait @@ -96,10 +94,13 @@ class File_redirection extends Managed_DataObject * size (optional): byte size from Content-Length header * time (optional): timestamp from Last-Modified header */ - static function lookupWhere($short_url, $redirs = 10, $protected = false) { - if ($redirs < 0) return false; + public static function lookupWhere($short_url, $redirs = 10, $protected = false) + { + if ($redirs < 0) { + return false; + } - if(strpos($short_url,'://') === false){ + if (strpos($short_url, '://') === false) { return $short_url; } try { @@ -128,13 +129,13 @@ class File_redirection extends Managed_DataObject common_log(LOG_ERR, "Error while following redirects for $short_url: " . $e->getMessage()); return $short_url; } - - // if last url after all redirections is protected, - // use the url before it in the redirection chain + + // if last url after all redirections is protected, + // use the url before it in the redirection chain if ($response->getRedirectCount() && File::isProtected($response->getEffectiveUrl())) { - $return_url = $response->redirUrls[$response->getRedirectCount()-1]; + $return_url = $response->redirUrls[$response->getRedirectCount() - 1]; } else { - $return_url = $response->getEffectiveUrl(); + $return_url = $response->getEffectiveUrl(); } $ret = array('code' => $response->getStatus() @@ -142,12 +143,20 @@ class File_redirection extends Managed_DataObject , 'url' => $return_url); $type = $response->getHeader('Content-Type'); - if ($type) $ret['type'] = $type; - if ($protected) $ret['protected'] = true; + if ($type) { + $ret['type'] = $type; + } + if ($protected) { + $ret['protected'] = true; + } $size = $response->getHeader('Content-Length'); // @fixme bytes? - if ($size) $ret['size'] = $size; + if ($size) { + $ret['size'] = $size; + } $time = $response->getHeader('Last-Modified'); - if ($time) $ret['time'] = strtotime($time); + if ($time) { + $ret['time'] = strtotime($time); + } return $ret; } @@ -164,7 +173,8 @@ class File_redirection extends Managed_DataObject * @param boolean $discover true to attempt dereferencing the redirect if we don't know it already * @return File_redirection */ - static function where($in_url, $discover=true) { + public static function where($in_url, $discover = true) + { $redir = new File_redirection(); $redir->url = $in_url; $redir->urlhash = File::hashurl($redir->url); @@ -179,14 +189,16 @@ class File_redirection extends Managed_DataObject $r->redir_url = $f->url; } catch (NoResultException $e) { // Invalid entry, delete and run again - common_log(LOG_ERR, "Could not find File with id=".$r->file_id." referenced in File_redirection, deleting File redirection entry and and trying again..."); + common_log( + LOG_ERR, + 'Could not find File with id=' . $r->file_id . ' referenced in File_redirection, deleting File redirection entry and and trying again...' + ); $r->delete(); - return self::where($in_url); + return self::where($in_url); } // File_redirecion and File record found, return both return $r; - } catch (NoResultException $e) { // File_redirecion record not found, but this might be a direct link to a file try { @@ -194,15 +206,15 @@ class File_redirection extends Managed_DataObject $redir->file_id = $f->id; $redir->file = $f; return $redir; - } catch (NoResultException $e) { + } catch (NoResultException $e) { // nope, this was not a direct link to a file either, let's keep going } } - if ($discover) { - // try to follow redirects and get the final url + if ($discover) { + // try to follow redirects and get the final url $redir_info = File_redirection::lookupWhere($in_url); - if(is_string($redir_info)) { + if (is_string($redir_info)) { $redir_info = array('url' => $redir_info); } @@ -212,29 +224,32 @@ class File_redirection extends Managed_DataObject try { $r = File_redirection::getByUrl($redir_info['url']); - $f = File::getKV('id',$r->file_id); + $f = File::getKV('id', $r->file_id); - if($f instanceof File) { + if ($f instanceof File) { $redir->file = $f; - $redir->redir_url = $f->url; + $redir->redir_url = $f->url; } else { // Invalid entry in File_redirection, delete and run again - common_log(LOG_ERR, "Could not find File with id=".$r->file_id." referenced in File_redirection, deleting File_redirection entry and trying again..."); + common_log( + LOG_ERR, + 'Could not find File with id=' . $r->file_id . ' referenced in File_redirection, deleting File_redirection entry and trying again...' + ); $r->delete(); - return self::where($in_url); + return self::where($in_url); } } catch (NoResultException $e) { // save the file now when we know that we don't have it in File_redirection try { - $redir->file = File::saveNew($redir_info,$redir_info['url']); + $redir->file = File::saveNew($redir_info, $redir_info['url']); } catch (ServerException $e) { common_log(LOG_ERR, $e); - } + } } // If this is a redirection and we have a file to redirect to, save it - // (if it doesn't exist in File_redirection already) - if($redir->file instanceof File && $redir_info['url'] != $in_url) { + // (if it doesn't exist in File_redirection already) + if ($redir->file instanceof File && $redir_info['url'] != $in_url) { try { $file_redir = File_redirection::getByUrl($in_url); } catch (NoResultException $e) { @@ -243,12 +258,12 @@ class File_redirection extends Managed_DataObject $file_redir->url = $in_url; $file_redir->file_id = $redir->file->getID(); $file_redir->insert(); - $file_redir->redir_url = $redir->file->url; - } + $file_redir->redir_url = $redir->file->url; + } - $file_redir->file = $redir->file; - return $file_redir; - } + $file_redir->file = $redir->file; + return $file_redir; + } } return $redir; @@ -268,7 +283,7 @@ class File_redirection extends Managed_DataObject * @param User $user whose shortening options to use; defaults to the current web session user * @return string */ - static function makeShort($long_url, $user=null) + public static function makeShort($long_url, $user = null) { $canon = File_redirection::_canonUrl($long_url); @@ -293,7 +308,7 @@ class File_redirection extends Managed_DataObject * @return string */ - static function forceShort($long_url, $user) + public static function forceShort($long_url, $user) { $canon = File_redirection::_canonUrl($long_url); @@ -303,7 +318,8 @@ class File_redirection extends Managed_DataObject return !empty($short_url) ? $short_url : $long_url; } - static function _userMakeShort($long_url, User $user=null, $force = false) { + public static function _userMakeShort($long_url, User $user = null, $force = false) + { $short_url = common_shorten_url($long_url, $user, $force); if (!empty($short_url) && $short_url != $long_url) { $short_url = (string)$short_url; @@ -343,8 +359,11 @@ class File_redirection extends Managed_DataObject * @param string $default_scheme if given a bare link; defaults to 'http://' * @return string */ - static function _canonUrl($in_url, $default_scheme = 'http://') { - if (empty($in_url)) return false; + public static function _canonUrl($in_url, $default_scheme = 'http://') + { + if (empty($in_url)) { + return false; + } $out_url = $in_url; $p = parse_url($out_url); if (empty($p['host']) || empty($p['scheme'])) { @@ -377,13 +396,17 @@ class File_redirection extends Managed_DataObject default: $out_url = $default_scheme . ltrim($out_url, '/'); $p = parse_url($out_url); - if (empty($p['scheme'])) return false; + if (empty($p['scheme'])) { + return false; + } break; } } if (('ftp' == $p['scheme']) || ('ftps' == $p['scheme']) || ('http' == $p['scheme']) || ('https' == $p['scheme'])) { - if (empty($p['host'])) return false; + if (empty($p['host'])) { + return false; + } if (empty($p['path'])) { $out_url .= '/'; } @@ -392,7 +415,8 @@ class File_redirection extends Managed_DataObject return $out_url; } - static function saveNew($data, $file_id, $url) { + public static function saveNew($data, $file_id, $url) + { $file_redir = new File_redirection; $file_redir->urlhash = File::hashurl($url); $file_redir->url = $url; @@ -402,7 +426,7 @@ class File_redirection extends Managed_DataObject $file_redir->insert(); } - static public function beforeSchemaUpdate() + public static function beforeSchemaUpdate() { $table = strtolower(get_called_class()); $schema = Schema::get(); @@ -416,16 +440,16 @@ class File_redirection extends Managed_DataObject echo "\nFound old $table table, upgrading it to contain 'urlhash' field..."; // We have to create a urlhash that is _not_ the primary key, // transfer data and THEN run checkSchema - $schemadef['fields']['urlhash'] = array ( - 'type' => 'varchar', - 'length' => 64, - 'not null' => true, - 'description' => 'sha256 hash of the URL', - ); - $schemadef['fields']['url'] = array ( - 'type' => 'text', - 'description' => 'short URL (or any other kind of redirect) for file (id)', - ); + $schemadef['fields']['urlhash'] = [ + 'type' => 'varchar', + 'length' => 64, + 'not null' => true, + 'description' => 'sha256 hash of the URL', + ]; + $schemadef['fields']['url'] = [ + 'type' => 'text', + 'description' => 'short URL (or any other kind of redirect) for file (id)', + ]; unset($schemadef['primary key']); $schema->ensureTable($table, $schemadef); echo "DONE.\n"; @@ -435,16 +459,18 @@ class File_redirection extends Managed_DataObject // urlhash is hash('sha256', $url) in the File table echo "Updating urlhash fields in $table table..."; // Maybe very MySQL specific :( - $tablefix->query(sprintf('UPDATE %1$s SET %2$s=%3$s;', - $schema->quoteIdentifier($table), - 'urlhash', - // The line below is "result of sha256 on column `url`" - 'SHA2(url, 256)')); + $tablefix->query(sprintf( + 'UPDATE %1$s SET urlhash = %2$s;', + $tablefix->escapedTableName(), + // The line below is "result of sha256 on column `url`" + 'sha2(url, 256)' + )); echo "DONE.\n"; echo "Resuming core schema upgrade..."; } - public function getFile() { + public function getFile() + { if (!$this->file instanceof File) { $this->file = File::getByID($this->file_id); } diff --git a/classes/Managed_DataObject.php b/classes/Managed_DataObject.php index 8c9a55f2b6..539267d68c 100644 --- a/classes/Managed_DataObject.php +++ b/classes/Managed_DataObject.php @@ -1,28 +1,31 @@ . - */ +// 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 . /** * Wrapper for Memcached_DataObject which knows its own schema definition. * Builds its own damn settings from a schema definition. * - * @author Brion Vibber + * @package GNUsocial + * @author Brion Vibber + * @copyright 2010 Free Software Foundation, Inc http://www.fsf.org + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ + +defined('GNUSOCIAL') || die(); + abstract class Managed_DataObject extends Memcached_DataObject { /** @@ -42,7 +45,7 @@ abstract class Managed_DataObject extends Memcached_DataObject * @return get_called_class() object if found, or null for no hits * */ - static function getKV($k,$v=NULL) + public static function getKV($k, $v = null) { return parent::getClassKV(get_called_class(), $k, $v); } @@ -59,12 +62,12 @@ abstract class Managed_DataObject extends Memcached_DataObject * @return get_called_class() object if found, or null for no hits * */ - static function pkeyGet(array $kv) + public static function pkeyGet(array $kv) { return parent::pkeyGetClass(get_called_class(), $kv); } - static function pkeyCols() + public static function pkeyCols() { return parent::pkeyColsClass(get_called_class()); } @@ -78,10 +81,10 @@ abstract class Managed_DataObject extends Memcached_DataObject * * @return array Array of objects, in order */ - static function multiGet($keyCol, array $keyVals, $skipNulls=true) - { - return parent::multiGetClass(get_called_class(), $keyCol, $keyVals, $skipNulls); - } + public static function multiGet($keyCol, array $keyVals, $skipNulls = true) + { + return parent::multiGetClass(get_called_class(), $keyCol, $keyVals, $skipNulls); + } /** * Get multiple items from the database by key @@ -92,10 +95,10 @@ abstract class Managed_DataObject extends Memcached_DataObject * * @return array Array mapping $keyVals to objects, or null if not found */ - static function pivotGet($keyCol, array $keyVals, array $otherCols=array()) - { - return parent::pivotGetClass(get_called_class(), $keyCol, $keyVals, $otherCols); - } + public static function pivotGet($keyCol, array $keyVals, array $otherCols = []) + { + return parent::pivotGetClass(get_called_class(), $keyCol, $keyVals, $otherCols); + } /** * Get a multi-instance object @@ -110,7 +113,7 @@ abstract class Managed_DataObject extends Memcached_DataObject * Exception is thrown when no entries are found. * */ - static function listFind($keyCol, array $keyVals) + public static function listFind($keyCol, array $keyVals) { return parent::listFindClass(get_called_class(), $keyCol, $keyVals); } @@ -128,7 +131,7 @@ abstract class Managed_DataObject extends Memcached_DataObject * @return array with an get_called_class() object for each $keyVals entry * */ - static function listGet($keyCol, array $keyVals) + public static function listGet($keyCol, array $keyVals) { return parent::listGetClass(get_called_class(), $keyCol, $keyVals); } @@ -149,11 +152,11 @@ abstract class Managed_DataObject extends Memcached_DataObject * get/set an array of table primary keys * * Key info is pulled from the table definition array. - * + * * @access private * @return array */ - function keys() + public function keys() { return array_keys($this->keyTypes()); } @@ -167,7 +170,7 @@ abstract class Managed_DataObject extends Memcached_DataObject * @return array (column,use_native,sequence_name) */ - function sequenceKey() + public function sequenceKey() { $table = static::schemaDef(); foreach ($table['fields'] as $name => $column) { @@ -191,7 +194,7 @@ abstract class Managed_DataObject extends Memcached_DataObject * @return array key definitions */ - function keyTypes() + public function keyTypes() { $table = static::schemaDef(); $keys = array(); @@ -218,7 +221,7 @@ abstract class Managed_DataObject extends Memcached_DataObject * @param array $column * @return int */ - function columnBitmap($column) + public function columnBitmap($column) { $type = $column['type']; @@ -254,7 +257,7 @@ abstract class Managed_DataObject extends Memcached_DataObject return $style; } - function links() + public function links() { $links = array(); @@ -277,7 +280,7 @@ abstract class Managed_DataObject extends Memcached_DataObject * * @return array of strings */ - function _allCacheKeys() + public function _allCacheKeys() { $table = static::schemaDef(); $ckeys = array(); @@ -322,7 +325,7 @@ abstract class Managed_DataObject extends Memcached_DataObject * @return Managed_DataObject of the get_called_class() type * @throws NoResultException if no object with that primary key */ - static function getByPK(array $vals) + public static function getByPK(array $vals) { $classname = get_called_class(); @@ -356,7 +359,7 @@ abstract class Managed_DataObject extends Memcached_DataObject * @return Managed_DataObject of the get_called_class() type * @throws NoResultException if no object with that primary key */ - static function getByKeys(array $vals) + public static function getByKeys(array $vals) { $classname = get_called_class(); @@ -381,7 +384,7 @@ abstract class Managed_DataObject extends Memcached_DataObject return $object; } - static function getByID($id) + public static function getByID($id) { if (!property_exists(get_called_class(), 'id')) { throw new ServerException('Trying to get undefined property of dataobject class.'); @@ -394,7 +397,7 @@ abstract class Managed_DataObject extends Memcached_DataObject return static::getByPK(array('id' => $id)); } - static function getByUri($uri) + public static function getByUri($uri) { if (!property_exists(get_called_class(), 'uri')) { throw new ServerException('Trying to get undefined property of dataobject class.'); @@ -537,18 +540,20 @@ abstract class Managed_DataObject extends Memcached_DataObject $pid = $schema['primary key']; unset($schema); } - $pidWhere = array(); - foreach((array)$pid as $pidCol) { + $pidWhere = []; + foreach ((array) $pid as $pidCol) { $pidWhere[] = sprintf('%1$s = %2$s', $pidCol, $this->_quote($orig->$pidCol)); } if (empty($pidWhere)) { throw new ServerException('No primary ID column(s) set for updateWithKeys'); } - $qry = sprintf('UPDATE %1$s SET %2$s WHERE %3$s', - common_database_tablename($this->tableName()), - implode(', ', $parts), - implode(' AND ', $pidWhere)); + $qry = sprintf( + 'UPDATE %1$s SET %2$s WHERE %3$s', + $this->escapedTableName(), + implode(', ', $parts), + implode(' AND ', $pidWhere) + ); $result = $this->query($qry); if ($result === false) { @@ -576,21 +581,23 @@ abstract class Managed_DataObject extends Memcached_DataObject return $result; } - static public function beforeSchemaUpdate() + public static function beforeSchemaUpdate() { // NOOP } - static function newUri(Profile $actor, Managed_DataObject $object, $created=null) + public static function newUri(Profile $actor, Managed_DataObject $object, $created = null) { if (is_null($created)) { $created = common_sql_now(); } - return TagURI::mint(strtolower(get_called_class()).':%d:%s:%d:%s', - $actor->getID(), - ActivityUtils::resolveUri($object->getObjectType(), true), - $object->getID(), - common_date_iso8601($created)); + return TagURI::mint( + strtolower(get_called_class()) . ':%d:%s:%d:%s', + $actor->getID(), + ActivityUtils::resolveUri($object->getObjectType(), true), + $object->getID(), + common_date_iso8601($created) + ); } protected function onInsert() diff --git a/classes/Notice.php b/classes/Notice.php index b78d621c01..4b6f7ee19a 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1,40 +1,39 @@ . + /** - * StatusNet - the distributed open-source microblogging tool - * Copyright (C) 2008-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 Notices - * @package StatusNet - * @author Brenda Wallace - * @author Christopher Vollick - * @author CiaranG - * @author Craig Andrews - * @author Evan Prodromou - * @author Gina Haeussge - * @author Jeffery To - * @author Mike Cochrane - * @author Robin Millette - * @author Sarven Capadisli - * @author Tom Adams - * @author Mikael Nordfeldth + * @category Notices + * @package GNUsocial + * @author Brenda Wallace + * @author Christopher Vollick + * @author CiaranG + * @author Craig Andrews + * @author Evan Prodromou + * @author Gina Haeussge + * @author Jeffery To + * @author Mike Cochrane + * @author Robin Millette + * @author Sarven Capadisli + * @author Tom Adams + * @author Mikael Nordfeldth * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org - * @license GNU Affero General Public License http://www.gnu.org/licenses/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('GNUSOCIAL')) { exit(1); } +defined('GNUSOCIAL') || die(); /** * Table Definition for notice @@ -171,8 +170,8 @@ class Notice extends Managed_DataObject $result = null; if (!$delete_event || Event::handle('DeleteNoticeAsProfile', array($this, $actor, &$result))) { - // If $delete_event is true, we run the event. If the Event then - // returns false it is assumed everything was handled properly + // If $delete_event is true, we run the event. If the Event then + // returns false it is assumed everything was handled properly // and the notice was deleted. $result = $this->delete(); } @@ -215,7 +214,7 @@ class Notice extends Managed_DataObject * * @param string $uri A unique identifier for a resource (notice in this case) */ - static function fromUri($uri) + public static function fromUri($uri) { $notice = null; @@ -255,9 +254,11 @@ class Notice extends Managed_DataObject if (Event::handle('GetNoticeTitle', array($this, &$title)) && $imply) { // TRANS: Title of a notice posted without a title value. // TRANS: %1$s is a user name, %2$s is the notice creation date/time. - $title = sprintf(_('%1$s\'s status on %2$s'), - $this->getProfile()->getFancyName(), - common_exact_date($this->created)); + $title = sprintf( + _('%1$s\'s status on %2$s'), + $this->getProfile()->getFancyName(), + common_exact_date($this->created) + ); } return $title; } @@ -274,9 +275,11 @@ class Notice extends Managed_DataObject // update to include rendered content on-the-fly, so we don't have to have a fix-up script in upgrade.php common_debug('Rendering notice '.$this->getID().' as it had no rendered HTML content.'); $orig = clone($this); - $this->rendered = common_render_content($this->getContent(), - $this->getProfile(), - $this->hasParent() ? $this->getParent() : null); + $this->rendered = common_render_content( + $this->getContent(), + $this->getProfile(), + ($this->hasParent() ? $this->getParent() : null) + ); $this->update($orig); } return $this->rendered; @@ -336,7 +339,8 @@ class Notice extends Managed_DataObject return $selfLink; } - public function getObjectType($canonical=false) { + public function getObjectType($canonical = false) + { if (is_null($this->object_type) || $this->object_type==='') { throw new NoObjectTypeException($this); } @@ -355,7 +359,7 @@ class Notice extends Managed_DataObject /** * Extract #hashtags from this notice's content and save them to the database. */ - function saveTags() + public function saveTags() { /* extract all #hastags */ $count = preg_match_all('/(?:^|\s)#([\pL\pN_\-\.]{1,64})/u', strtolower($this->content), $match); @@ -371,16 +375,16 @@ class Notice extends Managed_DataObject * Record the given set of hash tags in the db for this notice. * Given tag strings will be normalized and checked for dupes. */ - function saveKnownTags($hashtags) + public function saveKnownTags($hashtags) { //turn each into their canonical tag //this is needed to remove dupes before saving e.g. #hash.tag = #hashtag - for($i=0; $isaveTag($hashtag); self::blow('profile:notice_ids_tagged:%d:%s', $this->profile_id, $hashtag); } @@ -391,7 +395,7 @@ class Notice extends Managed_DataObject * Record a single hash tag as associated with this notice. * Tag format and uniqueness must be validated by caller. */ - function saveTag($hashtag) + public function saveTag($hashtag) { $tag = new Notice_tag(); $tag->notice_id = $this->id; @@ -401,8 +405,10 @@ class Notice extends Managed_DataObject if (!$id) { // TRANS: Server exception. %s are the error details. - throw new ServerException(sprintf(_('Database error inserting hashtag: %s.'), - $last_error->message)); + throw new ServerException(sprintf( + _('Database error inserting hashtag: %s.'), + $last_error->message + )); return; } @@ -455,7 +461,8 @@ class Notice extends Managed_DataObject * @return Notice * @throws ClientException */ - static function saveNew($profile_id, $content, $source, array $options=null) { + public static function saveNew($profile_id, $content, $source, array $options = null) + { $defaults = array('uri' => null, 'url' => null, 'self' => null, @@ -602,8 +609,11 @@ class Notice extends Managed_DataObject if (!$reply->inScope($profile)) { // TRANS: Client error displayed when trying to reply to a notice a the target has no access to. // TRANS: %1$s is a user nickname, %2$d is a notice ID (number). - throw new ClientException(sprintf(_('%1$s has no access to notice %2$d.'), - $profile->nickname, $reply->id), 403); + throw new ClientException(sprintf( + _('%1$s has no access to notice %2$d.'), + $profile->nickname, + $reply->id + ), 403); } // If it's a repeat, the reply_to should be to the original @@ -676,9 +686,11 @@ class Notice extends Managed_DataObject if (!empty($rendered)) { $notice->rendered = $rendered; } else { - $notice->rendered = common_render_content($final, - $notice->getProfile(), - $notice->hasParent() ? $notice->getParent() : null); + $notice->rendered = common_render_content( + $final, + $notice->getProfile(), + ($notice->hasParent() ? $notice->getParent() : null) + ); } if (empty($verb)) { @@ -769,7 +781,7 @@ class Notice extends Managed_DataObject return $notice; } - static function saveActivity(Activity $act, Profile $actor, array $options=array()) + public static function saveActivity(Activity $act, Profile $actor, array $options = []) { // First check if we're going to let this Activity through from the specific actor if (!$actor->hasRight(Right::NEWNOTICE)) { @@ -1065,7 +1077,6 @@ class Notice extends Managed_DataObject // the activityverb is a POST (since stuff like repeat, favorite etc. // reasonably handle notifications themselves. if (ActivityUtils::compareVerbs($stored->verb, array(ActivityVerb::POST))) { - if (!empty($tags)) { $stored->saveKnownTags($tags); } else { @@ -1091,7 +1102,8 @@ class Notice extends Managed_DataObject return $stored; } - static public function figureOutScope(Profile $actor, array $groups, $scope=null) { + public static function figureOutScope(Profile $actor, array $groups, $scope = null) + { $scope = is_null($scope) ? self::defaultScope() : intval($scope); // For private streams @@ -1121,7 +1133,7 @@ class Notice extends Managed_DataObject return $scope; } - function blowOnInsert($conversation = false) + public function blowOnInsert($conversation = false) { $this->blowStream('profile:notice_ids:%d', $this->profile_id); @@ -1166,7 +1178,7 @@ class Notice extends Managed_DataObject * Clear cache entries related to this notice at delete time. * Necessary to avoid breaking paging on public, profile timelines. */ - function blowOnDelete() + public function blowOnDelete() { $this->blowOnInsert(); @@ -1190,7 +1202,7 @@ class Notice extends Managed_DataObject } } - function blowStream() + public function blowStream() { $c = self::memcache(); @@ -1229,7 +1241,8 @@ class Notice extends Managed_DataObject * * @return void */ - function saveUrls() { + public function saveUrls() + { if (common_config('attachments', 'process_links')) { common_replace_urls_callback($this->content, array($this, 'saveUrl'), $this); } @@ -1243,7 +1256,7 @@ class Notice extends Managed_DataObject * * @return void */ - function saveKnownUrls($urls) + public function saveKnownUrls($urls) { if (common_config('attachments', 'process_links')) { // @fixme validation? @@ -1256,7 +1269,8 @@ class Notice extends Managed_DataObject /** * @private callback */ - function saveUrl($url, Notice $notice) { + public function saveUrl($url, Notice $notice) + { try { File::processNew($url, $notice); } catch (ServerException $e) { @@ -1264,7 +1278,8 @@ class Notice extends Managed_DataObject } } - static function checkDupes($profile_id, $content) { + public static function checkDupes($profile_id, $content) + { $profile = Profile::getKV($profile_id); if (!$profile instanceof Profile) { return false; @@ -1275,7 +1290,7 @@ class Notice extends Managed_DataObject while ($notice->fetch()) { if (time() - strtotime($notice->created) >= common_config('site', 'dupelimit')) { return true; - } else if ($notice->content == $content) { + } elseif ($notice->content === $content) { return false; } } @@ -1292,7 +1307,8 @@ class Notice extends Managed_DataObject return ($cnt == 0); } - static function checkEditThrottle($profile_id) { + public static function checkEditThrottle($profile_id) + { $profile = Profile::getKV($profile_id); if (!$profile instanceof Profile) { return false; @@ -1310,34 +1326,35 @@ class Notice extends Managed_DataObject return true; } - protected $_attachments = array(); + protected $_attachments = []; - function attachments() { - if (isset($this->_attachments[$this->id])) { + public function attachments() + { + if (isset($this->_attachments[$this->id])) { return $this->_attachments[$this->id]; } $f2ps = File_to_post::listGet('post_id', array($this->id)); - $ids = array(); - foreach ($f2ps[$this->id] as $f2p) { + $ids = []; + foreach ($f2ps[$this->id] as $f2p) { $ids[] = $f2p->file_id; } return $this->_setAttachments(File::multiGet('id', $ids)->fetchAll()); } - public function _setAttachments(array $attachments) - { - return $this->_attachments[$this->id] = $attachments; - } + public function _setAttachments(array $attachments) + { + return $this->_attachments[$this->id] = $attachments; + } - static function publicStream($offset=0, $limit=20, $since_id=null, $max_id=null) + public static function publicStream($offset = 0, $limit = 20, $since_id = null, $max_id = null) { $stream = new PublicNoticeStream(); return $stream->getNotices($offset, $limit, $since_id, $max_id); } - static function conversationStream($id, $offset=0, $limit=20, $since_id=null, $max_id=null, Profile $scoped=null) + public static function conversationStream($id, $offset = 0, $limit = 20, $since_id = null, $max_id = null, Profile $scoped = null) { $stream = new ConversationNoticeStream($id, $scoped); return $stream->getNotices($offset, $limit, $since_id, $max_id); @@ -1349,7 +1366,7 @@ class Notice extends Managed_DataObject * @return boolean true if other messages exist in the same * conversation, false if this is the only one */ - function hasConversation() + public function hasConversation() { if (empty($this->conversation)) { // this notice is not part of a conversation apparently @@ -1370,7 +1387,7 @@ class Notice extends Managed_DataObject * * @return Notice or null */ - function conversationRoot($profile=-1) + public function conversationRoot($profile = -1) { // XXX: can this happen? @@ -1405,9 +1422,11 @@ class Notice extends Managed_DataObject if (is_null($profile)) { $keypart = sprintf('notice:conversation_root:%d:null', $this->id); } else { - $keypart = sprintf('notice:conversation_root:%d:%d', - $this->id, - $profile->id); + $keypart = sprintf( + 'notice:conversation_root:%d:%d', + $this->id, + $profile->id + ); } $root = self::cacheGet($keypart); @@ -1452,7 +1471,7 @@ class Notice extends Managed_DataObject * if left empty, will be loaded from reply records * @return array associating recipient user IDs with an inbox source constant */ - function whoGets(array $groups=null, array $recipients=null) + public function whoGets(array $groups = null, array $recipients = null) { $c = self::memcache(); @@ -1471,7 +1490,6 @@ class Notice extends Managed_DataObject // Give plugins a chance to add folks in at start... if (Event::handle('StartNoticeWhoGets', array($this, &$ni))) { - $users = $this->getSubscribedUsers(); foreach ($users as $id) { $ni[$id] = NOTICE_INBOX_SOURCE_SUB; @@ -1539,23 +1557,19 @@ class Notice extends Managed_DataObject return $ni; } - function getSubscribedUsers() + public function getSubscribedUsers() { $user = new User(); - if(common_config('db','quote_identifiers')) - $user_table = '"user"'; - else $user_table = 'user'; + $user->query(sprintf( + 'SELECT id FROM %1$s INNER JOIN subscription ' . + 'ON %1$s.id = subscription.subscriber ' . + 'WHERE subscription.subscribed = %2$d ', + $user->escapedTableName(), + $this->profile_id + )); - $qry = - 'SELECT id ' . - 'FROM '. $user_table .' JOIN subscription '. - 'ON '. $user_table .'.id = subscription.subscriber ' . - 'WHERE subscription.subscribed = %d '; - - $user->query(sprintf($qry, $this->profile_id)); - - $ids = array(); + $ids = []; while ($user->fetch()) { $ids[] = $user->id; @@ -1566,14 +1580,14 @@ class Notice extends Managed_DataObject return $ids; } - function getProfileTags() + public function getProfileTags() { $ptags = array(); try { $profile = $this->getProfile(); $list = $profile->getOtherTags($profile); - while($list->fetch()) { + while ($list->fetch()) { $ptags[] = clone($list); } } catch (Exception $e) { @@ -1605,7 +1619,7 @@ class Notice extends Managed_DataObject * best with generalizations on user_group to support * remote groups better. */ - function saveKnownGroups(array $group_ids) + public function saveKnownGroups(array $group_ids) { $groups = array(); foreach (array_unique($group_ids) as $id) { @@ -1637,13 +1651,12 @@ class Notice extends Managed_DataObject return $groups; } - function addToGroupInbox(User_group $group) + public function addToGroupInbox(User_group $group) { $gi = Group_inbox::pkeyGet(array('group_id' => $group->id, 'notice_id' => $this->id)); if (!$gi instanceof Group_inbox) { - $gi = new Group_inbox(); $gi->group_id = $group->id; @@ -1664,7 +1677,7 @@ class Notice extends Managed_DataObject return true; } - function saveAttentions(array $uris) + public function saveAttentions(array $uris) { foreach ($uris as $uri=>$type) { try { @@ -1677,7 +1690,7 @@ class Notice extends Managed_DataObject try { $this->saveAttention($target); } catch (AlreadyFulfilledException $e) { - common_debug('Attention already exists: '.var_export($e->getMessage(),true)); + common_debug('Attention already exists: ' . var_export($e->getMessage(), true)); } catch (Exception $e) { common_log(LOG_ERR, "Could not save notice id=={$this->getID()} attention for profile id=={$target->getID()}: {$e->getMessage()}"); } @@ -1688,7 +1701,7 @@ class Notice extends Managed_DataObject * Saves an attention for a profile (user or group) which means * it shows up in their home feed and such. */ - function saveAttention(Profile $target, $reason=null) + public function saveAttention(Profile $target, $reason = null) { if ($target->isGroup()) { // FIXME: Make sure we check (for both local and remote) users are in the groups they send to! @@ -1723,7 +1736,7 @@ class Notice extends Managed_DataObject * * @param array $uris Array of unique identifier URIs for recipients */ - function saveKnownReplies(array $uris) + public function saveKnownReplies(array $uris) { if (empty($uris)) { return; @@ -1759,7 +1772,7 @@ class Notice extends Managed_DataObject * @return array of integer profile IDs */ - function saveReplies() + public function saveReplies() { $sender = $this->getProfile(); @@ -1786,7 +1799,6 @@ class Notice extends Managed_DataObject $mentions = common_find_mentions($this->content, $sender, $parent); foreach ($mentions as $mention) { - foreach ($mention['mentioned'] as $mentioned) { // skip if they're already covered @@ -1810,7 +1822,7 @@ class Notice extends Managed_DataObject return $recipientIds; } - function saveReply($profileId) + public function saveReply($profileId) { $reply = new Reply(); @@ -1830,7 +1842,7 @@ class Notice extends Managed_DataObject * * @return array of integer profile ids (also group profiles) */ - function getAttentionProfileIDs() + public function getAttentionProfileIDs() { if (!isset($this->_attentionids[$this->getID()])) { $atts = Attention::multiGet('notice_id', array($this->getID())); @@ -1847,7 +1859,7 @@ class Notice extends Managed_DataObject * * @return array of integer profile ids */ - function getReplies() + public function getReplies() { if (!isset($this->_replies[$this->getID()])) { $mentions = Reply::multiGet('notice_id', array($this->getID())); @@ -1856,7 +1868,7 @@ class Notice extends Managed_DataObject return $this->_replies[$this->getID()]; } - function _setReplies($replies) + public function _setReplies($replies) { $this->_replies[$this->getID()] = $replies; } @@ -1866,7 +1878,7 @@ class Notice extends Managed_DataObject * * @return array of Profiles */ - function getAttentionProfiles() + public function getAttentionProfiles() { $ids = array_unique(array_merge($this->getReplies(), $this->getGroupProfileIDs(), $this->getAttentionProfileIDs())); @@ -1881,7 +1893,7 @@ class Notice extends Managed_DataObject * Replies must already have been saved; this is expected to be run * from the distrib queue handler. */ - function sendReplyNotifications() + public function sendReplyNotifications() { // Don't send reply notifications for repeats if ($this->isRepeat()) { @@ -1910,13 +1922,13 @@ class Notice extends Managed_DataObject * @return array of Group _profile_ IDs */ - function getGroupProfileIDs() + public function getGroupProfileIDs() { $ids = array(); - foreach ($this->getGroups() as $group) { - $ids[] = $group->profile_id; - } + foreach ($this->getGroups() as $group) { + $ids[] = $group->profile_id; + } return $ids; } @@ -1930,7 +1942,7 @@ class Notice extends Managed_DataObject protected $_groups = array(); - function getGroups() + public function getGroups() { // Don't save groups for repeats @@ -1944,18 +1956,18 @@ class Notice extends Managed_DataObject $gis = Group_inbox::listGet('notice_id', array($this->id)); - $ids = array(); + $ids = []; - foreach ($gis[$this->id] as $gi) { - $ids[] = $gi->group_id; - } + foreach ($gis[$this->id] as $gi) { + $ids[] = $gi->group_id; + } - $groups = User_group::multiGet('id', $ids); - $this->_groups[$this->id] = $groups->fetchAll(); - return $this->_groups[$this->id]; + $groups = User_group::multiGet('id', $ids); + $this->_groups[$this->id] = $groups->fetchAll(); + return $this->_groups[$this->id]; } - function _setGroups($groups) + public function _setGroups($groups) { $this->_groups[$this->id] = $groups; } @@ -1970,7 +1982,7 @@ class Notice extends Managed_DataObject * @throws ServerException */ - function asActivity(Profile $scoped=null) + public function asActivity(Profile $scoped = null) { $act = self::cacheGet(Cache::codeKey('notice:as-activity:'.$this->id)); @@ -1980,7 +1992,6 @@ class Notice extends Managed_DataObject $act = new Activity(); if (Event::handle('StartNoticeAsActivity', array($this, $act, $scoped))) { - $act->id = $this->uri; $act->time = strtotime($this->created); try { @@ -2085,7 +2096,6 @@ class Notice extends Managed_DataObject $atom_feed = $profile->getAtomFeed(); if (!empty($atom_feed)) { - $act->source = new ActivitySource(); // XXX: we should store the actual feed ID @@ -2134,10 +2144,7 @@ class Notice extends Managed_DataObject // This has gotten way too long. Needs to be sliced up into functional bits // or ideally exported to a utility class. - function asAtomEntry($namespace=false, - $source=false, - $author=true, - Profile $scoped=null) + public function asAtomEntry($namespace = false, $source = false, $author = true, Profile $scoped = null) { $act = $this->asActivity($scoped); $act->extra[] = $this->noticeInfo($scoped); @@ -2155,7 +2162,7 @@ class Notice extends Managed_DataObject * @return array representation of element */ - function noticeInfo(Profile $scoped=null) + public function noticeInfo(Profile $scoped = null) { // local notice ID (useful to clients for ordering) @@ -2200,7 +2207,7 @@ class Notice extends Managed_DataObject * @return string */ - function asActivityNoun($element) + public function asActivityNoun($element) { $noun = $this->asActivityObject(); return $noun->asString('activity:' . $element); @@ -2250,7 +2257,7 @@ class Notice extends Managed_DataObject * @return integer ID of replied-to notice, or null for not a reply. */ - static function getInlineReplyTo(Profile $sender, $content) + public static function getInlineReplyTo(Profile $sender, $content) { // Is there an initial @ or T? if (preg_match('/^T ([A-Z0-9]{1,64}) /', $content, $match) @@ -2276,7 +2283,7 @@ class Notice extends Managed_DataObject return null; } - static function maxContent() + public static function maxContent() { $contentlimit = common_config('notice', 'contentlimit'); // null => use global limit (distinct from 0!) @@ -2286,7 +2293,7 @@ class Notice extends Managed_DataObject return $contentlimit; } - static function contentTooLong($content) + public static function contentTooLong($content) { $contentlimit = self::maxContent(); return ($contentlimit > 0 && !empty($content) && (mb_strlen($content) > $contentlimit)); @@ -2301,15 +2308,17 @@ class Notice extends Managed_DataObject * * @throws Exception on failure or permission problems */ - function repeat(Profile $repeater, $source) + public function repeat(Profile $repeater, $source) { $author = $this->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(_('RT @%1$s %2$s'), - $author->getNickname(), - $this->content); + $content = sprintf( + _('RT @%1$s %2$s'), + $author->getNickname(), + $this->content + ); $maxlen = self::maxContent(); if ($maxlen > 0 && mb_strlen($content) > $maxlen) { @@ -2324,16 +2333,17 @@ class Notice extends Managed_DataObject // Scope is same as this one's - return self::saveNew($repeater->id, - $content, - $source, - array('repeat_of' => $this->id, - 'scope' => $this->scope)); + return self::saveNew( + $repeater->id, + $content, + $source, + ['repeat_of' => $this->id, 'scope' => $this->scope] + ); } // These are supposed to be in chron order! - function repeatStream($limit=100) + public function repeatStream($limit = 100) { $cache = Cache::instance(); @@ -2342,11 +2352,11 @@ class Notice extends Managed_DataObject } else { $idstr = $cache->get(Cache::key('notice:repeats:'.$this->id)); if ($idstr !== false) { - if (empty($idstr)) { - $ids = array(); - } else { - $ids = explode(',', $idstr); - } + if (!empty($idstr)) { + $ids = explode(',', $idstr); + } else { + $ids = []; + } } else { $ids = $this->_repeatStreamDirect(100); $cache->set(Cache::key('notice:repeats:'.$this->id), implode(',', $ids)); @@ -2360,7 +2370,7 @@ class Notice extends Managed_DataObject return NoticeStream::getStreamByIds($ids); } - function _repeatStreamDirect($limit) + public function _repeatStreamDirect($limit) { $notice = new Notice(); @@ -2378,7 +2388,7 @@ class Notice extends Managed_DataObject return $notice->fetchAll('id'); } - static function locationOptions($lat, $lon, $location_id, $location_ns, $profile = null) + public static function locationOptions($lat, $lon, $location_id, $location_ns, $profile = null) { $options = array(); @@ -2392,8 +2402,7 @@ class Notice extends Managed_DataObject $options['lat'] = $location->lat; $options['lon'] = $location->lon; } - - } else if (!empty($lat) && !empty($lon)) { + } elseif (!empty($lat) && !empty($lon)) { $options['lat'] = $lat; $options['lon'] = $lon; @@ -2403,7 +2412,7 @@ class Notice extends Managed_DataObject $options['location_id'] = $location->location_id; $options['location_ns'] = $location->location_ns; } - } else if (!empty($profile)) { + } elseif (!empty($profile)) { if (isset($profile->lat) && isset($profile->lon)) { $options['lat'] = $profile->lat; $options['lon'] = $profile->lon; @@ -2418,7 +2427,7 @@ class Notice extends Managed_DataObject return $options; } - function clearAttentions() + public function clearAttentions() { $att = new Attention(); $att->notice_id = $this->getID(); @@ -2432,7 +2441,7 @@ class Notice extends Managed_DataObject } } - function clearReplies() + public function clearReplies() { $replyNotice = new Notice(); $replyNotice->reply_to = $this->id; @@ -2453,7 +2462,7 @@ class Notice extends Managed_DataObject $reply->notice_id = $this->id; if ($reply->find()) { - while($reply->fetch()) { + while ($reply->fetch()) { self::blow('reply:stream:%d', $reply->profile_id); $reply->delete(); } @@ -2462,7 +2471,7 @@ class Notice extends Managed_DataObject $reply->free(); } - function clearLocation() + public function clearLocation() { $loc = new Notice_location(); $loc->notice_id = $this->id; @@ -2472,7 +2481,7 @@ class Notice extends Managed_DataObject } } - function clearFiles() + public function clearFiles() { $f2p = new File_to_post(); @@ -2487,7 +2496,7 @@ class Notice extends Managed_DataObject // ...and related (actual) files } - function clearRepeats() + public function clearRepeats() { $repeatNotice = new Notice(); $repeatNotice->repeat_of = $this->id; @@ -2503,7 +2512,7 @@ class Notice extends Managed_DataObject } } - function clearTags() + public function clearTags() { $tag = new Notice_tag(); $tag->notice_id = $this->id; @@ -2521,7 +2530,7 @@ class Notice extends Managed_DataObject $tag->free(); } - function clearGroupInboxes() + public function clearGroupInboxes() { $gi = new Group_inbox(); @@ -2537,7 +2546,7 @@ class Notice extends Managed_DataObject $gi->free(); } - function distribute() + public function distribute() { // We always insert for the author so they don't // have to wait @@ -2563,7 +2572,7 @@ class Notice extends Managed_DataObject } } - function insert() + public function insert() { $result = parent::insert(); @@ -2578,9 +2587,10 @@ class Notice extends Managed_DataObject if (!empty($this->repeat_of)) { $c = self::memcache(); if (!empty($c)) { - $ck = self::multicacheKey('Notice', - array('profile_id' => $this->profile_id, - 'repeat_of' => $this->repeat_of)); + $ck = self::multicacheKey( + 'Notice', + ['profile_id' => $this->profile_id, 'repeat_of' => $this->repeat_of] + ); $c->delete($ck); } } @@ -2593,10 +2603,14 @@ class Notice extends Managed_DataObject // We can only get here if it's a local notice, since remote notices // should've bailed out earlier due to lacking a URI. if (empty($this->uri)) { - $this->uri = sprintf('%s%s=%d:%s=%s', - TagURI::mint(), - 'noticeId', $this->id, - 'objectType', $this->getObjectType(true)); + $this->uri = sprintf( + '%s%s=%d:%s=%s', + TagURI::mint(), + 'noticeId', + $this->id, + 'objectType', + $this->getObjectType(true) + ); $changed = true; } @@ -2617,7 +2631,7 @@ class Notice extends Managed_DataObject * @return Notice_source $ns A notice source object. 'code' is the only attribute * guaranteed to be populated. */ - function getSource() + public function getSource() { if (empty($this->source)) { return false; @@ -2708,7 +2722,7 @@ class Notice extends Managed_DataObject return $tags; } - static private function utcDate($dt) + private static function utcDate($dt) { $dateStr = date('d F Y H:i:s', strtotime($dt)); $d = new DateTime($dateStr, new DateTimeZone('UTC')); @@ -2841,7 +2855,7 @@ class Notice extends Managed_DataObject * * @return boolean whether the profile is in the notice's scope */ - function inScope($profile) + public function inScope($profile) { if (is_null($profile)) { $keypart = sprintf('notice:in-scope-for:%d:null', $this->id); @@ -2889,7 +2903,6 @@ class Notice extends Managed_DataObject // Only for users mentioned in the notice if ($scope & Notice::ADDRESSEE_SCOPE) { - $reply = Reply::pkeyGet(array('notice_id' => $this->id, 'profile_id' => $profile->id)); @@ -2920,7 +2933,6 @@ class Notice extends Managed_DataObject } if ($scope & Notice::FOLLOWER_SCOPE || $this->getProfile()->isPrivateStream()) { - if (!Subscription::exists($profile, $this->getProfile())) { return false; } @@ -2929,15 +2941,15 @@ class Notice extends Managed_DataObject return !$this->isHiddenSpam($profile); } - function isHiddenSpam($profile) { + public function isHiddenSpam($profile) + { // Hide posts by silenced users from everyone but moderators. if (common_config('notice', 'hidespam')) { - try { $author = $this->getProfile(); - } catch(Exception $e) { + } catch (Exception $e) { // If we can't get an author, keep it hidden. // XXX: technically not spam, but, whatever. return true; @@ -2977,7 +2989,7 @@ class Notice extends Managed_DataObject // the timeline will not display correctly. try { $reply_to_id = self::getByID($this->reply_to); - } catch(Exception $e){ + } catch (Exception $e) { throw new NoParentNoticeException($this); } @@ -2994,106 +3006,103 @@ class Notice extends Managed_DataObject * @return array of variable names to include in serialization. */ - function __sleep() + public function __sleep() { $vars = parent::__sleep(); $skip = array('_profile', '_groups', '_attachments', '_faves', '_replies', '_repeats'); return array_diff($vars, $skip); } - static function defaultScope() + public static function defaultScope() { - $scope = common_config('notice', 'defaultscope'); - if (is_null($scope)) { - if (common_config('site', 'private')) { - $scope = 1; - } else { - $scope = 0; - } - } - return $scope; + $scope = common_config('notice', 'defaultscope'); + if (is_null($scope)) { + if (common_config('site', 'private')) { + $scope = 1; + } else { + $scope = 0; + } + } + return $scope; } - static function fillProfiles($notices) - { - $map = self::getProfiles($notices); - foreach ($notices as $entry=>$notice) { + public static function fillProfiles($notices) + { + $map = self::getProfiles($notices); + foreach ($notices as $entry => $notice) { try { - if (array_key_exists($notice->profile_id, $map)) { - $notice->_setProfile($map[$notice->profile_id]); - } + if (array_key_exists($notice->profile_id, $map)) { + $notice->_setProfile($map[$notice->profile_id]); + } } catch (NoProfileException $e) { common_log(LOG_WARNING, "Failed to fill profile in Notice with non-existing entry for profile_id: {$e->profile_id}"); unset($notices[$entry]); } - } + } - return array_values($map); - } - - static function getProfiles(&$notices) - { - $ids = array(); - foreach ($notices as $notice) { - $ids[] = $notice->profile_id; - } - $ids = array_unique($ids); - return Profile::pivotGet('id', $ids); - } - - static function fillGroups(&$notices) - { - $ids = self::_idsOf($notices); - $gis = Group_inbox::listGet('notice_id', $ids); - $gids = array(); - - foreach ($gis as $id => $gi) { - foreach ($gi as $g) - { - $gids[] = $g->group_id; - } - } - - $gids = array_unique($gids); - $group = User_group::pivotGet('id', $gids); - foreach ($notices as $notice) - { - $grps = array(); - $gi = $gis[$notice->id]; - foreach ($gi as $g) { - $grps[] = $group[$g->group_id]; - } - $notice->_setGroups($grps); - } - } - - static function _idsOf(array &$notices) - { - $ids = array(); - foreach ($notices as $notice) { - $ids[$notice->id] = true; - } - return array_keys($ids); + return array_values($map); } - static function fillAttachments(&$notices) + public static function getProfiles(&$notices) + { + $ids = []; + foreach ($notices as $notice) { + $ids[] = $notice->profile_id; + } + $ids = array_unique($ids); + return Profile::pivotGet('id', $ids); + } + + public static function fillGroups(&$notices) + { + $ids = self::_idsOf($notices); + $gis = Group_inbox::listGet('notice_id', $ids); + $gids = []; + + foreach ($gis as $id => $gi) { + foreach ($gi as $g) { + $gids[] = $g->group_id; + } + } + + $gids = array_unique($gids); + $group = User_group::pivotGet('id', $gids); + foreach ($notices as $notice) { + $grps = []; + $gi = $gis[$notice->id]; + foreach ($gi as $g) { + $grps[] = $group[$g->group_id]; + } + $notice->_setGroups($grps); + } + } + + public static function _idsOf(array &$notices) + { + $ids = []; + foreach ($notices as $notice) { + $ids[$notice->id] = true; + } + return array_keys($ids); + } + + public static function fillAttachments(&$notices) { $ids = self::_idsOf($notices); $f2pMap = File_to_post::listGet('post_id', $ids); - $fileIds = array(); - foreach ($f2pMap as $noticeId => $f2ps) { + $fileIds = []; + foreach ($f2pMap as $noticeId => $f2ps) { foreach ($f2ps as $f2p) { $fileIds[] = $f2p->file_id; } } $fileIds = array_unique($fileIds); - $fileMap = File::pivotGet('id', $fileIds); - foreach ($notices as $notice) - { - $files = array(); - $f2ps = $f2pMap[$notice->id]; - foreach ($f2ps as $f2p) { + $fileMap = File::pivotGet('id', $fileIds); + foreach ($notices as $notice) { + $files = []; + $f2ps = $f2pMap[$notice->id]; + foreach ($f2ps as $f2p) { if (!isset($fileMap[$f2p->file_id])) { // We have probably deleted value from fileMap since // it as a NULL entry (see the following elseif). @@ -3107,13 +3116,13 @@ class Notice extends Managed_DataObject unset($fileMap[$f2p->file_id]); continue; } - $files[] = $fileMap[$f2p->file_id]; - } - $notice->_setAttachments($files); - } + $files[] = $fileMap[$f2p->file_id]; + } + $notice->_setAttachments($files); + } } - static function fillReplies(&$notices) + public static function fillReplies(&$notices) { $ids = self::_idsOf($notices); $replyMap = Reply::listGet('notice_id', $ids); @@ -3127,7 +3136,7 @@ class Notice extends Managed_DataObject } } - static public function beforeSchemaUpdate() + public static function beforeSchemaUpdate() { $table = strtolower(get_called_class()); $schema = Schema::get(); @@ -3146,12 +3155,14 @@ class Notice extends Managed_DataObject echo "\nFound old $table table, moving location data to 'notice_location' table... (this will probably take a LONG time, but can be aborted and continued)"; $notice = new Notice(); - $notice->query(sprintf('SELECT id, lat, lon, location_id, location_ns FROM %1$s ' . - 'WHERE lat IS NOT NULL ' . - 'OR lon IS NOT NULL ' . - 'OR location_id IS NOT NULL ' . - 'OR location_ns IS NOT NULL', - $schema->quoteIdentifier($table))); + $notice->query(sprintf( + 'SELECT id, lat, lon, location_id, location_ns FROM %1$s ' . + 'WHERE lat IS NOT NULL ' . + 'OR lon IS NOT NULL ' . + 'OR location_id IS NOT NULL ' . + 'OR location_ns IS NOT NULL', + common_database_tablename($table) + )); print "\nFound {$notice->N} notices with location data, inserting"; while ($notice->fetch()) { $notloc = Notice_location::getKV('notice_id', $notice->id); @@ -3230,10 +3241,12 @@ class Notice extends Managed_DataObject } unset($notice); $notice = new Notice(); - $notice->query(sprintf('UPDATE %1$s SET %2$s=NULL WHERE id IN (%3$s)', - $notice->escapedTableName(), - $field, - implode(',', $ids))); + $notice->query(sprintf( + 'UPDATE %1$s SET %2$s = NULL WHERE id IN (%3$s)', + $notice->escapedTableName(), + $field, + implode(',', $ids) + )); break; default: throw new ServerException('The programmer sucks, invalid action name when fixing table.'); @@ -3245,11 +3258,13 @@ class Notice extends Managed_DataObject } } - public function delPref($namespace, $topic) { + public function delPref($namespace, $topic) + { return Notice_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 Notice_prefs::getData directly try { return Notice_prefs::getData($this, $namespace, $topic, $default); @@ -3264,7 +3279,8 @@ class Notice extends Managed_DataObject return Notice_prefs::getConfigData($this, $namespace, $topic); } - public function setPref($namespace, $topic, $data) { + public function setPref($namespace, $topic, $data) + { return Notice_prefs::setData($this, $namespace, $topic, $data); } } diff --git a/classes/Oauth_application_user.php b/classes/Oauth_application_user.php index 402afbc4c2..3fc64c7941 100644 --- a/classes/Oauth_application_user.php +++ b/classes/Oauth_application_user.php @@ -1,9 +1,26 @@ . + +defined('GNUSOCIAL') || die(); + +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + /** * Table Definition for oauth_application_user */ -require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; - class Oauth_application_user extends Managed_DataObject { ###START_AUTOCODE @@ -39,7 +56,7 @@ class Oauth_application_user extends Managed_DataObject ); } - static function getByUserAndToken($user, $token) + public static function getByUserAndToken($user, $token) { if (empty($user) || empty($token)) { return null; @@ -56,7 +73,7 @@ class Oauth_application_user extends Managed_DataObject return empty($result) ? null : $oau; } - function updateKeys(&$orig) + public function updateKeys(&$orig) { $this->_connect(); $parts = array(); @@ -72,13 +89,11 @@ class Oauth_application_user extends Managed_DataObject $toupdate = implode(', ', $parts); $table = $this->tableName(); - if(common_config('db','quote_identifiers')) { - $table = '"' . $table . '"'; - } - $qry = 'UPDATE ' . $table . ' SET ' . $toupdate . - ' WHERE profile_id = ' . $orig->profile_id - . ' AND application_id = ' . $orig->application_id - . " AND token = '$orig->token'"; + $tableName = $this->escapedTableName(); + $qry = 'UPDATE ' . $tableName . ' SET ' . $toupdate . + ' WHERE profile_id = ' . $orig->profile_id . + ' AND application_id = ' . $orig->application_id . + " AND token = '" . $orig->token . "'"; $orig->decache(); $result = $this->query($qry); if ($result) { diff --git a/classes/Profile_list.php b/classes/Profile_list.php index 8c9aa49d78..2a338f43c1 100644 --- a/classes/Profile_list.php +++ b/classes/Profile_list.php @@ -1,27 +1,28 @@ . + /** - * StatusNet - the distributed open-source microblogging tool - * - * 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 Notices - * @package StatusNet - * @author Shashi Gowda - * @license GNU Affero General Public License http://www.gnu.org/licenses/ + * @category Notices + * @package GNUsocial + * @author Shashi Gowda + * @copyright 2019 Free Software Foundation, Inc http://www.fsf.org + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ -if (!defined('GNUSOCIAL')) { exit(1); } +defined('GNUSOCIAL') || die(); class Profile_list extends Managed_DataObject { @@ -79,7 +80,7 @@ class Profile_list extends Managed_DataObject * @return Profile the tagger */ - function getTagger() + public function getTagger() { return Profile::getByID($this->tagger); } @@ -91,7 +92,7 @@ class Profile_list extends Managed_DataObject * @return String */ - function getBestName() + public function getBestName() { return $this->tag; } @@ -102,15 +103,17 @@ class Profile_list extends Managed_DataObject * @return String uri */ - function getUri() + public function getUri() { $uri = null; if (Event::handle('StartProfiletagGetUri', array($this, &$uri))) { if (!empty($this->uri)) { $uri = $this->uri; } else { - $uri = common_local_url('profiletagbyid', - array('id' => $this->id, 'tagger_id' => $this->tagger)); + $uri = common_local_url( + 'profiletagbyid', + ['id' => $this->id, 'tagger_id' => $this->tagger] + ); } } Event::handle('EndProfiletagGetUri', array($this, &$uri)); @@ -123,7 +126,7 @@ class Profile_list extends Managed_DataObject * @return String home url */ - function homeUrl() + public function homeUrl() { $url = null; if (Event::handle('StartUserPeopletagHomeUrl', array($this, &$url))) { @@ -131,9 +134,13 @@ class Profile_list extends Managed_DataObject if (!empty($this->mainpage)) { $url = $this->mainpage; } else { - $url = common_local_url('showprofiletag', - array('nickname' => $this->getTagger()->nickname, - 'tag' => $this->tag)); + $url = common_local_url( + 'showprofiletag', + [ + 'nickname' => $this->getTagger()->nickname, + 'tag' => $this->tag, + ] + ); } } Event::handle('EndUserPeopletagHomeUrl', array($this, &$url)); @@ -146,12 +153,14 @@ class Profile_list extends Managed_DataObject * @return String permalink */ - function permalink() + public function permalink() { $url = null; if (Event::handle('StartProfiletagPermalink', array($this, &$url))) { - $url = common_local_url('profiletagbyid', - array('id' => $this->id)); + $url = common_local_url( + 'profiletagbyid', + ['id' => $this->id] + ); } Event::handle('EndProfiletagPermalink', array($this, &$url)); return $url; @@ -169,7 +178,7 @@ class Profile_list extends Managed_DataObject * @return Notice the query */ - function getNotices($offset, $limit, $since_id=null, $max_id=null) + public function getNotices($offset, $limit, $since_id = null, $max_id = null) { // FIXME: Use something else than Profile::current() to avoid // possible confusion between session user and queue processing. @@ -190,7 +199,7 @@ class Profile_list extends Managed_DataObject * @return Profile results */ - function getSubscribers($offset=0, $limit=null, $since=0, $upto=0) + public function getSubscribers($offset = 0, $limit = null, $since = 0, $upto = 0) { $subs = new Profile(); @@ -227,24 +236,22 @@ class Profile_list extends Managed_DataObject * @return array ids of users */ - function getUserSubscribers() + public function getUserSubscribers() { // XXX: cache this $user = new User(); - if(common_config('db','quote_identifiers')) - $user_table = '"user"'; - else $user_table = 'user'; - $qry = - 'SELECT id ' . - 'FROM '. $user_table .' JOIN profile_tag_subscription '. - 'ON '. $user_table .'.id = profile_tag_subscription.profile_id ' . - 'WHERE profile_tag_subscription.profile_tag_id = %d '; + $user->query(sprintf( + 'SELECT id ' . + 'FROM %1$s INNER JOIN profile_tag_subscription ' . + 'ON %1$s.id = profile_tag_subscription.profile_id ' . + 'WHERE profile_tag_subscription.profile_tag_id = %2$d ', + $user->escapedTableName(), + $this->id + )); - $user->query(sprintf($qry, $this->id)); - - $ids = array(); + $ids = []; while ($user->fetch()) { $ids[] = $user->id; @@ -264,7 +271,7 @@ class Profile_list extends Managed_DataObject * @return boolean subscription status */ - function hasSubscriber($id) + public function hasSubscriber($id) { if (!is_numeric($id)) { $id = $id->id; @@ -288,7 +295,7 @@ class Profile_list extends Managed_DataObject * @return Profile results */ - function getTagged($offset=0, $limit=null, $since=0, $upto=0) + public function getTagged($offset = 0, $limit = null, $since = 0, $upto = 0) { $tagged = new Profile(); $tagged->joinAdd(array('id', 'profile_tag:tagged')); @@ -323,7 +330,7 @@ class Profile_list extends Managed_DataObject * @return boolean success */ - function delete($useWhere=false) + public function delete($useWhere = false) { // force delete one item at a time. if (empty($this->id)) { @@ -350,7 +357,7 @@ class Profile_list extends Managed_DataObject * @return boolean success */ - function update($dataObject=false) + public function update($dataObject = false) { if (!is_object($dataObject) && !$dataObject instanceof Profile_list) { return parent::update($dataObject); @@ -361,9 +368,9 @@ class Profile_list extends Managed_DataObject // if original tag was different // check to see if the new tag already exists // if not, rename the tag correctly - if($dataObject->tag != $this->tag || $dataObject->tagger != $this->tagger) { + if ($dataObject->tag != $this->tag || $dataObject->tagger != $this->tagger) { $existing = Profile_list::getByTaggerAndTag($this->tagger, $this->tag); - if(!empty($existing)) { + if (!empty($existing)) { // TRANS: Server exception. throw new ServerException(_('The tag you are trying to rename ' . 'to already exists.')); @@ -382,7 +389,7 @@ class Profile_list extends Managed_DataObject * @return string atom author element */ - function asAtomAuthor() + public function asAtomAuthor() { $xs = new XMLStringer(true); @@ -404,7 +411,7 @@ class Profile_list extends Managed_DataObject * @return string activitystreams noun */ - function asActivityNoun($element) + public function asActivityNoun($element) { $noun = ActivityObject::fromPeopletag($this); return $noun->asString('activity:' . $element); @@ -419,11 +426,13 @@ class Profile_list extends Managed_DataObject * @return integer count */ - function taggedCount($recount=false) + public function taggedCount($recount = false) { - $keypart = sprintf('profile_list:tagged_count:%d:%s', - $this->tagger, - $this->tag); + $keypart = sprintf( + 'profile_list:tagged_count:%d:%s', + $this->tagger, + $this->tag + ); $count = self::cacheGet($keypart); @@ -450,15 +459,16 @@ class Profile_list extends Managed_DataObject * @return integer count */ - function subscriberCount($recount=false) + public function subscriberCount($recount = false) { - $keypart = sprintf('profile_list:subscriber_count:%d', - $this->id); + $keypart = sprintf( + 'profile_list:subscriber_count:%d', + $this->id + ); $count = self::cacheGet($keypart); if ($count === false) { - $sub = new Profile_tag_subscription(); $sub->profile_tag_id = $this->id; $count = (int) $sub->count('distinct profile_id'); @@ -478,7 +488,7 @@ class Profile_list extends Managed_DataObject * @return integer count */ - function blowNoticeStreamCache($all=false) + public function blowNoticeStreamCache($all = false) { self::blow('profile_list:notice_ids:%d', $this->id); if ($all) { @@ -496,7 +506,7 @@ class Profile_list extends Managed_DataObject * @return integer count */ - static function getByTaggerAndTag($tagger, $tag) + public static function getByTaggerAndTag($tagger, $tag) { $ptag = Profile_list::pkeyGet(array('tagger' => $tagger, 'tag' => $tag)); return $ptag; @@ -514,11 +524,11 @@ class Profile_list extends Managed_DataObject * @return Profile_list the people tag object */ - static function ensureTag($tagger, $tag, $description=null, $private=false) + public static function ensureTag($tagger, $tag, $description = null, $private = false) { $ptag = Profile_list::getByTaggerAndTag($tagger, $tag); - if(empty($ptag->id)) { + if (empty($ptag->id)) { $args = array( 'tag' => $tag, 'tagger' => $tagger, @@ -544,7 +554,7 @@ class Profile_list extends Managed_DataObject * @return integer maximum number of characters */ - static function maxDescription() + public static function maxDescription() { $desclimit = common_config('peopletag', 'desclimit'); // null => use global limit (distinct from 0!) @@ -563,7 +573,7 @@ class Profile_list extends Managed_DataObject * @return boolean is the descripition too long? */ - static function descriptionTooLong($desc) + public static function descriptionTooLong($desc) { $desclimit = self::maxDescription(); return ($desclimit > 0 && !empty($desc) && (mb_strlen($desc) > $desclimit)); @@ -578,7 +588,8 @@ class Profile_list extends Managed_DataObject * * @return mixed Profile_list on success, false on fail */ - static function saveNew(array $fields) { + public static function saveNew(array $fields) + { extract($fields); $ptag = new Profile_list(); @@ -639,7 +650,7 @@ class Profile_list extends Managed_DataObject $result = $ptag->update($orig); if (!$result) { common_log_db_error($ptag, 'UPDATE', __FILE__); - // TRANS: Server exception saving new tag. + // TRANS: Server exception saving new tag. throw new ServerException(_('Could not set profile tag URI.')); } } @@ -647,7 +658,7 @@ class Profile_list extends Managed_DataObject if (!isset($mainpage) || empty($mainpage)) { $orig = clone($ptag); $user = User::getKV('id', $ptag->tagger); - if(!empty($user)) { + if (!empty($user)) { $ptag->mainpage = common_local_url('showprofiletag', array('tag' => $ptag->tag, 'nickname' => $user->getNickname())); } else { $ptag->mainpage = $uri; // assume this is a remote peopletag and the uri works @@ -687,9 +698,9 @@ class Profile_list extends Managed_DataObject * @returns array (array (mixed items), int next_cursor, int previous_cursor) */ - // XXX: This should be in Memcached_DataObject... eventually. + // XXX: This should be in Memcached_DataObject... eventually - static function getAtCursor($fn, array $args, $cursor, $count=20) + public static function getAtCursor($fn, array $args, $cursor, $count = 20) { $items = array(); @@ -698,12 +709,12 @@ class Profile_list extends Managed_DataObject $next_cursor = 0; $prev_cursor = 0; - if($cursor > 0) { + if ($cursor > 0) { // if cursor is +ve fetch $count+2 items before cursor starting at cursor $max_id = $cursor; $fn_args = array_merge($args, array(0, $count+2, 0, $max_id)); $list = call_user_func_array($fn, $fn_args); - while($list->fetch()) { + while ($list->fetch()) { $items[] = clone($list); } @@ -734,15 +745,14 @@ class Profile_list extends Managed_DataObject $next_cursor = isset($next->cursor) ? $items[$count-1]->cursor : $items[$count-1]->id; } - - } else if($cursor < -1) { + } elseif ($cursor < -1) { // if cursor is -ve fetch $count+2 items created after -$cursor-1 $cursor = abs($cursor); $since_id = $cursor-1; $fn_args = array_merge($args, array(0, $count+2, $since_id)); $list = call_user_func_array($fn, $fn_args); - while($list->fetch()) { + while ($list->fetch()) { $items[] = clone($list); } @@ -755,7 +765,10 @@ class Profile_list extends Managed_DataObject } else { $next_cursor = isset($items[$end]->cursor) ? $items[$end]->cursor : $items[$end]->id; - if ($end > $count) array_pop($items); // excess item. + if ($end > $count) { + // excess item + array_pop($items); + } // check if there are more items for next page $fn_args = array_merge($args, array(0, 1, 0, $cursor)); @@ -771,23 +784,22 @@ class Profile_list extends Managed_DataObject $prev_cursor = isset($prev->cursor) ? -$items[0]->cursor : -$items[0]->id; } - } else if($cursor == -1) { + } elseif ($cursor == -1) { $fn_args = array_merge($args, array(0, $count+1)); $list = call_user_func_array($fn, $fn_args); - while($list->fetch()) { + while ($list->fetch()) { $items[] = clone($list); } if (count($items)==$count+1) { $next = array_pop($items); - if(isset($next->cursor)) { + if (isset($next->cursor)) { $next_cursor = $items[$count-1]->cursor; } else { $next_cursor = $items[$count-1]->id; } } - } return array($items, $next_cursor, $prev_cursor); } @@ -803,7 +815,8 @@ class Profile_list extends Managed_DataObject * @return boolean success */ - static function setCache($ckey, &$tag, $offset=0, $limit=null) { + public static function setCache($ckey, &$tag, $offset = 0, $limit = null) + { $cache = Cache::instance(); if (empty($cache)) { return false; @@ -834,8 +847,8 @@ class Profile_list extends Managed_DataObject * @return Profile_list results */ - static function getCached($ckey, $offset=0, $limit=null) { - + public static function getCached($ckey, $offset = 0, $limit = null) + { $keys_str = self::cacheGet($ckey); if ($keys_str === false) { return false; @@ -862,7 +875,8 @@ class Profile_list extends Managed_DataObject * @return Profile_list results */ - static function getByKeys(array $keys) { + public static function getByKeys(array $keys) + { $cache = Cache::instance(); if (!empty($cache)) { @@ -910,7 +924,7 @@ class Profile_list extends Managed_DataObject } } - function insert() + public function insert() { $result = parent::insert(); if ($result) { diff --git a/classes/User.php b/classes/User.php index 7774ef53ca..40e0d71874 100644 --- a/classes/User.php +++ b/classes/User.php @@ -1,23 +1,20 @@ . - */ +// 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 . -if (!defined('GNUSOCIAL')) { exit(1); } +defined('GNUSOCIAL') || die(); /** * Table Definition for user @@ -144,7 +141,7 @@ class User extends Managed_DataObject return $this->getProfile()->getNickname(); } - static function getByNickname($nickname) + public static function getByNickname($nickname) { $user = User::getKV('nickname', $nickname); if (!$user instanceof User) { @@ -154,12 +151,12 @@ class User extends Managed_DataObject return $user; } - function isSubscribed(Profile $other) + public function isSubscribed(Profile $other) { return $this->getProfile()->isSubscribed($other); } - function hasPendingSubscription(Profile $other) + public function hasPendingSubscription(Profile $other) { return $this->getProfile()->hasPendingSubscription($other); } @@ -169,17 +166,17 @@ class User extends Managed_DataObject * * @return mixed Notice or null */ - function getCurrentNotice() + public function getCurrentNotice() { return $this->getProfile()->getCurrentNotice(); } - function getCarrier() + public function getCarrier() { return Sms_carrier::getKV('id', $this->carrier); } - function hasBlocked(Profile $other) + public function hasBlocked(Profile $other) { return $this->getProfile()->hasBlocked($other); } @@ -206,10 +203,9 @@ class User extends Managed_DataObject * @return User object * @throws Exception on failure */ - static function register(array $fields, $accept_email_fail=false) { - + public static function register(array $fields, $accept_email_fail = false) + { // MAGICALLY put fields into current scope - extract($fields); $profile = new Profile(); @@ -262,7 +258,7 @@ class User extends Managed_DataObject } } - if(isset($email_confirmed) && $email_confirmed) { + if (isset($email_confirmed) && $email_confirmed) { $user->email = $email; } @@ -278,7 +274,6 @@ class User extends Managed_DataObject $user->created = common_sql_now(); if (Event::handle('StartUserRegister', array($profile))) { - $profile->query('BEGIN'); $id = $profile->insert(); @@ -291,7 +286,7 @@ class User extends Managed_DataObject // Necessary because id has been known to be reissued. if ($profile->hasRole(Profile_role::DELETED)) { - $profile->revokeRole(Profile_role::DELETED); + $profile->revokeRole(Profile_role::DELETED); } $user->id = $id; @@ -367,8 +362,11 @@ class User extends Managed_DataObject if (!empty($defnick)) { $defuser = User::getKV('nickname', $defnick); if (empty($defuser)) { - common_log(LOG_WARNING, sprintf("Default user %s does not exist.", $defnick), - __FILE__); + common_log( + LOG_WARNING, + sprintf('Default user %s does not exist.', $defnick), + __FILE__ + ); } else { Subscription::ensureStart($profile, $defuser->getProfile()); } @@ -394,16 +392,23 @@ class User extends Managed_DataObject if (!empty($welcome)) { $welcomeuser = User::getKV('nickname', $welcome); if (empty($welcomeuser)) { - common_log(LOG_WARNING, sprintf("Welcome user %s does not exist.", $defnick), - __FILE__); + common_log( + LOG_WARNING, + sprintf('Welcome user %s does not exist.', $defnick), + __FILE__ + ); } else { - $notice = Notice::saveNew($welcomeuser->id, - // TRANS: Notice given on user registration. - // TRANS: %1$s is the sitename, $2$s is the registering user's nickname. - sprintf(_('Welcome to %1$s, @%2$s!'), - common_config('site', 'name'), - $profile->getNickname()), - 'system'); + $notice = Notice::saveNew( + $welcomeuser->id, + // TRANS: Notice given on user registration. + // TRANS: %1$s is the sitename, $2$s is the registering user's nickname. + sprintf( + _('Welcome to %1$s, @%2$s!'), + common_config('site', 'name'), + $profile->getNickname() + ), + 'system' + ); } } @@ -418,9 +423,8 @@ class User extends Managed_DataObject } // Things we do when the email changes - function emailChanged() + public function emailChanged() { - $invites = new Invitation(); $invites->address = $this->email; $invites->address_type = 'email'; @@ -441,48 +445,53 @@ class User extends Managed_DataObject } } - function mutuallySubscribed(Profile $other) + public function mutuallySubscribed(Profile $other) { return $this->getProfile()->mutuallySubscribed($other); } - function mutuallySubscribedUsers() + public function mutuallySubscribedUsers() { - // 3-way join; probably should get cached - $UT = common_config('db','type')=='pgsql'?'"user"':'user'; - $qry = "SELECT $UT.* " . - "FROM subscription sub1 JOIN $UT ON sub1.subscribed = $UT.id " . - "JOIN subscription sub2 ON $UT.id = sub2.subscriber " . - 'WHERE sub1.subscriber = %d and sub2.subscribed = %d ' . - "ORDER BY $UT.nickname"; $user = new User(); - $user->query(sprintf($qry, $this->id, $this->id)); + + // 3-way join; probably should get cached + $user->query(sprintf( + 'SELECT %1$s.* ' . + 'FROM subscription AS sub1 INNER JOIN %1$s ON sub1.subscribed = %1$s.id ' . + 'INNER JOIN subscription AS sub2 ON %1$s.id = sub2.subscriber ' . + 'WHERE sub1.subscriber = %2$d AND sub2.subscribed = %2$d ' . + 'ORDER BY %1$s.nickname', + $user->escapedTableName(), + $this->id + )); return $user; } - 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 $this->getProfile()->getReplies($offset, $limit, $since_id, $before_id); } - function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) { + public function getTaggedNotices($tag, $offset = 0, $limit = NOTICES_PER_PAGE, $since_id = 0, $before_id = 0) + { return $this->getProfile()->getTaggedNotices($tag, $offset, $limit, $since_id, $before_id); } - function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) + public function getNotices($offset = 0, $limit = NOTICES_PER_PAGE, $since_id = 0, $before_id = 0) { return $this->getProfile()->getNotices($offset, $limit, $since_id, $before_id); } - function block(Profile $other) + public function block(Profile $other) { // Add a new block record // no blocking (and thus unsubbing from) yourself if ($this->id == $other->id) { - common_log(LOG_WARNING, + common_log( + LOG_WARNING, sprintf( "Profile ID %d (%s) tried to block themself.", $this->id, @@ -521,7 +530,7 @@ class User extends Managed_DataObject return true; } - function unblock(Profile $other) + public function unblock(Profile $other) { // Get the block record @@ -541,17 +550,17 @@ class User extends Managed_DataObject return true; } - function isMember(User_group $group) + public function isMember(User_group $group) { return $this->getProfile()->isMember($group); } - function isAdmin(User_group $group) + public function isAdmin(User_group $group) { return $this->getProfile()->isAdmin($group); } - function getGroups($offset=0, $limit=null) + public function getGroups($offset = 0, $limit = null) { return $this->getProfile()->getGroups($offset, $limit); } @@ -563,7 +572,7 @@ class User extends Managed_DataObject * @param User_group $group * @return Group_member */ - function joinGroup(User_group $group) + public function joinGroup(User_group $group) { return $this->getProfile()->joinGroup($group); } @@ -573,37 +582,37 @@ class User extends Managed_DataObject * * @param User_group $group */ - function leaveGroup(User_group $group) + public function leaveGroup(User_group $group) { return $this->getProfile()->leaveGroup($group); } - function getSubscribed($offset=0, $limit=null) + public function getSubscribed($offset = 0, $limit = null) { return $this->getProfile()->getSubscribed($offset, $limit); } - function getSubscribers($offset=0, $limit=null) + public function getSubscribers($offset = 0, $limit = null) { return $this->getProfile()->getSubscribers($offset, $limit); } - function getTaggedSubscribers($tag, $offset=0, $limit=null) + public function getTaggedSubscribers($tag, $offset = 0, $limit = null) { return $this->getProfile()->getTaggedSubscribers($tag, $offset, $limit); } - function getTaggedSubscriptions($tag, $offset=0, $limit=null) + public function getTaggedSubscriptions($tag, $offset = 0, $limit = null) { return $this->getProfile()->getTaggedSubscriptions($tag, $offset, $limit); } - function hasRight($right) + public function hasRight($right) { return $this->getProfile()->hasRight($right); } - function delete($useWhere=false) + public function delete($useWhere = false) { if (empty($this->id)) { common_log(LOG_WARNING, "Ambiguous User->delete(); skipping related tables."); @@ -640,14 +649,14 @@ class User extends Managed_DataObject return parent::delete($useWhere); } - function _deleteTags() + public function _deleteTags() { $tag = new Profile_tag(); $tag->tagger = $this->id; $tag->delete(); } - function _deleteBlocks() + public function _deleteBlocks() { $block = new Profile_block(); $block->blocker = $this->id; @@ -655,32 +664,32 @@ class User extends Managed_DataObject // XXX delete group block? Reset blocker? } - function hasRole($name) + public function hasRole($name) { return $this->getProfile()->hasRole($name); } - function grantRole($name) + public function grantRole($name) { return $this->getProfile()->grantRole($name); } - function revokeRole($name) + public function revokeRole($name) { return $this->getProfile()->revokeRole($name); } - function isSandboxed() + public function isSandboxed() { return $this->getProfile()->isSandboxed(); } - function isSilenced() + public function isSilenced() { return $this->getProfile()->isSilenced(); } - function receivesEmailNotifications() + public function receivesEmailNotifications() { // We could do this in one large if statement, but that's not as easy to read // Don't send notifications if we don't know the user's email address or it is @@ -695,7 +704,7 @@ class User extends Managed_DataObject return true; } - function repeatedByMe($offset=0, $limit=20, $since_id=null, $max_id=null) + public function repeatedByMe($offset = 0, $limit = 20, $since_id = null, $max_id = null) { // FIXME: Use another way to get Profile::current() since we // want to avoid confusion between session user and queue processing. @@ -704,7 +713,7 @@ class User extends Managed_DataObject } - function repeatsOfMe($offset=0, $limit=20, $since_id=null, $max_id=null) + public function repeatsOfMe($offset = 0, $limit = 20, $since_id = null, $max_id = null) { // FIXME: Use another way to get Profile::current() since we // want to avoid confusion between session user and queue processing. @@ -712,7 +721,7 @@ class User extends Managed_DataObject return $stream->getNotices($offset, $limit, $since_id, $max_id); } - public function repeatedToMe($offset=0, $limit=20, $since_id=null, $max_id=null) + public function repeatedToMe($offset = 0, $limit = 20, $since_id = null, $max_id = null) { return $this->getProfile()->repeatedToMe($offset, $limit, $since_id, $max_id); } @@ -791,7 +800,7 @@ class User extends Managed_DataObject * @throws ServerException if no valid single user account is present * @throws ServerException if called when not in single-user mode */ - static function singleUserNickname() + public static function singleUserNickname() { try { $user = User::singleUser(); @@ -828,7 +837,7 @@ class User extends Managed_DataObject * Get a list of OAuth client applications that have access to this * user's account. */ - function getConnectedApps($offset = 0, $limit = null) + public function getConnectedApps($offset = 0, $limit = null) { $qry = 'SELECT u.* ' . @@ -863,14 +872,14 @@ class User extends Managed_DataObject * @return array of variable names to include in serialization. */ - function __sleep() + public function __sleep() { $vars = parent::__sleep(); $skip = array('_profile'); return array_diff($vars, $skip); } - static function recoverPassword($nore) + public static function recoverPassword($nore) { require_once INSTALLDIR . '/lib/util/mail.php'; @@ -943,7 +952,7 @@ class User extends Managed_DataObject throw new ServerException(_('Error saving address confirmation.')); } - // @todo FIXME: needs i18n. + // @todo FIXME: needs i18n. $body = "Hey, $user->nickname."; $body .= "\n\n"; $body .= 'Someone just asked for a new password ' . @@ -951,8 +960,10 @@ class User extends Managed_DataObject $body .= "\n\n"; $body .= 'If it was you, and you want to confirm, use the URL below:'; $body .= "\n\n"; - $body .= "\t".common_local_url('recoverpassword', - array('code' => $confirm->code)); + $body .= "\t" . common_local_url( + 'recoverpassword', + ['code' => $confirm->code] + ); $body .= "\n\n"; $body .= 'If not, just ignore this message.'; $body .= "\n\n"; @@ -966,7 +977,7 @@ class User extends Managed_DataObject mail_to_user($user, _('Password recovery requested'), $body, $headers, $confirm->address); } - function streamModeOnly() + public function streamModeOnly() { if (common_config('oldschool', 'enabled')) { $osp = Old_school_prefs::getKV('user_id', $this->id); @@ -978,7 +989,7 @@ class User extends Managed_DataObject return false; } - function streamNicknames() + public function streamNicknames() { if (common_config('oldschool', 'enabled')) { $osp = Old_school_prefs::getKV('user_id', $this->id); @@ -989,7 +1000,7 @@ class User extends Managed_DataObject return false; } - function registrationActivity() + public function registrationActivity() { $profile = $this->getProfile(); @@ -1007,16 +1018,20 @@ class User extends Managed_DataObject $act->objects[] = $service; - $act->id = TagURI::mint('user:register:%d', - $this->id); + $act->id = TagURI::mint( + 'user:register:%d', + $this->id + ); $act->time = strtotime($this->created); $act->title = _("Register"); - $act->content = sprintf(_('%1$s joined %2$s.'), - $profile->getBestName(), - $service->title); + $act->content = sprintf( + _('%1$s joined %2$s.'), + $profile->getBestName(), + $service->title + ); return $act; } diff --git a/classes/User_group.php b/classes/User_group.php index 21a1068616..80a1160a27 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -1,8 +1,24 @@ . + +defined('GNUSOCIAL') || die(); + /** * Table Definition for user_group */ - class User_group extends Managed_DataObject { const JOIN_POLICY_OPEN = 0; @@ -63,7 +79,7 @@ class User_group extends Managed_DataObject 'uri' => array('type' => 'varchar', 'length' => 191, 'description' => 'universal identifier'), 'mainpage' => array('type' => 'varchar', 'length' => 191, 'description' => 'page for group info to link to'), - 'join_policy' => array('type' => 'int', 'size' => 'tiny', 'description' => '0=open; 1=requires admin approval'), + 'join_policy' => array('type' => 'int', 'size' => 'tiny', 'description' => '0=open; 1=requires admin approval'), 'force_scope' => array('type' => 'int', 'size' => 'tiny', 'description' => '0=never,1=sometimes,-1=always'), ), 'primary key' => array('id'), @@ -118,40 +134,38 @@ class User_group extends Managed_DataObject return Theme::path('default-avatar-'.$sizenames[$size].'.png'); } - function homeUrl() + public function homeUrl() { return $this->getProfile()->getUrl(); } - function getUri() + public function getUri() { $uri = null; if (Event::handle('StartUserGroupGetUri', array($this, &$uri))) { if (!empty($this->uri)) { $uri = $this->uri; } elseif ($this->isLocal()) { - $uri = common_local_url('groupbyid', - array('id' => $this->id)); + $uri = common_local_url('groupbyid', ['id' => $this->id]); } } Event::handle('EndUserGroupGetUri', array($this, &$uri)); return $uri; } - function permalink() + public function permalink() { $url = null; if (Event::handle('StartUserGroupPermalink', array($this, &$url))) { if ($this->isLocal()) { - $url = common_local_url('groupbyid', - array('id' => $this->id)); + $url = common_local_url('groupbyid', ['id' => $this->id]); } } Event::handle('EndUserGroupPermalink', array($this, &$url)); return $url; } - function getNotices($offset, $limit, $since_id=null, $max_id=null) + public function getNotices($offset, $limit, $since_id = null, $max_id = null) { // FIXME: Get the Profile::current() some other way, to avoid // possible confusion between current session and queue process. @@ -160,29 +174,26 @@ class User_group extends Managed_DataObject return $stream->getNotices($offset, $limit, $since_id, $max_id); } - function getMembers($offset=0, $limit=null) { + public function getMembers($offset = 0, $limit = null) + { $ids = null; if (is_null($limit) || $offset + $limit > User_group::CACHE_WINDOW) { - $ids = $this->getMemberIDs($offset, - $limit); + $ids = $this->getMemberIDs($offset, $limit); } else { $key = sprintf('group:member_ids:%d', $this->id); $window = self::cacheGet($key); if ($window === false) { - $window = $this->getMemberIDs(0, - User_group::CACHE_WINDOW); + $window = $this->getMemberIDs(0, User_group::CACHE_WINDOW); self::cacheSet($key, $window); } - $ids = array_slice($window, - $offset, - $limit); + $ids = array_slice($window, $offset, $limit); } return Profile::multiGet('id', $ids); } - function getMemberIDs($offset=0, $limit=null) + public function getMemberIDs($offset = 0, $limit = null) { $gm = new Group_member(); @@ -215,7 +226,7 @@ class User_group extends Managed_DataObject * @param int $limit * @return Profile */ - function getRequests($offset=0, $limit=null) + public function getRequests($offset = 0, $limit = null) { $rq = new Group_join_queue(); $rq->group_id = $this->id; @@ -264,7 +275,7 @@ class User_group extends Managed_DataObject return $cnt; } - function getBlockedCount() + public function getBlockedCount() { // XXX: WORM cache this @@ -274,7 +285,7 @@ class User_group extends Managed_DataObject return $block->count(); } - function getQueueCount() + public function getQueueCount() { // XXX: WORM cache this @@ -284,7 +295,8 @@ class User_group extends Managed_DataObject return $queue->count(); } - function getAdmins($offset=null, $limit=null) // offset is null because DataObject wants it, 0 would mean no results + // offset is null because DataObject wants it, 0 would mean no results + public function getAdmins($offset = null, $limit = null) { $admins = new Profile(); $admins->joinAdd(array('id', 'group_member:profile_id')); @@ -296,7 +308,8 @@ class User_group extends Managed_DataObject return $admins; } - function getBlocked($offset=null, $limit=null) // offset is null because DataObject wants it, 0 would mean no results + // offset is null because DataObject wants it, 0 would mean no results + public function getBlocked($offset = null, $limit = null) { $blocked = new Profile(); $blocked->joinAdd(array('id', 'group_block:blocked')); @@ -308,7 +321,7 @@ class User_group extends Managed_DataObject return $blocked; } - function setOriginal($filename) + public function setOriginal($filename) { // This should be handled by the Profile->setOriginal function so user and group avatars are handled the same $imagefile = new ImageFile(null, Avatar::path($filename)); @@ -320,8 +333,12 @@ class User_group extends Managed_DataObject $orig = clone($this); $this->original_logo = Avatar::url($filename); foreach ($sizes as $name=>$size) { - $filename = Avatar::filename($this->profile_id, image_type_to_extension($imagefile->preferredType()), - $size, common_timestamp()); + $filename = Avatar::filename( + $this->profile_id, + image_type_to_extension($imagefile->preferredType()), + $size, + common_timestamp() + ); $imagefile->resizeTo(Avatar::path($filename), array('width'=>$size, 'height'=>$size)); $this->$name = Avatar::url($filename); } @@ -329,7 +346,7 @@ class User_group extends Managed_DataObject return $this->update($orig); } - function getBestName() + public function getBestName() { return ($this->fullname) ? $this->fullname : $this->nickname; } @@ -340,17 +357,17 @@ class User_group extends Managed_DataObject * * @return string */ - function getFancyName() + public function getFancyName() { if ($this->fullname) { // TRANS: Full name of a profile or group followed by nickname in parens - return sprintf(_m('FANCYNAME','%1$s (%2$s)'), $this->fullname, $this->nickname); + return sprintf(_m('FANCYNAME', '%1$s (%2$s)'), $this->fullname, $this->nickname); } else { return $this->nickname; } } - function getAliases() + public function getAliases() { $aliases = array(); @@ -371,8 +388,8 @@ class User_group extends Managed_DataObject return $aliases; } - function setAliases($newaliases) { - + public function setAliases($newaliases) + { $newaliases = array_unique($newaliases); $oldaliases = $this->getAliases(); @@ -413,7 +430,7 @@ class User_group extends Managed_DataObject return true; } - static function getForNickname($nickname, Profile $profile=null) + public static function getForNickname($nickname, Profile $profile = null) { $nickname = Nickname::normalize($nickname); @@ -440,24 +457,21 @@ class User_group extends Managed_DataObject return null; } - function getUserMembers() + public function getUserMembers() { // XXX: cache this $user = new User(); - if(common_config('db','quote_identifiers')) - $user_table = '"user"'; - else $user_table = 'user'; - $qry = - 'SELECT id ' . - 'FROM '. $user_table .' JOIN group_member '. - 'ON '. $user_table .'.id = group_member.profile_id ' . - 'WHERE group_member.group_id = %d '; + $user->query(sprintf( + 'SELECT id FROM %1$s INNER JOIN group_member ' . + 'ON %1$s.id = group_member.profile_id ' . + 'WHERE group_member.group_id = %2$d ', + $user->escapedTableName(), + $this->id + )); - $user->query(sprintf($qry, $this->id)); - - $ids = array(); + $ids = []; while ($user->fetch()) { $ids[] = $user->id; @@ -468,7 +482,7 @@ class User_group extends Managed_DataObject return $ids; } - static function maxDescription() + public static function maxDescription() { $desclimit = common_config('group', 'desclimit'); // null => use global limit (distinct from 0!) @@ -478,13 +492,13 @@ class User_group extends Managed_DataObject return $desclimit; } - static function descriptionTooLong($desc) + public static function descriptionTooLong($desc) { $desclimit = self::maxDescription(); return ($desclimit > 0 && !empty($desc) && (mb_strlen($desc) > $desclimit)); } - function asAtomEntry($namespace=false, $source=false) + public function asAtomEntry($namespace = false, $source = false) { $xs = new XMLStringer(true); @@ -528,7 +542,7 @@ class User_group extends Managed_DataObject return $xs->getString(); } - function asAtomAuthor() + public function asAtomAuthor() { $xs = new XMLStringer(true); @@ -551,20 +565,21 @@ class User_group extends Managed_DataObject * * @return string */ - function asActivityNoun($element) + public function asActivityNoun($element) { $noun = ActivityObject::fromGroup($this); return $noun->asString('activity:' . $element); } - function getAvatar() + public function getAvatar() { return empty($this->homepage_logo) ? User_group::defaultLogo(AVATAR_PROFILE_SIZE) : $this->homepage_logo; } - static function register($fields) { + public static function register($fields) + { if (!empty($fields['userid'])) { $profile = Profile::getKV('id', $fields['userid']); if ($profile && !$profile->hasRight(Right::CREATEGROUP)) { @@ -580,18 +595,20 @@ class User_group extends Managed_DataObject // MAGICALLY put fields into current scope // @fixme kill extract(); it makes debugging absurdly hard - $defaults = array('nickname' => null, - 'fullname' => null, - 'homepage' => null, - 'description' => null, - 'location' => null, - 'uri' => null, - 'mainpage' => null, - 'aliases' => array(), - 'userid' => null); - - $fields = array_merge($defaults, $fields); - + $defaults = [ + 'nickname' => null, + 'fullname' => null, + 'homepage' => null, + 'description' => null, + 'location' => null, + 'uri' => null, + 'mainpage' => null, + 'aliases' => [], + 'userid' => null, + ]; + + $fields = array_merge($defaults, $fields); + extract($fields); $group = new User_group(); @@ -645,7 +662,6 @@ class User_group extends Managed_DataObject } if (Event::handle('StartGroupSave', array(&$group))) { - $result = $group->insert(); if ($result === false) { @@ -721,7 +737,7 @@ class User_group extends Managed_DataObject * are not de-cached in the UI, including the sidebar lists on * GroupsAction */ - function delete($useWhere=false) + public function delete($useWhere = false) { if (empty($this->id)) { common_log(LOG_WARNING, "Ambiguous User_group->delete(); skipping related tables."); @@ -813,7 +829,7 @@ class User_group extends Managed_DataObject return parent::update($dataObject); } - function isPrivate() + public function isPrivate() { return ($this->join_policy == self::JOIN_POLICY_MODERATE && intval($this->force_scope) === 1); @@ -825,14 +841,16 @@ class User_group extends Managed_DataObject return ($local instanceof Local_group); } - static function groupsFromText($text, Profile $profile) + public static function groupsFromText($text, Profile $profile) { $groups = array(); /* extract all !group */ - $count = preg_match_all('/(?:^|\s)!(' . Nickname::DISPLAY_FMT . ')/', - strtolower($text), - $match); + $count = preg_match_all( + '/(?:^|\s)!(' . Nickname::DISPLAY_FMT . ')/', + strtolower($text), + $match + ); if (!$count) { return $groups; @@ -848,7 +866,7 @@ class User_group extends Managed_DataObject return $groups; } - static function idsFromText($text, Profile $profile) + public static function idsFromText($text, Profile $profile) { $ids = array(); $groups = self::groupsFromText($text, $profile); diff --git a/lib/database/pgsqlschema.php b/lib/database/pgsqlschema.php index 15dcf97d82..95d63dce0e 100644 --- a/lib/database/pgsqlschema.php +++ b/lib/database/pgsqlschema.php @@ -17,11 +17,11 @@ /** * Database schema for PostgreSQL * - * @category Database - * @package GNUsocial - * @author Evan Prodromou - * @author Brenda Wallace - * @author Brion Vibber + * @category Database + * @package GNUsocial + * @author Evan Prodromou + * @author Brenda Wallace + * @author Brion Vibber * @copyright 2019 Free Software Foundation, Inc http://www.fsf.org * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ @@ -52,7 +52,6 @@ class PgsqlSchema extends Schema * @return array tabledef for that table. * @throws SchemaTableMissingException */ - public function getTableDef($table) { $def = []; @@ -68,7 +67,6 @@ class PgsqlSchema extends Schema $orderedFields = []; foreach ($columns as $row) { - $name = $row['column_name']; $orderedFields[$row['ordinal_position']] = $name; @@ -146,7 +144,7 @@ class PgsqlSchema extends Schema // name hack -- is this reliable? if ($keyName == "{$table}_pkey") { $def['primary key'] = $cols; - } else if (preg_match("/^{$table}_(.*)_fkey$/", $keyName, $matches)) { + } elseif (preg_match("/^{$table}_(.*)_fkey$/", $keyName, $matches)) { $fkey = $this->getForeignKeyInfo($table, $keyName); $colMap = array_combine($cols, $fkey['col_names']); $def['foreign keys'][$keyName] = [$fkey['table_name'], $colMap]; @@ -166,7 +164,7 @@ class PgsqlSchema extends Schema * @return array of arrays * @throws PEAR_Exception */ - function fetchMetaInfo($table, $infoTable, $orderBy = null) + public function fetchMetaInfo($table, $infoTable, $orderBy = null) { $query = "SELECT * FROM information_schema.%s " . "WHERE table_name='%s'"; @@ -183,7 +181,7 @@ class PgsqlSchema extends Schema * @return array of arrays * @throws PEAR_Exception */ - function getIndexInfo($table) + public function getIndexInfo($table) { $query = 'SELECT ' . '(SELECT relname FROM pg_class WHERE oid=indexrelid) AS key_name, ' . @@ -202,7 +200,7 @@ class PgsqlSchema extends Schema * @return array array of rows with keys: fkey_name, table_name, table_id, col_names (array of strings) * @throws PEAR_Exception */ - function getForeignKeyInfo($table, $constraint_name) + public function getForeignKeyInfo($table, $constraint_name) { // In a sane world, it'd be easier to query the column names directly. // But it's pretty hard to work with arrays such as col_indexes in direct SQL here. @@ -234,7 +232,7 @@ class PgsqlSchema extends Schema * @return array of strings * @throws PEAR_Exception */ - function getTableColumnNames($table_id, $col_indexes) + public function getTableColumnNames($table_id, $col_indexes) { $indexes = array_map('intval', explode(' ', $col_indexes)); $query = 'SELECT attnum AS col_index, attname AS col_name ' . @@ -284,7 +282,7 @@ class PgsqlSchema extends Schema * @return string correct SQL for that column */ - function columnSql(array $cd) + public function columnSql(array $cd) { $line = []; $line[] = parent::columnSql($cd); @@ -311,7 +309,7 @@ class PgsqlSchema extends Schema * @param array $old previous column definition as found in DB * @param array $cd current column definition */ - function appendAlterModifyColumn(array &$phrase, $columnName, array $old, array $cd) + public function appendAlterModifyColumn(array &$phrase, $columnName, array $old, array $cd) { $prefix = 'ALTER COLUMN ' . $this->quoteIdentifier($columnName) . ' '; @@ -323,13 +321,13 @@ class PgsqlSchema extends Schema if (!empty($old['not null']) && empty($cd['not null'])) { $phrase[] = $prefix . 'DROP NOT NULL'; - } else if (empty($old['not null']) && !empty($cd['not null'])) { + } elseif (empty($old['not null']) && !empty($cd['not null'])) { $phrase[] = $prefix . 'SET NOT NULL'; } if (isset($old['default']) && !isset($cd['default'])) { $phrase[] = $prefix . 'DROP DEFAULT'; - } else if (!isset($old['default']) && isset($cd['default'])) { + } elseif (!isset($old['default']) && isset($cd['default'])) { $phrase[] = $prefix . 'SET DEFAULT ' . $this->quoteDefaultValue($cd); } } @@ -342,23 +340,12 @@ class PgsqlSchema extends Schema * @param string $table * @param string $name */ - function appendDropIndex(array &$statements, $table, $name) + public function appendDropIndex(array &$statements, $table, $name) { $statements[] = "DROP INDEX $name"; } - /** - * Quote a db/table/column identifier if necessary. - * - * @param string $name - * @return string - */ - function quoteIdentifier($name) - { - return $this->conn->quoteIdentifier($name); - } - - function mapType($column) + 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. @@ -377,7 +364,7 @@ class PgsqlSchema extends Schema $size = $column['size']; if ($size == 'small') { return 'int2'; - } else if ($size == 'big') { + } elseif ($size == 'big') { return 'int8'; } } @@ -388,7 +375,7 @@ class PgsqlSchema extends Schema } // @fixme need name... :P - function typeAndSize($column) + public function typeAndSize($column) { if ($column['type'] == 'enum') { $vals = array_map([$this, 'quote'], $column['enum']); @@ -408,7 +395,7 @@ class PgsqlSchema extends Schema * @param array $tableDef * @return array */ - function filterDef(array $tableDef) + public function filterDef(array $tableDef) { foreach ($tableDef['fields'] as $name => &$col) { // No convenient support for field descriptions @@ -443,7 +430,7 @@ class PgsqlSchema extends Schema * @param array $def * @return array */ - function filterKeyDef(array $def) + public function filterKeyDef(array $def) { // PostgreSQL doesn't like prefix lengths specified on keys...? foreach ($def as $i => $item) { diff --git a/lib/database/schema.php b/lib/database/schema.php index 1b0a38ea8b..b31c4b938a 100644 --- a/lib/database/schema.php +++ b/lib/database/schema.php @@ -17,10 +17,10 @@ /** * Database schema * - * @category Database - * @package GNUsocial - * @author Evan Prodromou - * @author Brion Vibber + * @category Database + * @package GNUsocial + * @author Evan Prodromou + * @author Brion Vibber * @copyright 2019 Free Software Foundation, Inc http://www.fsf.org * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ @@ -39,14 +39,13 @@ defined('GNUSOCIAL') || die(); */ class Schema { - static $_static = null; + public static $_static = null; protected $conn = null; /** * Constructor. Only run once for singleton object. * @param null $conn */ - protected function __construct($conn = null) { if (is_null($conn)) { @@ -64,11 +63,10 @@ class Schema * Main public entry point. Use this to get * the schema object. * - * @param null $conn + * @param object|null $conn * @return Schema the Schema object for the connection */ - - static function get($conn = null) + public static function get($conn = null) { if (is_null($conn)) { $key = 'default'; @@ -95,7 +93,6 @@ class Schema * @return ColumnDef definition of the column or null * if not found. */ - public function getColumnDef($table, $column) { $td = $this->getTableDef($table); @@ -120,7 +117,6 @@ class Schema * @return bool success flag * @throws PEAR_Exception */ - public function createTable($tableName, $def) { $statements = $this->buildCreateTable($tableName, $def); @@ -194,7 +190,7 @@ class Schema * @param array $def table definition * @return string */ - function startCreateTable($name, array $def) + public function startCreateTable($name, array $def) { return 'CREATE TABLE ' . $this->quoteIdentifier($name) . ' ('; } @@ -206,7 +202,7 @@ class Schema * @param array $def table definition * @return string */ - function endCreateTable($name, array $def) + public function endCreateTable($name, array $def) { return ')'; } @@ -218,9 +214,9 @@ class Schema * @param string $name * @param array $def */ - function appendColumnDef(array &$sql, $name, array $def) + public function appendColumnDef(array &$sql, string $name, array $def) { - $sql[] = "$name " . $this->columnSql($def); + $sql[] = $name . ' ' . $this->columnSql($name, $def); } /** @@ -230,7 +226,7 @@ class Schema * @param array $sql * @param array $def */ - function appendPrimaryKeyDef(array &$sql, array $def) + public function appendPrimaryKeyDef(array &$sql, array $def) { $sql[] = "PRIMARY KEY " . $this->buildIndexList($def); } @@ -243,7 +239,7 @@ class Schema * @param string $name * @param array $def */ - function appendUniqueKeyDef(array &$sql, $name, array $def) + public function appendUniqueKeyDef(array &$sql, $name, array $def) { $sql[] = "CONSTRAINT $name UNIQUE " . $this->buildIndexList($def); } @@ -257,7 +253,7 @@ class Schema * @param array $def * @throws Exception */ - function appendForeignKeyDef(array &$sql, $name, array $def) + public function appendForeignKeyDef(array &$sql, $name, array $def) { if (count($def) != 2) { throw new Exception("Invalid foreign key def for $name: " . var_export($def, true)); @@ -265,11 +261,11 @@ class Schema list($refTable, $map) = $def; $srcCols = array_keys($map); $refCols = array_values($map); - $sql[] = "CONSTRAINT $name FOREIGN KEY " . + $sql[] = 'CONSTRAINT ' . $this->quoteIdentifier($name) . ' FOREIGN KEY ' . $this->buildIndexList($srcCols) . - " REFERENCES " . + ' REFERENCES ' . $this->quoteIdentifier($refTable) . - " " . + ' ' . $this->buildIndexList($refCols); } @@ -282,9 +278,10 @@ class Schema * @param string $name * @param array $def */ - function appendCreateIndex(array &$statements, $table, $name, array $def) + public function appendCreateIndex(array &$statements, $table, $name, array $def) { - $statements[] = "CREATE INDEX $name ON $table " . $this->buildIndexList($def); + $statements[] = 'CREATE INDEX ' . $name . ' ON ' . + $this->quoteIdentifier($table) . ' ' . $this->buildIndexList($def); } /** @@ -297,7 +294,7 @@ class Schema * @param array $def * @throws Exception */ - function appendCreateFulltextIndex(array &$statements, $table, $name, array $def) + public function appendCreateFulltextIndex(array &$statements, $table, $name, array $def) { throw new Exception("Fulltext index not supported in this database"); } @@ -309,18 +306,18 @@ class Schema * @param string $table * @param string $name */ - function appendDropIndex(array &$statements, $table, $name) + public function appendDropIndex(array &$statements, $table, $name) { $statements[] = "DROP INDEX $name ON " . $this->quoteIdentifier($table); } - function buildIndexList(array $def) + public function buildIndexList(array $def) { // @fixme return '(' . implode(',', array_map([$this, 'buildIndexItem'], $def)) . ')'; } - function buildIndexItem($def) + public function buildIndexItem($def) { if (is_array($def)) { list($name, $size) = $def; @@ -339,12 +336,11 @@ class Schema * @return bool success flag * @throws PEAR_Exception */ - public function dropTable($name) { global $_PEAR; - $res = $this->conn->query("DROP TABLE $name"); + $res = $this->conn->query('DROP TABLE ' . $this->quoteIdentifier($name)); if ($_PEAR->isError($res)) { PEAR_ErrorToPEAR_Exception($res); @@ -369,7 +365,6 @@ class Schema * @return bool success flag * @throws PEAR_Exception */ - public function createIndex($table, $columnNames, $name = null) { global $_PEAR; @@ -382,9 +377,11 @@ class Schema $name = "{$table}_" . implode("_", $columnNames) . "_idx"; } - $res = $this->conn->query("ALTER TABLE $table " . - "ADD INDEX $name (" . - implode(",", $columnNames) . ")"); + $res = $this->conn->query( + 'ALTER TABLE ' . $this->quoteIdentifier($table) . + ' ADD INDEX ' . $name . ' (' . + implode(',', $columnNames) . ')' + ); if ($_PEAR->isError($res)) { PEAR_ErrorToPEAR_Exception($res); @@ -402,12 +399,14 @@ class Schema * @return bool success flag * @throws PEAR_Exception */ - public function dropIndex($table, $name) { global $_PEAR; - $res = $this->conn->query("ALTER TABLE $table DROP INDEX $name"); + $res = $this->conn->query( + 'ALTER TABLE ' . $this->quoteIdentifier($table) . + ' DROP INDEX ' . $name + ); if ($_PEAR->isError($res)) { PEAR_ErrorToPEAR_Exception($res); @@ -426,12 +425,12 @@ class Schema * @return bool success flag * @throws PEAR_Exception */ - public function addColumn($table, $columndef) { global $_PEAR; - $sql = "ALTER TABLE $table ADD COLUMN " . $this->_columnSql($columndef); + $sql = 'ALTER TABLE ' . $this->quoteIdentifier($table) . + ' ADD COLUMN ' . $this->columnSql($name, $columndef); $res = $this->conn->query($sql); @@ -453,13 +452,12 @@ class Schema * @return bool success flag * @throws PEAR_Exception */ - public function modifyColumn($table, $columndef) { global $_PEAR; - $sql = "ALTER TABLE $table MODIFY COLUMN " . - $this->_columnSql($columndef); + $sql = 'ALTER TABLE ' . $this->quoteIdentifier($table) . + ' MODIFY COLUMN ' . $this->columnSql($name, $columndef); $res = $this->conn->query($sql); @@ -481,12 +479,12 @@ class Schema * @return bool success flag * @throws PEAR_Exception */ - public function dropColumn($table, $columnName) { global $_PEAR; - $sql = "ALTER TABLE $table DROP COLUMN $columnName"; + $sql = 'ALTER TABLE ' . $this->quoteIdentifier($table) . + ' DROP COLUMN ' . $columnName; $res = $this->conn->query($sql); @@ -511,7 +509,6 @@ class Schema * @return bool success flag * @throws PEAR_Exception */ - public function ensureTable($tableName, $def) { $statements = $this->buildEnsureTable($tableName, $def); @@ -527,7 +524,7 @@ class Schema * @return bool success flag * @throws PEAR_Exception */ - function runSqlSet(array $statements) + public function runSqlSet(array $statements) { global $_PEAR; @@ -561,8 +558,7 @@ class Schema * @return array of SQL statements * @throws Exception */ - - function buildEnsureTable($tableName, array $def) + public function buildEnsureTable($tableName, array $def) { try { $old = $this->getTableDef($tableName); @@ -610,14 +606,20 @@ class Schema } foreach ($fields['add'] as $columnName) { - $this->appendAlterAddColumn($phrase, $columnName, - $def['fields'][$columnName]); + $this->appendAlterAddColumn( + $phrase, + $columnName, + $def['fields'][$columnName] + ); } foreach ($fields['mod'] as $columnName) { - $this->appendAlterModifyColumn($phrase, $columnName, + $this->appendAlterModifyColumn( + $phrase, + $columnName, $old['fields'][$columnName], - $def['fields'][$columnName]); + $def['fields'][$columnName] + ); } foreach ($fields['del'] as $columnName) { @@ -639,7 +641,8 @@ class Schema $this->appendAlterExtras($phrase, $tableName, $def); if (count($phrase) > 0) { - $sql = 'ALTER TABLE ' . $tableName . ' ' . implode(",\n", $phrase); + $sql = 'ALTER TABLE ' . $this->quoteIdentifier($tableName) . + ' ' . implode(",\n", $phrase); $statements[] = $sql; } @@ -656,7 +659,7 @@ class Schema return $statements; } - function diffArrays($oldDef, $newDef, $section, $compareCallback = null) + public function diffArrays($oldDef, $newDef, $section, $compareCallback = null) { $old = isset($oldDef[$section]) ? $oldDef[$section] : []; $new = isset($newDef[$section]) ? $newDef[$section] : []; @@ -701,7 +704,7 @@ class Schema * @param string $columnName * @param array $cd */ - function appendAlterAddColumn(array &$phrase, $columnName, array $cd) + public function appendAlterAddColumn(array &$phrase, string $columnName, array $cd) { $phrase[] = 'ADD COLUMN ' . $this->quoteIdentifier($columnName) . @@ -718,7 +721,7 @@ class Schema * @param array $old previous column definition as found in DB * @param array $cd current column definition */ - function appendAlterModifyColumn(array &$phrase, $columnName, array $old, array $cd) + public function appendAlterModifyColumn(array &$phrase, string $columnName, array $old, array $cd) { $phrase[] = 'MODIFY COLUMN ' . $this->quoteIdentifier($columnName) . @@ -733,12 +736,12 @@ class Schema * @param array $phrase * @param string $columnName */ - function appendAlterDropColumn(array &$phrase, $columnName) + public function appendAlterDropColumn(array &$phrase, $columnName) { $phrase[] = 'DROP COLUMN ' . $this->quoteIdentifier($columnName); } - function appendAlterAddUnique(array &$phrase, $keyName, array $def) + public function appendAlterAddUnique(array &$phrase, $keyName, array $def) { $sql = []; $sql[] = 'ADD'; @@ -746,7 +749,7 @@ class Schema $phrase[] = implode(' ', $sql); } - function appendAlterAddForeign(array &$phrase, $keyName, array $def) + public function appendAlterAddForeign(array &$phrase, $keyName, array $def) { $sql = []; $sql[] = 'ADD'; @@ -754,7 +757,7 @@ class Schema $phrase[] = implode(' ', $sql); } - function appendAlterAddPrimary(array &$phrase, array $def) + public function appendAlterAddPrimary(array &$phrase, array $def) { $sql = []; $sql[] = 'ADD'; @@ -762,22 +765,22 @@ class Schema $phrase[] = implode(' ', $sql); } - function appendAlterDropPrimary(array &$phrase) + public function appendAlterDropPrimary(array &$phrase) { $phrase[] = 'DROP CONSTRAINT PRIMARY KEY'; } - function appendAlterDropUnique(array &$phrase, $keyName) + public function appendAlterDropUnique(array &$phrase, $keyName) { $phrase[] = 'DROP CONSTRAINT ' . $keyName; } - function appendAlterDropForeign(array &$phrase, $keyName) + public function appendAlterDropForeign(array &$phrase, $keyName) { $phrase[] = 'DROP FOREIGN KEY ' . $keyName; } - function appendAlterExtras(array &$phrase, $tableName, array $def) + public function appendAlterExtras(array &$phrase, $tableName, array $def) { // no-op } @@ -788,21 +791,21 @@ class Schema * @param string $name * @return string */ - function quoteIdentifier($name) + public function quoteIdentifier($name) { - return $name; + return $this->conn->quoteIdentifier($name); } - function quoteDefaultValue($cd) + public function quoteDefaultValue($cd) { - if (($cd['type'] == 'datetime' || $cd['type'] == 'timestamp') && $cd['default'] == 'CURRENT_TIMESTAMP') { + if (in_array($cd['type'], ['datetime', 'timestamp']) && $cd['default'] === 'CURRENT_TIMESTAMP') { return $cd['default']; } else { return $this->quoteValue($cd['default']); } } - function quoteValue($val) + public function quoteValue($val) { return $this->conn->quoteSmart($val); } @@ -816,7 +819,7 @@ class Schema * @param array $b * @return bool */ - function columnsEqual(array $a, array $b) + public function columnsEqual(array $a, array $b) { return !array_diff_assoc($a, $b) && !array_diff_assoc($b, $a); } @@ -829,7 +832,6 @@ class Schema * * @return array strings for name values */ - protected function _names($cds) { $names = []; @@ -850,7 +852,6 @@ class Schema * * @return ColumnDef matching item or null if no match. */ - protected function _byName($cds, $name) { foreach ($cds as $cd) { @@ -874,7 +875,7 @@ class Schema * @return string correct SQL for that column */ - function columnSql(array $cd) + public function columnSql(array $cd) { $line = []; $line[] = $this->typeAndSize($cd); @@ -882,7 +883,7 @@ class Schema if (isset($cd['default'])) { $line[] = 'default'; $line[] = $this->quoteDefaultValue($cd); - } else if (!empty($cd['not null'])) { + } elseif (!empty($cd['not null'])) { // Can't have both not null AND default! $line[] = 'not null'; } @@ -895,14 +896,14 @@ class Schema * @param string $column canonical type name in defs * @return string native DB type name */ - function mapType($column) + public function mapType($column) { return $column; } - function typeAndSize($column) + public function typeAndSize(array $column) { - //$type = $this->mapType($column); + //$type = $this->mapType($column)['type']; $type = $column['type']; if (isset($column['size'])) { $type = $column['size'] . $type; @@ -914,7 +915,7 @@ class Schema if (isset($column['scale'])) { $lengths[] = $column['scale']; } - } else if (isset($column['length'])) { + } elseif (isset($column['length'])) { $lengths[] = $column['length']; } @@ -977,12 +978,12 @@ class Schema $table['primary key'] = []; } $table['primary key'][] = $cd->name; - } else if ($cd->key == 'MUL') { + } elseif ($cd->key === 'MUL') { // Individual multiple-value indexes are only per-column // using the old ColumnDef syntax. $idx = "{$tableName}_{$cd->name}_idx"; $table['indexes'][$idx] = [$cd->name]; - } else if ($cd->key == 'UNI') { + } elseif ($cd->key === 'UNI') { // Individual unique-value indexes are only per-column // using the old ColumnDef syntax. $idx = "{$tableName}_{$cd->name}_idx"; @@ -1003,7 +1004,7 @@ class Schema * @param array $tableDef * @return array */ - function filterDef(array $tableDef) + public function filterDef(array $tableDef) { return $tableDef; } @@ -1019,7 +1020,7 @@ class Schema * * @throws Exception on wildly invalid input */ - function validateDef($tableName, array $def) + public function validateDef($tableName, array $def) { if (isset($def[0]) && $def[0] instanceof ColumnDef) { $def = $this->oldToNew($tableName, $def); @@ -1033,7 +1034,7 @@ class Schema return $def; } - function isNumericType($type) + public function isNumericType($type) { $type = strtolower($type); $known = ['int', 'serial', 'numeric']; @@ -1074,20 +1075,21 @@ class Schema $this->getTableDef($new_name); // New table exists, can't work throw new ServerException("Both table {$old_name} and {$new_name} exist. You're on your own."); - } catch(SchemaTableMissingException $e) { + } catch (SchemaTableMissingException $e) { // New table doesn't exist, carry on } - } catch(SchemaTableMissingException $e) { + } catch (SchemaTableMissingException $e) { // Already renamed, or no previous table, so we're done return true; } - return $this->runSqlSet(["ALTER TABLE {$old_name} RENAME TO {$new_name};"]); + return $this->runSqlSet([ + 'ALTER TABLE ' . $this->quoteIdentifier($old_name) . + ' RENAME TO ' . $this->quoteIdentifier($new_name) . ';', + ]); } - } class SchemaTableMissingException extends Exception { // no-op } - diff --git a/lib/ui/featureduserssection.php b/lib/ui/featureduserssection.php index 1b0718a05f..30b6cc4c60 100644 --- a/lib/ui/featureduserssection.php +++ b/lib/ui/featureduserssection.php @@ -1,48 +1,40 @@ . + /** - * StatusNet, the distributed open-source microblogging tool - * * Section for featured users * - * 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 Widget - * @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 */ -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} +defined('GNUSOCIAL') || die(); /** * Section for featured users * - * @category Widget - * @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 2009 StatusNet, Inc. + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ class FeaturedUsersSection extends ProfileSection { - function show() + public function show() { $featured_nicks = common_config('nickname', 'featured'); if (empty($featured_nicks)) { @@ -51,7 +43,7 @@ class FeaturedUsersSection extends ProfileSection parent::show(); } - function getProfiles() + public function getProfiles() { $featured_nicks = common_config('nickname', 'featured'); @@ -65,43 +57,30 @@ class FeaturedUsersSection extends ProfileSection $quoted[] = "'$nick'"; } - $table = "user"; - if(common_config('db','quote_identifiers')) { - $table = '"' . $table . '"'; - } + $table = common_database_tablename('user'); + $limit = PROFILES_PER_SECTION + 1; $qry = 'SELECT profile.* ' . - 'FROM profile JOIN '. $table .' on profile.id = '. $table .'.id ' . - 'WHERE '. $table .'.nickname in (' . implode(',', $quoted) . ') ' . - 'ORDER BY profile.created DESC '; + 'FROM profile INNER JOIN ' . $table . ' ON profile.id = ' . $table . '.id ' . + 'WHERE ' . $table . '.nickname IN (' . implode(',', $quoted) . ') ' . + 'ORDER BY profile.created DESC LIMIT ' . $limit; - $limit = PROFILES_PER_SECTION + 1; - $offset = 0; - - if (common_config('db','type') == 'pgsql') { - $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; - } else { - $qry .= ' LIMIT ' . $offset . ', ' . $limit; - } - - $profile = Memcached_DataObject::cachedQuery('Profile', - $qry, - 6 * 3600); + $profile = Memcached_DataObject::cachedQuery('Profile', $qry, 6 * 3600); return $profile; } - function title() + public function title() { // TRANS: Title for featured users section. return _('Featured users'); } - function divId() + public function divId() { return 'featured_users'; } - function moreUrl() + public function moreUrl() { return common_local_url('featured'); } diff --git a/lib/util/default.php b/lib/util/default.php index dfefaf2958..6c94960f5e 100644 --- a/lib/util/default.php +++ b/lib/util/default.php @@ -1,29 +1,29 @@ . + /** - * GNU social - a federating social network - * - * - * 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 Config * @package GNUsocial * @author Evan Prodromou * @copyright 2008-2009, 2019 Free Software Foundation http://fsf.org - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link https://www.gnu.org/software/social/ + * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ +defined('GNUSOCIAL') || die(); + $default = array('site' => array('name' => 'Just another GNU social node', @@ -74,7 +74,7 @@ $default = 'mirror' => null, 'utf8' => true, 'db_driver' => 'DB', # XXX: JanRain libs only work with DB - 'quote_identifiers' => false, + 'quote_identifiers' => true, 'type' => 'mysql', 'schemacheck' => 'runtime', // 'runtime' or 'script' 'annotate_queries' => false, // true to add caller comments to queries, eg /* POST Notice::saveNew */ diff --git a/lib/util/installer.php b/lib/util/installer.php index b297ad191a..b4cb322ae2 100644 --- a/lib/util/installer.php +++ b/lib/util/installer.php @@ -446,7 +446,6 @@ abstract class Installer // database "\$config['db']['database'] = {$vals['db_database']};\n\n" . - ($this->db['type'] == 'pgsql' ? "\$config['db']['quote_identifiers'] = true;\n\n" : '') . "\$config['db']['type'] = {$vals['db_type']};\n\n" . "// Uncomment below for better performance. Just remember you must run\n" . @@ -457,7 +456,7 @@ abstract class Installer $cfg = str_replace("\n", PHP_EOL, $cfg); // write configuration file out to install directory - $res = file_put_contents(INSTALLDIR . '/config.php', $cfg); + $res = file_put_contents(INSTALLDIR . DIRECTORY_SEPARATOR . 'config.php', $cfg); return $res; } diff --git a/lib/util/mail.php b/lib/util/mail.php index b51406dbad..922e28ed89 100644 --- a/lib/util/mail.php +++ b/lib/util/mail.php @@ -1,36 +1,33 @@ . + /** - * StatusNet, the distributed open-source microblogging tool - * - * utilities for sending email - * - * 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 . + * Utilities for sending email * * @category Mail - * @package StatusNet + * @package GNUsocial * @author Evan Prodromou * @author Zach Copley * @author Robin Millette * @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(); require_once 'Mail.php'; @@ -49,8 +46,10 @@ function mail_backend() if (!$backend) { $mail = new Mail(); - $backend = $mail->factory(common_config('mail', 'backend'), - common_config('mail', 'params') ?: array()); + $backend = $mail->factory( + common_config('mail', 'backend'), + common_config('mail', 'params') ?: [] + ); if ($_PEAR->isError($backend)) { throw new EmailException($backend->getMessage(), $backend->getCode()); } @@ -76,7 +75,7 @@ function mail_send($recipients, $headers, $body) $backend = mail_backend(); if (!isset($headers['Content-Type'])) { - $headers['Content-Type'] = 'text/plain; charset=UTF-8'; + $headers['Content-Type'] = 'text/plain; charset=UTF-8'; } assert($backend); // throws an error if it's bad @@ -124,7 +123,6 @@ function mail_notify_from() $notifyfrom = common_config('mail', 'notifyfrom'); if (!$notifyfrom) { - $domain = mail_domain(); $notifyfrom = '"'. str_replace('"', '\\"', common_config('site', 'name')) .'" '; @@ -194,7 +192,6 @@ function mail_subscribe_notify_profile($listenee, $other) { if ($other->hasRight(Right::EMAILONSUBSCRIBE) && $listenee->email && $listenee->emailnotifysub) { - $profile = $listenee->getProfile(); $name = $profile->getBestName(); @@ -211,15 +208,19 @@ function mail_subscribe_notify_profile($listenee, $other) $headers['To'] = $name . ' <' . $listenee->email . '>'; // TRANS: Subject of new-subscriber notification e-mail. // TRANS: %1$s is the subscribing user's nickname, %2$s is the StatusNet sitename. - $headers['Subject'] = sprintf(_('%1$s is now following you on %2$s.'), - $other->getBestName(), - common_config('site', 'name')); + $headers['Subject'] = sprintf( + _('%1$s is now following you on %2$s.'), + $other->getBestName(), + common_config('site', 'name') + ); // TRANS: Main body of new-subscriber notification e-mail. // TRANS: %1$s is the subscriber's long name, %2$s is the StatusNet sitename. - $body = sprintf(_('%1$s is now following you on %2$s.'), - $long_name, - common_config('site', 'name')) . + $body = sprintf( + _('%1$s is now following you on %2$s.'), + $long_name, + common_config('site', 'name') + ) . mail_profile_block($other) . mail_footer_block(); @@ -233,7 +234,6 @@ function mail_subscribe_pending_notify_profile($listenee, $other) { if ($other->hasRight(Right::EMAILONSUBSCRIBE) && $listenee->email && $listenee->emailnotifysub) { - $profile = $listenee->getProfile(); $name = $profile->getBestName(); @@ -251,18 +251,22 @@ function mail_subscribe_pending_notify_profile($listenee, $other) $headers['To'] = $name . ' <' . $listenee->email . '>'; // TRANS: Subject of pending new-subscriber notification e-mail. // TRANS: %1$s is the subscribing user's nickname, %2$s is the StatusNet sitename. - $headers['Subject'] = sprintf(_('%1$s would like to listen to '. + $headers['Subject'] = sprintf( + _('%1$s would like to listen to '. 'your notices on %2$s.'), - $other->getBestName(), - common_config('site', 'name')); + $other->getBestName(), + common_config('site', 'name') + ); // TRANS: Main body of pending new-subscriber notification e-mail. // TRANS: %1$s is the subscriber's long name, %2$s is the StatusNet sitename. - $body = sprintf(_('%1$s would like to listen to your notices on %2$s. ' . + $body = sprintf( + _('%1$s would like to listen to your notices on %2$s. ' . 'You may approve or reject their subscription at %3$s'), - $long_name, - common_config('site', 'name'), - common_local_url('subqueue', array('nickname' => $listenee->nickname))) . + $long_name, + common_config('site', 'name'), + common_local_url('subqueue', ['nickname' => $listenee->nickname]) + ) . mail_profile_block($other) . mail_footer_block(); @@ -277,13 +281,15 @@ function mail_footer_block() // TRANS: Common footer block for StatusNet notification emails. // TRANS: %1$s is the StatusNet sitename, // TRANS: %2$s is a link to the addressed user's e-mail settings. - return "\n\n" . sprintf(_('Faithfully yours,'. - "\n".'%1$s.'."\n\n". - "----\n". - "Change your email address or ". - "notification options at ".'%2$s'), - common_config('site', 'name'), - common_local_url('emailsettings')) . "\n"; + return "\n\n" . sprintf( + _('Faithfully yours,'. + "\n".'%1$s.'."\n\n". + "----\n". + "Change your email address or ". + "notification options at ".'%2$s'), + common_config('site', 'name'), + common_local_url('emailsettings') + ) . "\n"; } /** @@ -326,10 +332,12 @@ function mail_profile_block($profile) // TRANS: This is a paragraph in a new-subscriber e-mail. // TRANS: %s is a URL where the subscriber can be reported as abusive. - $out[] = sprintf(_('If you believe this account is being used abusively, ' . - 'you can block them from your subscribers list and ' . - 'report as spam to site administrators at %s.'), - $blocklink); + $out[] = sprintf( + _('If you believe this account is being used abusively, ' . + 'you can block them from your subscribers list and ' . + 'report as spam to site administrators at %s.'), + $blocklink + ); $out[] = ""; return implode("\n", $out); @@ -354,18 +362,22 @@ function mail_new_incoming_notify($user) $headers['To'] = $name . ' <' . $user->email . '>'; // TRANS: Subject of notification mail for new posting email address. // TRANS: %s is the StatusNet sitename. - $headers['Subject'] = sprintf(_('New email address for posting to %s'), - common_config('site', 'name')); + $headers['Subject'] = sprintf( + _('New email address for posting to %s'), + common_config('site', 'name') + ); // TRANS: Body of notification mail for new posting email address. // TRANS: %1$s is the StatusNet sitename, %2$s is the e-mail address to send // TRANS: to to post by e-mail, %3$s is a URL to more instructions. - $body = sprintf(_("You have a new posting address on %1\$s.\n\n". - "Send email to %2\$s to post new messages.\n\n". - "More email instructions at %3\$s."), - common_config('site', 'name'), - $user->incomingemail, - common_local_url('doc', array('title' => 'email'))) . + $body = sprintf( + _("You have a new posting address on %1\$s.\n\n". + "Send email to %2\$s to post new messages.\n\n". + "More email instructions at %3\$s."), + common_config('site', 'name'), + $user->incomingemail, + common_local_url('doc', ['title' => 'email']) + ) . mail_footer_block(); mail_send($user->email, $headers, $body); @@ -402,42 +414,58 @@ function mail_broadcast_notice_sms($notice) $user = new User(); - $UT = common_config('db','type')=='pgsql'?'"user"':'user'; $replies = $notice->getReplies(); - $user->query('SELECT nickname, smsemail, incomingemail ' . - "FROM $UT LEFT OUTER JOIN subscription " . - "ON $UT.id = subscription.subscriber " . - 'AND subscription.subscribed = ' . $notice->profile_id . ' ' . - 'AND subscription.subscribed != subscription.subscriber ' . - // Users (other than the sender) who `want SMS notices': - "WHERE $UT.id != " . $notice->profile_id . ' ' . - "AND $UT.smsemail IS NOT null " . - "AND $UT.smsnotify = 1 " . - // ... 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 ' . - // ... or where the user was mentioned in - // or replied-to with the notice: - ($replies ? sprintf("OR $UT.id in (%s)", - implode(',', $replies)) - : '') . - ')'); + + $repliesQry = ''; + if (!empty($replies)) { + $repliesQry = sprintf( + 'OR %s.id IN (%s)', + $user->escapedTableName(), + implode(',', $replies) + ); + } + + $user->query(sprintf( + 'SELECT nickname, smsemail, incomingemail ' . + 'FROM %1$s LEFT JOIN subscription ' . + 'ON %1$s.id = subscription.subscriber ' . + 'AND subscription.subscribed = %2$d ' . + 'AND subscription.subscribed <> subscription.subscriber ' . + // 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 ' . + // ... 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 ' . + // ... or where the user was mentioned in + // or replied-to with the notice: + $repliesQry . + ')', + $user->escapedTableName(), + $notice->profile_id + )); while ($user->fetch()) { - common_log(LOG_INFO, - 'Sending notice ' . $notice->id . ' to ' . $user->smsemail, - __FILE__); - $success = mail_send_sms_notice_address($notice, - $user->smsemail, - $user->incomingemail, - $user->nickname); + common_log( + LOG_INFO, + 'Sending notice ' . $notice->id . ' to ' . $user->smsemail, + __FILE__ + ); + $success = mail_send_sms_notice_address( + $notice, + $user->smsemail, + $user->incomingemail, + $user->nickname + ); if (!$success) { // XXX: Not sure, but I think that's the right thing to do - common_log(LOG_WARNING, - 'Sending notice ' . $notice->id . ' to ' . - $user->smsemail . ' FAILED, cancelling.', - __FILE__); + common_log( + LOG_WARNING, + 'Sending notice ' . $notice->id . ' to ' . $user->smsemail . ' FAILED, canceling.', + __FILE__ + ); return false; } } @@ -462,10 +490,12 @@ function mail_broadcast_notice_sms($notice) */ function mail_send_sms_notice($notice, $user) { - return mail_send_sms_notice_address($notice, - $user->smsemail, - $user->incomingemail, - $user->nickname); + return mail_send_sms_notice_address( + $notice, + $user->smsemail, + $user->incomingemail, + $user->nickname + ); } /** @@ -496,8 +526,7 @@ function mail_send_sms_notice_address($notice, $smsemail, $incomingemail, $nickn $headers['To'] = $to; // TRANS: Subject line for SMS-by-email notification messages. // TRANS: %s is the posting user's nickname. - $headers['Subject'] = sprintf(_('%s status'), - $other->getBestName()); + $headers['Subject'] = sprintf(_('%s status'), $other->getBestName()); $body = $notice->content; @@ -554,14 +583,16 @@ function mail_notify_nudge($from, $to) // TRANS: Body for 'nudge' notification email. // TRANS: %1$s is the nuding user's long name, $2$s is the nudging user's nickname, // TRANS: %3$s is a URL to post notices at. - $body = sprintf(_("%1\$s (%2\$s) is wondering what you are up to ". - "these days and is inviting you to post some news.\n\n". - "So let's hear from you :)\n\n". - "%3\$s\n\n". - "Don't reply to this email; it won't get to them."), - $from_profile->getBestName(), - $from->nickname, - common_local_url('all', array('nickname' => $to->nickname))) . + $body = sprintf( + _('%1$s (%2$s) is wondering what you are up to ' . + "these days and is inviting you to post some news.\n\n" . + "So let's hear from you :)\n\n" . + "%3\$s\n\n" . + "Don't reply to this email; it won't get to them."), + $from_profile->getBestName(), + $from->nickname, + common_local_url('all', ['nickname' => $to->nickname]) + ) . mail_footer_block(); common_switch_locale(); @@ -612,17 +643,19 @@ function mail_notify_message(Notice $message, Profile $from = null, ?array $to = // TRANS: Body for direct-message notification email. // TRANS: %1$s is the sending user's long name, %2$s is the sending user's nickname, // TRANS: %3$s is the message content, %4$s a URL to the message, - $body = sprintf(_("%1\$s (%2\$s) sent you a private message:\n\n". - "------------------------------------------------------\n". - "%3\$s\n". - "------------------------------------------------------\n\n". - "You can reply to their message here:\n\n". - "%4\$s\n\n". - "Don't reply to this email; it won't get to them."), - $from->getBestName(), - $from->getNickname(), - $message->getContent(), - common_local_url('newmessage', ['to' => $from->getID()])) . + $body = sprintf( + _("%1\$s (%2\$s) sent you a private message:\n\n". + "------------------------------------------------------\n". + "%3\$s\n". + "------------------------------------------------------\n\n". + "You can reply to their message here:\n\n". + "%4\$s\n\n". + "Don't reply to this email; it won't get to them."), + $from->getBestName(), + $from->getNickname(), + $message->getContent(), + common_local_url('newmessage', ['to' => $from->getID()]) + ) . mail_footer_block(); $headers = _mail_prepare_headers('message', $t->getNickname(), $from->getNickname()); @@ -675,8 +708,11 @@ function mail_notify_attn(Profile $rcpt, Notice $notice) common_switch_locale($user->language); if ($notice->hasConversation()) { - $conversationUrl = common_local_url('conversation', - array('id' => $notice->conversation)).'#notice-'.$notice->getID(); + $conversationUrl = common_local_url( + 'conversation', + ['id' => $notice->conversation] + ) . '#notice-'.$notice->getID(); + // TRANS: Line in @-reply notification e-mail. %s is conversation URL. $conversationEmailText = sprintf(_("The full conversation can be read here:\n\n". "\t%s"), $conversationUrl) . "\n\n"; @@ -688,32 +724,40 @@ function mail_notify_attn(Profile $rcpt, Notice $notice) // TRANS: %1$s is the "fancy name" for a profile. $subject = sprintf(_('%1$s sent a notice to your attention'), $sender->getFancyName()); - // TRANS: Body of @-reply notification e-mail. - // TRANS: %1$s is the sending user's name, $2$s is the StatusNet sitename, - // TRANS: %3$s is a URL to the notice, %4$s is the notice text, - // TRANS: %5$s is the text "The full conversation can be read here:" and a URL to the full conversion if it exists (otherwise empty), - // TRANS: %6$s is a URL to reply to the notice, %7$s is a URL to all @-replies for the addressed user, - $body = sprintf(_("%1\$s just sent a notice to your attention (an '@-reply') on %2\$s.\n\n". - "The notice is here:\n\n". - "\t%3\$s\n\n" . - "It reads:\n\n". - "\t%4\$s\n\n" . - "%5\$s" . - "You can reply back here:\n\n". - "\t%6\$s\n\n" . - "The list of all @-replies for you here:\n\n" . - "%7\$s"), - $sender->getFancyName(),//%1 - common_config('site', 'name'),//%2 - common_local_url('shownotice', - array('notice' => $notice->getID())),//%3 - $notice->getContent(),//%4 - $conversationEmailText,//%5 - common_local_url('newnotice', - array('replyto' => $sender->getNickname(), 'inreplyto' => $notice->getID())),//%6 - common_local_url('replies', - array('nickname' => $rcpt->getNickname()))) . //%7 - mail_footer_block(); + // TRANS: Body of @-reply notification e-mail. + // TRANS: %1$s is the sending user's name, $2$s is the GNU social sitename, + // TRANS: %3$s is a URL to the notice, %4$s is the notice text, + // TRANS: %5$s is the text "The full conversation can be read here:" and a URL to the full conversion if it exists (otherwise empty), + // TRANS: %6$s is a URL to reply to the notice, %7$s is a URL to all @-replies for the addressed user, + $body = sprintf( + _("%1\$s just sent a notice to your attention (an '@-reply') on %2\$s.\n\n". + "The notice is here:\n\n". + "\t%3\$s\n\n" . + "It reads:\n\n". + "\t%4\$s\n\n" . + "%5\$s" . + "You can reply back here:\n\n". + "\t%6\$s\n\n" . + "The list of all @-replies for you here:\n\n" . + "%7\$s"), + $sender->getFancyName(), //%1 + common_config('site', 'name'), //%2 + common_local_url( + 'shownotice', + ['notice' => $notice->getID()] + ), //%3 + $notice->getContent(), //%4 + $conversationEmailText, //%5 + common_local_url( + 'newnotice', + ['replyto' => $sender->getNickname(), 'inreplyto' => $notice->getID()] + ), //%6 + common_local_url( + 'replies', + ['nickname' => $rcpt->getNickname()] + ) + ) . //%7 + mail_footer_block(); $headers = _mail_prepare_headers('mention', $rcpt->getNickname(), $sender->getNickname()); common_switch_locale(); @@ -764,20 +808,23 @@ function mail_notify_group_join($group, $joiner) $headers['To'] = $admin->getBestName() . ' <' . $adminUser->email . '>'; // TRANS: Subject of group join notification e-mail. // TRANS: %1$s is the joining user's nickname, %2$s is the group name, and %3$s is the StatusNet sitename. - $headers['Subject'] = sprintf(_('%1$s has joined '. - 'your group %2$s on %3$s'), - $joiner->getBestName(), - $group->getBestName(), - common_config('site', 'name')); + $headers['Subject'] = sprintf( + _('%1$s has joined your group %2$s on %3$s'), + $joiner->getBestName(), + $group->getBestName(), + common_config('site', 'name') + ); // TRANS: Main body of group join notification e-mail. // TRANS: %1$s is the subscriber's long name, %2$s is the group name, and %3$s is the StatusNet sitename, // TRANS: %4$s is a block of profile info about the subscriber. // TRANS: %5$s is a link to the addressed user's e-mail settings. - $body = sprintf(_('%1$s has joined your group %2$s on %3$s.'), - $joiner->getFancyName(), - $group->getFancyName(), - common_config('site', 'name')) . + $body = sprintf( + _('%1$s has joined your group %2$s on %3$s.'), + $joiner->getFancyName(), + $group->getFancyName(), + common_config('site', 'name') + ) . mail_profile_block($joiner) . mail_footer_block(); @@ -811,20 +858,24 @@ function mail_notify_group_join_pending($group, $joiner) $headers['To'] = $admin->getBestName() . ' <' . $adminUser->email . '>'; // TRANS: Subject of pending group join request notification e-mail. // TRANS: %1$s is the joining user's nickname, %2$s is the group name, and %3$s is the StatusNet sitename. - $headers['Subject'] = sprintf(_('%1$s wants to join your group %2$s on %3$s.'), - $joiner->getBestName(), - $group->getBestName(), - common_config('site', 'name')); + $headers['Subject'] = sprintf( + _('%1$s wants to join your group %2$s on %3$s.'), + $joiner->getBestName(), + $group->getBestName(), + common_config('site', 'name') + ); // TRANS: Main body of pending group join request notification e-mail. // TRANS: %1$s is the subscriber's long name, %2$s is the group name, and %3$s is the StatusNet sitename, // TRANS: %4$s is the URL to the moderation queue page. - $body = sprintf(_('%1$s would like to join your group %2$s on %3$s. ' . - 'You may approve or reject their group membership at %4$s'), - $joiner->getFancyName(), - $group->getFancyName(), - common_config('site', 'name'), - common_local_url('groupqueue', array('nickname' => $group->nickname))) . + $body = sprintf( + _('%1$s would like to join your group %2$s on %3$s. ' . + 'You may approve or reject their group membership at %4$s'), + $joiner->getFancyName(), + $group->getFancyName(), + common_config('site', 'name'), + common_local_url('groupqueue', ['nickname' => $group->nickname]) + ) . mail_profile_block($joiner) . mail_footer_block(); diff --git a/lib/util/util.php b/lib/util/util.php index efd33568f5..9f36292029 100644 --- a/lib/util/util.php +++ b/lib/util/util.php @@ -1,24 +1,23 @@ . - */ +// 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 . /* XXX: break up into separate modules (HTTP, user, files) */ +defined('GNUSOCIAL') || die(); + /** * Show a server error. */ @@ -52,12 +51,14 @@ function common_init_locale($language=null) } putenv('LANGUAGE='.$language); putenv('LANG='.$language); - $ok = setlocale(LC_ALL, - $language . ".utf8", - $language . ".UTF8", - $language . ".utf-8", - $language . ".UTF-8", - $language); + $ok = setlocale( + LC_ALL, + $language . '.utf8', + $language . '.UTF8', + $language . '.utf-8', + $language . '.UTF-8', + $language + ); return $ok; } @@ -356,12 +357,14 @@ function common_set_cookie($key, $value, $expiration=0) } else { $cookiepath = '/'; } - return setcookie($key, - $value, - $expiration, - $cookiepath, - $server, - GNUsocial::useHTTPS()); + return setcookie( + $key, + $value, + $expiration, + $cookiepath, + $server, + GNUsocial::useHTTPS() + ); } define('REMEMBERME', 'rememberme'); @@ -592,7 +595,6 @@ function common_to_alphanumeric($str) function common_purify($html, array $args=[]) { - $cfg = \HTMLPurifier_Config::createDefault(); /** * rel values that should be avoided since they can be used to infer @@ -839,9 +841,10 @@ function common_find_mentions($text, Profile $sender, Notice $parent=null) } $tagged = $sender->getTaggedSubscribers($tag); - $url = common_local_url('showprofiletag', - ['nickname' => $sender->getNickname(), - 'tag' => $tag]); + $url = common_local_url( + 'showprofiletag', + ['nickname' => $sender->getNickname(), 'tag' => $tag] + ); $mentions[] = ['mentioned' => $tagged, 'type' => 'list', @@ -888,17 +891,21 @@ function common_find_mentions($text, Profile $sender, Notice $parent=null) function common_find_mentions_raw($text, $preMention='@') { $tmatches = []; - preg_match_all('/^T (' . Nickname::DISPLAY_FMT . ') /', - $text, - $tmatches, - PREG_OFFSET_CAPTURE); + preg_match_all( + '/^T (' . Nickname::DISPLAY_FMT . ') /', + $text, + $tmatches, + PREG_OFFSET_CAPTURE + ); $atmatches = []; // the regexp's "(?!\@)" makes sure it doesn't matches the single "@remote" in "@remote@server.com" - preg_match_all('/'.Nickname::BEFORE_MENTIONS.preg_quote($preMention, '/').'(' . Nickname::DISPLAY_FMT . ')\b(?!\@)/', - $text, - $atmatches, - PREG_OFFSET_CAPTURE); + preg_match_all( + '/' . Nickname::BEFORE_MENTIONS . preg_quote($preMention, '/') . '(' . Nickname::DISPLAY_FMT . ')\b(?!\@)/', + $text, + $atmatches, + PREG_OFFSET_CAPTURE + ); $matches = array_merge($tmatches[1], $atmatches[1]); return $matches; @@ -961,7 +968,8 @@ function common_url_schemes($filter = null) $schemes, function ($scheme) use ($filter) { return is_null($filter) || ($scheme & $filter); - }) + } + ) ); } @@ -1339,8 +1347,10 @@ function common_relative_profile($sender, $nickname, $dt=null) // Try to find profiles this profile is subscribed to that have this nickname $recipient = new Profile(); - // XXX: use a join instead of a subquery - $recipient->whereAdd('EXISTS (SELECT subscribed from subscription where subscriber = '.intval($sender->id).' and subscribed = id)', 'AND'); + $recipient->whereAdd( + sprintf('id IN (SELECT subscribed FROM subscription WHERE subscriber = %d)', $sender->id), + 'AND' + ); $recipient->whereAdd("nickname = '" . $recipient->escape($nickname) . "'", 'AND'); if ($recipient->find(true)) { // XXX: should probably differentiate between profiles with @@ -1349,8 +1359,10 @@ function common_relative_profile($sender, $nickname, $dt=null) } // Try to find profiles that listen to this profile and that have this nickname $recipient = new Profile(); - // XXX: use a join instead of a subquery - $recipient->whereAdd('EXISTS (SELECT subscriber from subscription where subscribed = '.intval($sender->id).' and subscriber = id)', 'AND'); + $recipient->whereAdd( + sprintf('id IN (SELECT subscriber FROM subscription WHERE subscribed = %d)', $sender->id), + 'AND' + ); $recipient->whereAdd("nickname = '" . $recipient->escape($nickname) . "'", 'AND'); if ($recipient->find(true)) { // XXX: should probably differentiate between profiles with @@ -1701,11 +1713,13 @@ function common_enqueue_notice($notice) function common_profile_url($nickname) { - return common_local_url('showstream', - ['nickname' => $nickname], - null, - null, - false); + return common_local_url( + 'showstream', + ['nickname' => $nickname], + null, + null, + false + ); } /** @@ -2210,11 +2224,13 @@ function common_remove_magic_from_request() function common_user_uri(&$user) { - return common_local_url('userbyid', - ['id' => $user->id], - null, - null, - false); + return common_local_url( + 'userbyid', + ['id' => $user->id], + null, + null, + false + ); } /** @@ -2225,11 +2241,12 @@ function common_user_uri(&$user) * alphanums and remove lookalikes (0, O, 1, I) = 32 chars = 5 bits to make it easy for the user to type in * @return string confirmation_code of length $bits/5 */ -function common_confirmation_code($bits, $codechars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ') { +function common_confirmation_code($bits, $codechars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ') +{ $chars = ceil($bits/5); $codechars_length = strlen($codechars)-1; $code = ''; - for($i = 0; $i < $chars; ++$i) { + for ($i = 0; $i < $chars; ++$i) { $random_char = $codechars[random_int(0, $codechars_length)]; $code .= $random_char; } @@ -2403,15 +2420,13 @@ function common_compatible_license($from, $to) } /** - * returns a quoted table name, if required according to config + * returns a quoted table name */ function common_database_tablename($tablename) { - if (common_config('db', 'quote_identifiers')) { - $tablename = '"'. $tablename .'"'; - } - //table prefixes could be added here later - return $tablename; + $schema = Schema::get(); + // table prefixes could be added here later + return $schema->quoteIdentifier($tablename); } /** @@ -2692,10 +2707,13 @@ function _common_size_str_to_int($size): int * * @return int */ -function common_get_preferred_php_upload_limit(): int { - return min(_common_size_str_to_int(ini_get('post_max_size')), - _common_size_str_to_int(ini_get('upload_max_filesize')), - _common_size_str_to_int(ini_get('memory_limit'))); +function common_get_preferred_php_upload_limit(): int +{ + return min( + _common_size_str_to_int(ini_get('post_max_size')), + _common_size_str_to_int(ini_get('upload_max_filesize')), + _common_size_str_to_int(ini_get('memory_limit')) + ); } function html_sprintf() diff --git a/plugins/Nodeinfo/actions/nodeinfo_2_0.php b/plugins/Nodeinfo/actions/nodeinfo_2_0.php index 2150bfb5e8..e76f545809 100644 --- a/plugins/Nodeinfo/actions/nodeinfo_2_0.php +++ b/plugins/Nodeinfo/actions/nodeinfo_2_0.php @@ -326,15 +326,18 @@ class Nodeinfo_2_0Action extends Action */ public function getActiveUsers(int $days): int { + $userTable = common_database_tablename('user'); $query = " - SELECT COUNT(DISTINCT profile_id) as active_users_count + SELECT COUNT(DISTINCT profile_id) AS active_users_count FROM ( - SELECT profile_id FROM notice WHERE notice.created >= NOW() - INTERVAL {$days} DAY AND notice.is_local = 1 + SELECT profile_id FROM notice + WHERE notice.created >= (CURRENT_TIMESTAMP - INTERVAL {$days} DAY) AND notice.is_local = 1 UNION ALL - SELECT user_id FROM fave INNER JOIN user ON fave.user_id = user.id WHERE fave.created >= NOW() - INTERVAL {$days} DAY + SELECT user_id FROM fave INNER JOIN {$userTable} ON fave.user_id = {$userTable}.id + WHERE fave.created >= (CURRENT_TIMESTAMP - INTERVAL {$days} DAY) UNION ALL - SELECT id FROM user WHERE user.created >= NOW() - INTERVAL {$days} DAY - ) as source"; + SELECT id FROM {$userTable} WHERE {$userTable}.created >= (CURRENT_TIMESTAMP - INTERVAL {$days} DAY) + ) AS source"; $activeUsersCount = new DB_DataObject(); $activeUsersCount->query($query);