. * * @category Plugin * @package StatusNet * @author Zach Copley * @copyright 2010 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ if (!defined('STATUSNET')) { // This check helps protect against security problems; // your code file can't be executed directly from the web. exit(1); } define('ANONYMOUS_FAVE_PLUGIN_VERSION', '0.1'); /** * Anonymous Fave plugin to allow anonymous (not logged in) users * to favorite notices * * @category Plugin * @package StatusNet * @author Zach Copley * @copyright 2010 StatusNet, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ class AnonymousFavePlugin extends Plugin { function onArgsInitialize() { // We always want a session because we're tracking anon users common_ensure_session(); } function onEndShowHTML($action) { if (!common_logged_in()) { // Set a place to return to when submitting forms common_set_returnto($action->selfUrl()); } } function onEndShowScripts($action) { // Setup ajax calls for favoriting. Usually this is only done when // a user is logged in. $action->inlineScript('SN.U.NoticeFavor();'); } function onAutoload($cls) { $dir = dirname(__FILE__); switch ($cls) { 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) { if (!common_logged_in()) { $item->out->elementStart('div', 'notice-options'); $item->showFaveForm(); $item->out->elementEnd('div'); } return true; } function onStartShowFaveForm($item) { if (!common_logged_in()) { $profile = $this->getAnonProfile(); if (!empty($profile)) { if ($profile->hasFave($item->notice)) { $disfavor = new AnonDisFavorForm($item->out, $item->notice); $disfavor->show(); } else { $favor = new AnonFavorForm($item->out, $item->notice); $favor->show(); } } } return true; } 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); $profile = new Profile(); $profile->nickname = $nickname; $id = $profile->insert(); if (!empty($id)) { common_log( LOG_INFO, "AnonymousFavePlugin - created profile for anonymous user from IP: " . $ip . ', nickname = ' . $nickname ); } return $profile; } function getAnonProfile() { $anon = $_SESSION['anon_nickname']; $profile = null; if (!empty($anon)) { $profile = Profile::staticGet('nickname', $anon); } else { $profile = $this->createAnonProfile(); $_SESSION['anon_nickname'] = $profile->nickname; } if (!empty($profile)) { return $profile; } } /** * Provide plugin version information. * * This data is used when showing the version page. * * @param array &$versions array of version data arrays; see EVENTS.txt * * @return boolean hook value */ function onPluginVersion(&$versions) { $url = 'http://status.net/wiki/Plugin:AnonymousFave'; $versions[] = array('name' => 'AnonymousFave', 'version' => ANONYMOUS_FAVE_PLUGIN_VERSION, 'author' => 'Zach Copley', 'homepage' => $url, 'rawdescription' => _m('Allow anonymous users to favorite notices.')); return true; } }