. * * @category Spam * @package StatusNet * @author Evan Prodromou * @copyright 2011,2012 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); } /** * Check new notices with activity spam service. * * @category Spam * @package StatusNet * @author Evan Prodromou * @copyright 2011,2012 StatusNet, Inc. * @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; public $username = null; public $password = null; /** * Initializer * * @return boolean hook value; true means continue processing, false means stop. */ function initialize() { foreach (array('username', 'password', 'server') as $attr) { if (!$this->$attr) { $this->$attr = common_config('activityspam', $attr); } } 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()); Spam_score::upgrade(); return true; } /** * Load related modules when needed * * @param string $cls Name of the class to be loaded * * @return boolean hook value; true means continue processing, false means stop. */ function onAutoload($cls) { $dir = dirname(__FILE__); switch ($cls) { case 'Spam_score': include_once $dir . '/'.$cls.'.php'; return false; default: return true; } } /** * 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. */ function onEndNoticeSave($notice) { // FIXME: need this to autoload ActivityStreamsMediaLink $doc = new ActivityStreamJSONDocument(); $activity = $notice->asActivity(null); $client = new HTTPClient($this->server . "/is-this-spam"); $client->setMethod('POST'); $client->setAuth($this->username, $this->password); $client->setHeader('Content-Type', 'application/json'); $client->setBody(json_encode($activity->asArray())); $response = $client->send(); if (!$response->isOK()) { $this->log(LOG_ERR, "Error " . $response->getStatus() . " checking spam score: " . $response->getBody()); return true; } $result = json_decode($response->getBody()); $score = new Spam_score(); $score->notice_id = $notice->id; $score->score = $result->probability; $score->is_spam = $result->isSpam; $score->scaled = Spam_score::scale($score->score); $score->created = common_sql_now(); $score->notice_created = $notice->created; $score->insert(); $this->log(LOG_INFO, "Notice " . $notice->id . " has spam score " . $score->score); return true; } function onNoticeDeleteRelated($notice) { $score = Spam_score::staticGet('notice_id', $notice->id); if (!empty($score)) { $score->delete(); } return true; } function onPluginVersion(&$versions) { $versions[] = array('name' => 'ActivitySpam', 'version' => STATUSNET_VERSION, 'author' => 'Evan Prodromou', 'homepage' => 'http://status.net/wiki/Plugin:ActivitySpam', 'description' => _m('Test notices against the Activity Spam service.')); return true; } }