X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FAnonymousFave%2FAnonymousFavePlugin.php;h=841b6524012de81d5e2c72717bcbd900d78e9dc0;hb=6267e7a9306c6e974789df56cf02b0050a9943c1;hp=41542c8493777a11e794a83f697cd75747ad0a5f;hpb=5ca280f203a3ab41a367d0d034ed1952c4bb7ee6;p=quix0rs-gnu-social.git diff --git a/plugins/AnonymousFave/AnonymousFavePlugin.php b/plugins/AnonymousFave/AnonymousFavePlugin.php index 41542c8493..841b652401 100644 --- a/plugins/AnonymousFave/AnonymousFavePlugin.php +++ b/plugins/AnonymousFave/AnonymousFavePlugin.php @@ -1,11 +1,19 @@ array('spock', 'kirk', 'bones')) + * ); + * + * * PHP version 5 * * This program is free software: you can redistribute it and/or modify @@ -48,7 +56,11 @@ define('ANONYMOUS_FAVE_PLUGIN_VERSION', '0.1'); * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ -class AnonymousFavePlugin extends Plugin { +class AnonymousFavePlugin extends Plugin +{ + // Array of users who should not have anon faving. The default is + // that anonymous faving is allowed for all users. + public $restricted = array(); function onArgsInitialize() { // We always want a session because we're tracking anon users @@ -68,22 +80,7 @@ class AnonymousFavePlugin extends Plugin { $schema = Schema::get(); // For storing total number of times a notice has been faved - - $schema->ensureTable('fave_tally', - array( - new ColumnDef('notice_id', 'integer', null, false, 'PRI'), - new ColumnDef('count', 'integer', null, false), - new ColumnDef( - 'modified', - 'timestamp', - null, - false, - null, - 'CURRENT_TIMESTAMP', - 'on update CURRENT_TIMESTAMP' - ) - ) - ); + $schema->ensureTable('fave_tally', Fave_tally::schemaDef()); return true; } @@ -103,41 +100,16 @@ class AnonymousFavePlugin extends Plugin { $action->inlineScript('SN.U.NoticeFavor();'); } - function onAutoload($cls) + function onStartInitializeRouter($m) { - $dir = dirname(__FILE__); - - switch ($cls) { - case 'Fave_tally': - include_once $dir . '/' . $cls . '.php'; - return false; - case 'AnonFavorAction': - include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; - return false; - case 'AnonDisFavorAction': - include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; - return false; - case 'AnonFavorForm': - include_once $dir . '/anonfavorform.php'; - return false; - case 'AnonDisFavorForm': - include_once $dir . '/anondisfavorform.php'; - return false; - default: - return true; - } - } - - function onStartInitializeRouter($m) { - $m->connect('main/anonfavor', array('action' => 'AnonFavor')); $m->connect('main/anondisfavor', array('action' => 'AnonDisFavor')); return true; } - function onStartShowNoticeOptions($item) { - + function onStartShowNoticeOptions($item) + { if (!common_logged_in()) { $item->out->elementStart('div', 'notice-options'); $item->showFaveForm(); @@ -147,13 +119,13 @@ class AnonymousFavePlugin extends Plugin { return true; } - function onStartShowFaveForm($item) { - - if (!common_logged_in()) { + function onStartShowFaveForm($item) + { + if (!common_logged_in() && $this->hasAnonFaving($item)) { - $profile = $this->getAnonProfile(); - if (!empty($profile)) { - if ($profile->hasFave($item->notice)) { + $profile = AnonymousFavePlugin::getAnonProfile(); + if ($profile instanceof Profile) { + if (Fave::existsForProfile($item->notice, $profile)) { $disfavor = new AnonDisFavorForm($item->out, $item->notice); $disfavor->show(); } else { @@ -188,7 +160,13 @@ class AnonymousFavePlugin extends Plugin { 'class' => 'notice-tally' ) ); - $out->raw(sprintf(_m("favored %d times"), $tally->count)); + $out->elementStart('span', array('class' => 'fave-tally-title')); + // TRANS: Label for tally for number of times a notice was favored. + $out->raw(sprintf(_m("Favored"))); + $out->elementEnd('span'); + $out->elementStart('span', array('class' => 'fave-tally')); + $out->raw($tally->count); + $out->elementEnd('span'); $out->elementEnd('div'); } } @@ -203,46 +181,85 @@ class AnonymousFavePlugin extends Plugin { $tally = Fave_tally::decrement($notice->id); } - function createAnonProfile() { - + static function createAnonProfile() + { // Get the anon user's IP, and turn it into a nickname list($proxy, $ip) = common_client_ip(); - // IP + time + random number should avoid collisions - $nickname = 'anonymous-' . $ip . '-' . time() . '-' . common_good_rand(5); + + // IP + time + random number should help to avoid collisions + $baseNickname = $ip . '-' . time() . '-' . common_random_hexstr(5); $profile = new Profile(); - $profile->nickname = $nickname; + $profile->nickname = $baseNickname; $id = $profile->insert(); - if (!empty($id)) { - common_log( - LOG_INFO, - "AnonymousFavePlugin - created profile for anonymous user from IP: " - . $ip - . ', nickname = ' - . $nickname - ); + if (!$id) { + // TRANS: Server exception. + throw new ServerException(_m("Could not create anonymous user session.")); + } + + // Stick the Profile ID into the nickname + $orig = clone($profile); + + $profile->nickname = 'anon-' . $id . '-' . $baseNickname; + $result = $profile->update($orig); + + if (!$result) { + // TRANS: Server exception. + throw new ServerException(_m("Could not create anonymous user session.")); } + common_log( + LOG_INFO, + "AnonymousFavePlugin - created profile for anonymous user from IP: " + . $ip + . ', nickname = ' + . $profile->nickname + ); + return $profile; } - function getAnonProfile() { + static function getAnonProfile() + { - $anon = $_SESSION['anon_nickname']; + $token = $_SESSION['anon_token']; + $anon = base64_decode($token); $profile = null; - if (!empty($anon)) { - $profile = Profile::staticGet('nickname', $anon); + if (!empty($anon) && substr($anon, 0, 5) == 'anon-') { + $parts = explode('-', $anon); + $id = $parts[1]; + // Do Profile lookup by ID instead of nickname for safety/performance + $profile = Profile::getKV('id', $id); } else { - $profile = $this->createAnonProfile(); - $_SESSION['anon_nickname'] = $profile->nickname; + $profile = AnonymousFavePlugin::createAnonProfile(); + // Obfuscate so it's hard to figure out the Profile ID + $_SESSION['anon_token'] = base64_encode($profile->nickname); } - if (!empty($profile)) { - return $profile; + return $profile; + } + + /** + * Determine whether a given NoticeListItem should have the + * anonymous fave/disfave form + * + * @param NoticeListItem $item + * + * @return boolean false if the profile associated with the notice is + * in the list of restricted profiles, otherwise + * return true + */ + function hasAnonFaving($item) + { + $profile = Profile::getKV('id', $item->notice->profile_id); + if (in_array($profile->nickname, $this->restricted)) { + return false; } + + return true; } /** @@ -254,7 +271,7 @@ class AnonymousFavePlugin extends Plugin { * * @return boolean hook value */ - function onPluginVersion(&$versions) + function onPluginVersion(array &$versions) { $url = 'http://status.net/wiki/Plugin:AnonymousFave'; @@ -263,9 +280,9 @@ class AnonymousFavePlugin extends Plugin { 'author' => 'Zach Copley', 'homepage' => $url, 'rawdescription' => + // TRANS: Plugin description. _m('Allow anonymous users to favorite notices.')); return true; } - }