| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2012-03-02 10:20:01 -06:00
										 |  |  |  * Copyright (C) 2011,2012, StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  |  * | 
					
						
							|  |  |  |  * ActivitySpam Plugin | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  Spam | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							| 
									
										
										
										
											2012-03-02 10:20:01 -06:00
										 |  |  |  * @copyright 2011,2012 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  |  * @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); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Check new notices with activity spam service. | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * @category  Spam | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							| 
									
										
										
										
											2012-03-02 10:20:01 -06:00
										 |  |  |  * @copyright 2011,2012 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class ActivitySpamPlugin extends Plugin | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     public $server = null; | 
					
						
							| 
									
										
										
										
											2012-03-20 21:37:35 -04:00
										 |  |  |     public $hideSpam = false; | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-07 07:24:28 -06:00
										 |  |  |     const REVIEWSPAM = 'ActivitySpamPlugin::REVIEWSPAM'; | 
					
						
							|  |  |  |     const TRAINSPAM = 'ActivitySpamPlugin::TRAINSPAM'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Initializer | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value; true means continue processing, false means stop. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function initialize() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2012-03-17 01:02:41 -04:00
										 |  |  |         $this->filter = new SpamFilter(common_config('activityspam', 'server'), | 
					
						
							|  |  |  |                                        common_config('activityspam', 'consumerkey'), | 
					
						
							|  |  |  |                                        common_config('activityspam', 'secret')); | 
					
						
							| 
									
										
										
										
											2012-03-05 09:58:57 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-20 21:37:35 -04:00
										 |  |  |         $this->hideSpam = common_config('activityspam', 'hidespam'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-04 22:16:46 -04:00
										 |  |  |         // Let DB_DataObject find Spam_score
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-05-04 22:20:47 -04:00
										 |  |  |         common_config_set('db', 'class_location',  | 
					
						
							|  |  |  |                           common_config('db', 'class_location') .':'.dirname(__FILE__)); | 
					
						
							| 
									
										
										
										
											2012-05-04 22:16:46 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Database schema setup | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @see Schema | 
					
						
							|  |  |  |      * @see ColumnDef | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value; true means continue processing, false means stop. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function onCheckSchema() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $schema = Schema::get(); | 
					
						
							|  |  |  |         $schema->ensureTable('spam_score', Spam_score::schemaDef()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-02 10:37:20 -06:00
										 |  |  |         Spam_score::upgrade(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2012-03-02 10:20:01 -06:00
										 |  |  |      * When a notice is saved, check its spam score | 
					
						
							|  |  |  |      *  | 
					
						
							|  |  |  |      * @param Notice $notice Notice that was just saved | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value; true means continue processing, false means stop. | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function onEndNoticeSave($notice) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2012-03-05 09:58:57 -06:00
										 |  |  |         try { | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-05 09:58:57 -06:00
										 |  |  |             $result = $this->filter->test($notice); | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-05 09:58:57 -06:00
										 |  |  |             $score = Spam_score::saveNew($notice, $result); | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-05 09:58:57 -06:00
										 |  |  |             $this->log(LOG_INFO, "Notice " . $notice->id . " has spam score " . $score->score); | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-05 09:58:57 -06:00
										 |  |  |         } catch (Exception $e) { | 
					
						
							|  |  |  |             // Log but continue 
 | 
					
						
							|  |  |  |             $this->log(LOG_ERR, $e->getMessage()); | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-05 09:09:14 -06:00
										 |  |  |     function onNoticeDeleteRelated($notice) { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |         $score = Spam_score::getKV('notice_id', $notice->id); | 
					
						
							| 
									
										
										
										
											2012-03-05 09:09:14 -06:00
										 |  |  |         if (!empty($score)) { | 
					
						
							|  |  |  |             $score->delete(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-07 07:24:28 -06:00
										 |  |  |     function onUserRightsCheck($profile, $right, &$result) { | 
					
						
							|  |  |  |         switch ($right) { | 
					
						
							|  |  |  |         case self::REVIEWSPAM: | 
					
						
							|  |  |  |         case self::TRAINSPAM: | 
					
						
							|  |  |  |             $result = ($profile->hasRole(Profile_role::MODERATOR) || $profile->hasRole('modhelper')); | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function onGetSpamFilter(&$filter) { | 
					
						
							|  |  |  |         $filter = $this->filter; | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-08 07:01:37 -06:00
										 |  |  |     function onEndShowNoticeOptionItems($nli) | 
					
						
							| 
									
										
										
										
											2012-03-07 07:24:28 -06:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2012-03-19 10:30:54 -04:00
										 |  |  |         $profile = Profile::current(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($profile) && $profile->hasRight(self::TRAINSPAM)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $notice = $nli->getNotice(); | 
					
						
							|  |  |  |             $out = $nli->getOut(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($notice)) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |                 $score = Spam_score::getKV('notice_id', $notice->id); | 
					
						
							| 
									
										
										
										
											2012-03-19 10:30:54 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 if (empty($score)) { | 
					
						
							| 
									
										
										
										
											2012-05-16 12:26:29 -04:00
										 |  |  |                     // If it's empty, we can train it.
 | 
					
						
							|  |  |  |                     $form = new TrainSpamForm($out, $notice); | 
					
						
							|  |  |  |                     $form->show(); | 
					
						
							| 
									
										
										
										
											2012-03-19 10:30:54 -04:00
										 |  |  |                 } else if ($score->is_spam) { | 
					
						
							|  |  |  |                     $form = new TrainHamForm($out, $notice); | 
					
						
							|  |  |  |                     $form->show(); | 
					
						
							|  |  |  |                 } else if (!$score->is_spam) { | 
					
						
							|  |  |  |                     $form = new TrainSpamForm($out, $notice); | 
					
						
							|  |  |  |                     $form->show(); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2012-03-07 07:24:28 -06:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2012-03-07 09:08:05 -06:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Map URLs to actions | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2014-11-07 15:24:05 +01:00
										 |  |  |      * @param URLMapper $m path-to-action mapper | 
					
						
							| 
									
										
										
										
											2012-03-07 09:08:05 -06:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value; true means continue processing, false means stop. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-07 15:24:05 +01:00
										 |  |  |     public function onRouterInitialized(URLMapper $m) | 
					
						
							| 
									
										
										
										
											2012-03-07 09:08:05 -06:00
										 |  |  |     { | 
					
						
							|  |  |  |         $m->connect('main/train/spam', | 
					
						
							|  |  |  |                     array('action' => 'train', 'category' => 'spam')); | 
					
						
							|  |  |  |         $m->connect('main/train/ham', | 
					
						
							|  |  |  |                     array('action' => 'train', 'category' => 'ham')); | 
					
						
							| 
									
										
										
										
											2012-03-07 15:40:24 -06:00
										 |  |  |         $m->connect('main/spam', | 
					
						
							|  |  |  |                     array('action' => 'spam')); | 
					
						
							| 
									
										
										
										
											2012-03-07 09:08:05 -06:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-07 14:32:05 -06:00
										 |  |  |     function onEndShowStyles($action) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $action->element('style', null, | 
					
						
							| 
									
										
										
										
											2012-03-07 15:06:27 -06:00
										 |  |  |                          '.form-train-spam input.submit { background: url('.$this->path('icons/bullet_black.png').') no-repeat 0px 0px } ' . "\n" . | 
					
						
							|  |  |  |                          '.form-train-ham input.submit { background: url('.$this->path('icons/exclamation.png').') no-repeat 0px 0px } '); | 
					
						
							| 
									
										
										
										
											2012-03-07 14:32:05 -06:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-07 15:40:24 -06:00
										 |  |  |     function onEndPublicGroupNav($nav) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $user = common_current_user(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($user) && $user->hasRight(self::REVIEWSPAM)) { | 
					
						
							|  |  |  |             $nav->out->menuItem(common_local_url('spam'), | 
					
						
							|  |  |  |                                 _m('MENU','Spam'), | 
					
						
							|  |  |  |                                 // TRANS: Menu item title in search group navigation panel.
 | 
					
						
							|  |  |  |                                 _('Notices marked as spam'), | 
					
						
							|  |  |  |                                 $nav->actionName == 'spam', | 
					
						
							|  |  |  |                                 'nav_timeline_spam'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-06 22:04:01 +02:00
										 |  |  |     function onPluginVersion(array &$versions) | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         $versions[] = array('name' => 'ActivitySpam', | 
					
						
							| 
									
										
										
										
											2013-11-01 13:51:41 +01:00
										 |  |  |                             'version' => GNUSOCIAL_VERSION, | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  |                             'author' => 'Evan Prodromou', | 
					
						
							|  |  |  |                             'homepage' => 'http://status.net/wiki/Plugin:ActivitySpam', | 
					
						
							|  |  |  |                             'description' => | 
					
						
							|  |  |  |                             _m('Test notices against the Activity Spam service.')); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-03-19 10:15:33 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-20 20:48:47 -04:00
										 |  |  |     function onEndNoticeInScope($notice, $profile, &$bResult) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2012-03-20 21:37:35 -04:00
										 |  |  |         if ($this->hideSpam) { | 
					
						
							|  |  |  |             if ($bResult) { | 
					
						
							| 
									
										
										
										
											2012-03-20 20:48:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |                 $score = Spam_score::getKV('notice_id', $notice->id); | 
					
						
							| 
									
										
										
										
											2012-03-20 20:48:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-21 13:21:14 -04:00
										 |  |  |                 if (!empty($score) && $score->is_spam) { | 
					
						
							| 
									
										
										
										
											2012-03-20 21:37:35 -04:00
										 |  |  |                     if (empty($profile) || | 
					
						
							|  |  |  |                         ($profile->id !== $notice->profile_id && | 
					
						
							|  |  |  |                          !$profile->hasRight(self::REVIEWSPAM))) { | 
					
						
							|  |  |  |                         $bResult = false; | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2012-03-20 20:48:47 -04:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-21 12:37:00 -04:00
										 |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2012-03-20 20:48:47 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2012-03-21 13:21:14 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Pre-cache our spam scores if needed. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2014-06-27 13:58:35 +02:00
										 |  |  |     function onEndNoticeListPrefill(array &$notices, array &$profiles, array $notice_ids, Profile $scoped=null) { | 
					
						
							| 
									
										
										
										
											2012-03-21 13:21:14 -04:00
										 |  |  |         if ($this->hideSpam) { | 
					
						
							| 
									
										
										
										
											2014-06-27 13:58:35 +02:00
										 |  |  |             Spam_score::multiGet('notice_id', $notice_ids); | 
					
						
							| 
									
										
										
										
											2012-03-21 13:21:14 -04:00
										 |  |  |         } | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-12-20 12:24:22 -05:00
										 |  |  | } |