| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * StatusNet, the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Plugin to prevent use of nicknames or URLs on a blacklist | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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 <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  Action | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							| 
									
										
										
										
											2010-02-06 15:35:05 +01:00
										 |  |  |  * @copyright 2010 StatusNet Inc. | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('STATUSNET')) { | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Plugin to prevent use of nicknames or URLs on a blacklist | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category Plugin | 
					
						
							|  |  |  |  * @package  StatusNet | 
					
						
							|  |  |  |  * @author   Evan Prodromou <evan@status.net> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link     http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class BlacklistPlugin extends Plugin | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2010-01-08 00:38:20 -08:00
										 |  |  |     const VERSION = STATUSNET_VERSION; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  |     public $nicknames = array(); | 
					
						
							|  |  |  |     public $urls      = array(); | 
					
						
							| 
									
										
										
										
											2010-02-06 17:08:58 +01:00
										 |  |  |     public $canAdmin  = true; | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-28 15:17:44 -04:00
										 |  |  |     function _getNicknamePatterns() | 
					
						
							| 
									
										
										
										
											2010-02-06 15:54:24 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-02-26 12:29:28 -05:00
										 |  |  |         $confNicknames = $this->_configArray('blacklist', 'nicknames'); | 
					
						
							| 
									
										
										
										
											2010-02-06 17:08:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-25 13:49:12 -04:00
										 |  |  |         $dbNicknames = Nickname_blacklist::getPatterns(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-28 15:17:44 -04:00
										 |  |  |         return array_merge($this->nicknames, | 
					
						
							|  |  |  |                            $confNicknames, | 
					
						
							|  |  |  |                            $dbNicknames); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-02-06 17:08:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-28 15:17:44 -04:00
										 |  |  |     function _getUrlPatterns() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-02-26 12:29:28 -05:00
										 |  |  |         $confURLs = $this->_configArray('blacklist', 'urls'); | 
					
						
							| 
									
										
										
										
											2010-02-06 15:54:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-25 13:49:12 -04:00
										 |  |  |         $dbURLs = Homepage_blacklist::getPatterns(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-28 15:17:44 -04:00
										 |  |  |         return array_merge($this->urls, | 
					
						
							|  |  |  |                            $confURLs, | 
					
						
							|  |  |  |                            $dbURLs); | 
					
						
							| 
									
										
										
										
											2010-03-25 13:49:12 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Database schema setup | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onCheckSchema() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $schema = Schema::get(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // For storing blacklist patterns for nicknames
 | 
					
						
							|  |  |  |         $schema->ensureTable('nickname_blacklist', | 
					
						
							|  |  |  |                              array(new ColumnDef('pattern', | 
					
						
							|  |  |  |                                                  'varchar', | 
					
						
							|  |  |  |                                                  255, | 
					
						
							|  |  |  |                                                  false, | 
					
						
							|  |  |  |                                                  'PRI'), | 
					
						
							|  |  |  |                                    new ColumnDef('created', | 
					
						
							|  |  |  |                                                  'datetime', | 
					
						
							|  |  |  |                                                  null, | 
					
						
							|  |  |  |                                                  false))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $schema->ensureTable('homepage_blacklist', | 
					
						
							|  |  |  |                              array(new ColumnDef('pattern', | 
					
						
							|  |  |  |                                                  'varchar', | 
					
						
							|  |  |  |                                                  255, | 
					
						
							|  |  |  |                                                  false, | 
					
						
							|  |  |  |                                                  'PRI'), | 
					
						
							|  |  |  |                                    new ColumnDef('created', | 
					
						
							|  |  |  |                                                  'datetime', | 
					
						
							|  |  |  |                                                  null, | 
					
						
							|  |  |  |                                                  false))); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2010-02-06 15:54:24 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-06 17:08:58 +01:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Retrieve an array from configuration | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Carefully checks a section. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $section Configuration section | 
					
						
							|  |  |  |      * @param string $setting Configuration setting | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return array configuration values | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-02-06 15:54:24 +01:00
										 |  |  |     function _configArray($section, $setting) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $config = common_config($section, $setting); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($config)) { | 
					
						
							|  |  |  |             return array(); | 
					
						
							|  |  |  |         } else if (is_array($config)) { | 
					
						
							|  |  |  |             return $config; | 
					
						
							|  |  |  |         } else if (is_string($config)) { | 
					
						
							| 
									
										
										
										
											2010-02-06 17:08:58 +01:00
										 |  |  |             return explode("\r\n", $config); | 
					
						
							| 
									
										
										
										
											2010-02-06 15:54:24 +01:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2011-04-10 01:24:15 +02:00
										 |  |  |             // TRANS: Exception thrown if the Blacklist plugin configuration is incorrect.
 | 
					
						
							|  |  |  |             // TRANS: %1$s is a configuration section, %2$s is a configuration setting.
 | 
					
						
							| 
									
										
										
										
											2011-04-06 15:36:03 +02:00
										 |  |  |             throw new Exception(sprintf(_m('Unknown data type for config %1$s + %2$s.'),$section, $setting)); | 
					
						
							| 
									
										
										
										
											2010-02-06 15:54:24 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Hook registration to prevent blacklisted homepages or nicknames | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Throws an exception if there's a blacklisted homepage or nickname. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Action $action Action being called (usually register) | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2011-04-18 19:33:12 -04:00
										 |  |  |     function onStartRegisterUser(&$user, &$profile) | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-04-18 19:33:12 -04:00
										 |  |  |         $homepage = strtolower($profile->homepage); | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($homepage)) { | 
					
						
							|  |  |  |             if (!$this->_checkUrl($homepage)) { | 
					
						
							| 
									
										
										
										
											2010-10-28 01:35:40 +02:00
										 |  |  |                 // TRANS: Validation failure for URL. %s is the URL.
 | 
					
						
							|  |  |  |                 $msg = sprintf(_m("You may not register with homepage \"%s\"."), | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  |                                $homepage); | 
					
						
							|  |  |  |                 throw new ClientException($msg); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-18 19:33:12 -04:00
										 |  |  |         $nickname = strtolower($profile->nickname); | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($nickname)) { | 
					
						
							|  |  |  |             if (!$this->_checkNickname($nickname)) { | 
					
						
							| 
									
										
										
										
											2010-10-28 01:35:40 +02:00
										 |  |  |                 // TRANS: Validation failure for nickname. %s is the nickname.
 | 
					
						
							|  |  |  |                 $msg = sprintf(_m("You may not register with nickname \"%s\"."), | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  |                                $nickname); | 
					
						
							|  |  |  |                 throw new ClientException($msg); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Hook profile update to prevent blacklisted homepages or nicknames | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Throws an exception if there's a blacklisted homepage or nickname. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Action $action Action being called (usually register) | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onStartProfileSaveForm($action) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $homepage = strtolower($action->trimmed('homepage')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($homepage)) { | 
					
						
							|  |  |  |             if (!$this->_checkUrl($homepage)) { | 
					
						
							| 
									
										
										
										
											2010-10-28 01:35:40 +02:00
										 |  |  |                 // TRANS: Validation failure for URL. %s is the URL.
 | 
					
						
							|  |  |  |                 $msg = sprintf(_m("You may not use homepage \"%s\"."), | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  |                                $homepage); | 
					
						
							|  |  |  |                 throw new ClientException($msg); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $nickname = strtolower($action->trimmed('nickname')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($nickname)) { | 
					
						
							|  |  |  |             if (!$this->_checkNickname($nickname)) { | 
					
						
							| 
									
										
										
										
											2010-10-28 01:35:40 +02:00
										 |  |  |                 // TRANS: Validation failure for nickname. %s is the nickname.
 | 
					
						
							|  |  |  |                 $msg = sprintf(_m("You may not use nickname \"%s\"."), | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  |                                $nickname); | 
					
						
							|  |  |  |                 throw new ClientException($msg); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Hook notice save to prevent blacklisted urls | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Throws an exception if there's a blacklisted url in the content. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Notice &$notice Notice being saved | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onStartNoticeSave(&$notice) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         common_replace_urls_callback($notice->content, | 
					
						
							|  |  |  |                                      array($this, 'checkNoticeUrl')); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Helper callback for notice save | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Throws an exception if there's a blacklisted url in the content. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $url URL in the notice content | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function checkNoticeUrl($url) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // It comes in special'd, so we unspecial it
 | 
					
						
							|  |  |  |         // before comparing against patterns
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $url = htmlspecialchars_decode($url); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!$this->_checkUrl($url)) { | 
					
						
							| 
									
										
										
										
											2010-10-28 01:35:40 +02:00
										 |  |  |             // TRANS: Validation failure for URL. %s is the URL.
 | 
					
						
							| 
									
										
										
										
											2010-09-18 15:38:15 +02:00
										 |  |  |             $msg = sprintf(_m("You may not use URL \"%s\" in notices."), | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  |                            $url); | 
					
						
							|  |  |  |             throw new ClientException($msg); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $url; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Helper for checking URLs | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Checks an URL against our patterns for a match. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $url URL to check | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean true means it's OK, false means it's bad | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function _checkUrl($url) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-03-28 15:17:44 -04:00
										 |  |  |         $patterns = $this->_getUrlPatterns(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($patterns as $pattern) { | 
					
						
							| 
									
										
										
										
											2010-04-23 07:17:52 -07:00
										 |  |  |             if ($pattern != '' && preg_match("/$pattern/", $url)) { | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Helper for checking nicknames | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Checks a nickname against our patterns for a match. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $nickname nickname to check | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean true means it's OK, false means it's bad | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function _checkNickname($nickname) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-03-28 15:17:44 -04:00
										 |  |  |         $patterns = $this->_getNicknamePatterns(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($patterns as $pattern) { | 
					
						
							| 
									
										
										
										
											2010-04-23 07:17:52 -07:00
										 |  |  |             if ($pattern != '' && preg_match("/$pattern/", $nickname)) { | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-01-08 00:38:20 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-06 17:08:58 +01:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Add our actions to the URL router | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Net_URL_Mapper $m URL mapper for this hit | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook return | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onRouterInitialized($m) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-01-23 10:18:35 -05:00
										 |  |  |         $m->connect('panel/blacklist', array('action' => 'blacklistadminpanel')); | 
					
						
							| 
									
										
										
										
											2010-02-06 17:08:58 +01:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Auto-load our classes if called | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $cls Class to load | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook return | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onAutoload($cls) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         switch (strtolower($cls)) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2010-03-25 13:49:12 -04:00
										 |  |  |         case 'nickname_blacklist': | 
					
						
							|  |  |  |         case 'homepage_blacklist': | 
					
						
							|  |  |  |             include_once INSTALLDIR.'/plugins/Blacklist/'.ucfirst($cls).'.php'; | 
					
						
							|  |  |  |             return false; | 
					
						
							| 
									
										
										
										
											2010-02-06 17:08:58 +01:00
										 |  |  |         case 'blacklistadminpanelaction': | 
					
						
							|  |  |  |             $base = strtolower(mb_substr($cls, 0, -6)); | 
					
						
							|  |  |  |             include_once INSTALLDIR.'/plugins/Blacklist/'.$base.'.php'; | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Plugin version data | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param array &$versions array of version blocks | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-01-08 00:38:20 -08:00
										 |  |  |     function onPluginVersion(&$versions) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $versions[] = array('name' => 'Blacklist', | 
					
						
							|  |  |  |                             'version' => self::VERSION, | 
					
						
							|  |  |  |                             'author' => 'Evan Prodromou', | 
					
						
							| 
									
										
										
										
											2010-02-06 17:08:58 +01:00
										 |  |  |                             'homepage' => | 
					
						
							|  |  |  |                             'http://status.net/wiki/Plugin:Blacklist', | 
					
						
							| 
									
										
										
										
											2010-01-08 00:38:20 -08:00
										 |  |  |                             'description' => | 
					
						
							| 
									
										
										
										
											2011-04-06 15:36:03 +02:00
										 |  |  |                             // TRANS: Plugin description.
 | 
					
						
							| 
									
										
										
										
											2010-09-14 21:45:13 +02:00
										 |  |  |                             _m('Keeps a blacklist of forbidden nickname '. | 
					
						
							| 
									
										
										
										
											2010-02-06 17:08:58 +01:00
										 |  |  |                                'and URL patterns.')); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Determines if our admin panel can be shown | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string  $name  name of the admin panel | 
					
						
							|  |  |  |      * @param boolean &$isOK result | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onAdminPanelCheck($name, &$isOK) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($name == 'blacklist') { | 
					
						
							|  |  |  |             $isOK = $this->canAdmin; | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Add our tab to the admin panel | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Widget $nav Admin panel nav | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onEndAdminPanelNav($nav) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (AdminPanelAction::canAdmin('blacklist')) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $action_name = $nav->action->trimmed('action'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $nav->out->menuItem(common_local_url('blacklistadminpanel'), | 
					
						
							| 
									
										
										
										
											2010-10-28 01:35:40 +02:00
										 |  |  |                                 // TRANS: Menu item in admin panel.
 | 
					
						
							|  |  |  |                                 _m('MENU','Blacklist'), | 
					
						
							|  |  |  |                                 // TRANS: Tooltip for menu item in admin panel.
 | 
					
						
							| 
									
										
										
										
											2011-04-06 15:36:03 +02:00
										 |  |  |                                 _m('TOOLTIP','Blacklist configuration.'), | 
					
						
							| 
									
										
										
										
											2010-02-06 17:08:58 +01:00
										 |  |  |                                 $action_name == 'blacklistadminpanel', | 
					
						
							|  |  |  |                                 'nav_blacklist_admin_panel'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-08 00:38:20 -08:00
										 |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-02-26 12:29:28 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function onEndDeleteUserForm($action, $user) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $cur = common_current_user(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($cur) || !$cur->hasRight(Right::CONFIGURESITE)) { | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $profile = $user->getProfile(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($profile)) { | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $action->elementStart('ul', 'form_data'); | 
					
						
							|  |  |  |         $action->elementStart('li'); | 
					
						
							|  |  |  |         $this->checkboxAndText($action, | 
					
						
							|  |  |  |                                'blacklistnickname', | 
					
						
							| 
									
										
										
										
											2011-04-06 15:36:03 +02:00
										 |  |  |                                // TRANS: Checkbox label in the blacklist user form.
 | 
					
						
							| 
									
										
										
										
											2010-09-14 21:45:13 +02:00
										 |  |  |                                _m('Add this nickname pattern to blacklist'), | 
					
						
							| 
									
										
										
										
											2010-02-26 12:29:28 -05:00
										 |  |  |                                'blacklistnicknamepattern', | 
					
						
							|  |  |  |                                $this->patternizeNickname($user->nickname)); | 
					
						
							|  |  |  |         $action->elementEnd('li'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($profile->homepage)) { | 
					
						
							|  |  |  |             $action->elementStart('li'); | 
					
						
							|  |  |  |             $this->checkboxAndText($action, | 
					
						
							|  |  |  |                                    'blacklisthomepage', | 
					
						
							| 
									
										
										
										
											2011-04-06 15:36:03 +02:00
										 |  |  |                                    // TRANS: Checkbox label in the blacklist user form.
 | 
					
						
							| 
									
										
										
										
											2010-09-14 21:45:13 +02:00
										 |  |  |                                    _m('Add this homepage pattern to blacklist'), | 
					
						
							| 
									
										
										
										
											2010-02-26 12:29:28 -05:00
										 |  |  |                                    'blacklisthomepagepattern', | 
					
						
							|  |  |  |                                    $this->patternizeHomepage($profile->homepage)); | 
					
						
							|  |  |  |             $action->elementEnd('li'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $action->elementEnd('ul'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function onEndDeleteUser($action, $user) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($action->boolean('blacklisthomepage')) { | 
					
						
							|  |  |  |             $pattern = $action->trimmed('blacklisthomepagepattern'); | 
					
						
							| 
									
										
										
										
											2010-03-25 13:49:12 -04:00
										 |  |  |             Homepage_blacklist::ensurePattern($pattern); | 
					
						
							| 
									
										
										
										
											2010-02-26 12:29:28 -05:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($action->boolean('blacklistnickname')) { | 
					
						
							|  |  |  |             $pattern = $action->trimmed('blacklistnicknamepattern'); | 
					
						
							| 
									
										
										
										
											2010-03-25 13:49:12 -04:00
										 |  |  |             Nickname_blacklist::ensurePattern($pattern); | 
					
						
							| 
									
										
										
										
											2010-02-26 12:29:28 -05:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function checkboxAndText($action, $checkID, $label, $textID, $value) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $action->element('input', array('name' => $checkID, | 
					
						
							|  |  |  |                                         'type' => 'checkbox', | 
					
						
							|  |  |  |                                         'class' => 'checkbox', | 
					
						
							|  |  |  |                                         'id' => $checkID)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $action->text(' '); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $action->element('label', array('class' => 'checkbox', | 
					
						
							|  |  |  |                                         'for' => $checkID), | 
					
						
							|  |  |  |                          $label); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $action->text(' '); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $action->element('input', array('name' => $textID, | 
					
						
							|  |  |  |                                         'type' => 'text', | 
					
						
							|  |  |  |                                         'id' => $textID, | 
					
						
							|  |  |  |                                         'value' => $value)); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function patternizeNickname($nickname) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $nickname; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function patternizeHomepage($homepage) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $hostname = parse_url($homepage, PHP_URL_HOST); | 
					
						
							|  |  |  |         return $hostname; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-10-26 11:20:43 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function onStartHandleFeedEntry($activity) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->_checkActivity($activity); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function onStartHandleSalmon($activity) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->_checkActivity($activity); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function _checkActivity($activity) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $actor = $activity->actor; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($actor)) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $homepage = strtolower($actor->link); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($homepage)) { | 
					
						
							|  |  |  |             if (!$this->_checkUrl($homepage)) { | 
					
						
							| 
									
										
										
										
											2010-10-28 01:35:40 +02:00
										 |  |  |                 // TRANS: Exception thrown trying to post a notice while having set a blocked homepage URL. %s is the blocked URL.
 | 
					
						
							| 
									
										
										
										
											2011-04-06 15:36:03 +02:00
										 |  |  |                 $msg = sprintf(_m("Users from \"%s\" are blocked."), | 
					
						
							| 
									
										
										
										
											2010-10-26 11:20:43 -04:00
										 |  |  |                                $homepage); | 
					
						
							|  |  |  |                 throw new ClientException($msg); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $nickname = strtolower($actor->poco->preferredUsername); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($nickname)) { | 
					
						
							|  |  |  |             if (!$this->_checkNickname($nickname)) { | 
					
						
							| 
									
										
										
										
											2010-10-28 01:35:40 +02:00
										 |  |  |                 // TRANS: Exception thrown trying to post a notice while having a blocked nickname. %s is the blocked nickname.
 | 
					
						
							| 
									
										
										
										
											2011-04-06 15:36:03 +02:00
										 |  |  |                 $msg = sprintf(_m("Notices from nickname \"%s\" disallowed."), | 
					
						
							| 
									
										
										
										
											2010-10-26 11:20:43 -04:00
										 |  |  |                                $nickname); | 
					
						
							|  |  |  |                 throw new ClientException($msg); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-10-26 11:48:27 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Check URLs and homepages for blacklisted users. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onStartSubscribe($subscriber, $other) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         foreach (array($other->profileurl, $other->homepage) as $url) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (empty($url)) { | 
					
						
							|  |  |  |                 continue; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $url = strtolower($url); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!$this->_checkUrl($url)) { | 
					
						
							| 
									
										
										
										
											2010-10-28 01:35:40 +02:00
										 |  |  |                 // TRANS: Client exception thrown trying to subscribe to a person with a blocked homepage or site URL. %s is the blocked URL.
 | 
					
						
							| 
									
										
										
										
											2011-04-06 15:36:03 +02:00
										 |  |  |                 $msg = sprintf(_m("Users from \"%s\" are blocked."), | 
					
						
							| 
									
										
										
										
											2010-10-26 11:48:27 -04:00
										 |  |  |                                $url); | 
					
						
							|  |  |  |                 throw new ClientException($msg); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $nickname = $other->nickname; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($nickname)) { | 
					
						
							|  |  |  |             if (!$this->_checkNickname($nickname)) { | 
					
						
							| 
									
										
										
										
											2010-10-28 01:35:40 +02:00
										 |  |  |                 // TRANS: Client exception thrown trying to subscribe to a person with a blocked nickname. %s is the blocked nickname.
 | 
					
						
							| 
									
										
										
										
											2011-04-06 15:36:03 +02:00
										 |  |  |                 $msg = sprintf(_m("Cannot subscribe to nickname \"%s\"."), | 
					
						
							| 
									
										
										
										
											2010-10-26 11:48:27 -04:00
										 |  |  |                                $nickname); | 
					
						
							|  |  |  |                 throw new ClientException($msg); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-12-28 12:42:22 -08:00
										 |  |  | } |