| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * StatusNet, the distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Utility class for plugins | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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  Plugin | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @package   StatusNet | 
					
						
							| 
									
										
										
										
											2009-08-25 18:19:04 -04:00
										 |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @copyright 2008 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							| 
									
										
										
										
											2009-08-25 18:16:46 -04:00
										 |  |  |  * @link      http://status.net/ | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-26 10:41:36 -04:00
										 |  |  | if (!defined('STATUSNET') && !defined('LACONICA')) { | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Base class for plugins | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * A base class for StatusNet plugins. Mostly a light wrapper around | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |  * the Event framework. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Subclasses of Plugin will automatically handle an event if they define | 
					
						
							|  |  |  |  * a method called "onEventName". (Well, OK -- only if they call parent::__construct() | 
					
						
							|  |  |  |  * in their constructors.) | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * They will also automatically handle the InitializePlugin and CleanupPlugin with the | 
					
						
							|  |  |  |  * initialize() and cleanup() methods, respectively. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category Plugin | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * @package  StatusNet | 
					
						
							| 
									
										
										
										
											2009-08-25 18:19:04 -04:00
										 |  |  |  * @author   Evan Prodromou <evan@status.net> | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							| 
									
										
										
										
											2009-08-25 18:16:46 -04:00
										 |  |  |  * @link     http://status.net/ | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @see      Event | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Plugin | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     function __construct() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         Event::addHandler('InitializePlugin', array($this, 'initialize')); | 
					
						
							|  |  |  |         Event::addHandler('CleanupPlugin', array($this, 'cleanup')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach (get_class_methods($this) as $method) { | 
					
						
							|  |  |  |             if (mb_substr($method, 0, 2) == 'on') { | 
					
						
							|  |  |  |                 Event::addHandler(mb_substr($method, 2), array($this, $method)); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-12-08 12:17:11 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->setupGettext(); | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function initialize() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function cleanup() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-12-04 15:34:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-28 15:54:26 +02:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Load related modules when needed | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Most non-trivial plugins will require extra modules to do their work. Typically | 
					
						
							|  |  |  |      * these include data classes, action classes, widget classes, or external libraries. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * This method receives a class name and loads the PHP file related to that class. By | 
					
						
							|  |  |  |      * tradition, action classes typically have files named for the action, all lower-case. | 
					
						
							|  |  |  |      * Data classes are in files with the data class name, initial letter capitalized. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Note that this method will be called for *all* overloaded classes, not just ones | 
					
						
							|  |  |  |      * in this plugin! So, make sure to return true by default to let other plugins, and | 
					
						
							|  |  |  |      * the core code, get a chance. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $cls Name of the class to be loaded | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value; true means continue processing, false means stop. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function onAutoload($cls) { | 
					
						
							|  |  |  |         $cls = basename($cls); | 
					
						
							| 
									
										
										
										
											2013-12-31 23:56:56 +00:00
										 |  |  |         $basedir = INSTALLDIR . '/local/plugins/' . mb_substr(get_called_class(), 0, -6); | 
					
						
							|  |  |  |         if (!file_exists($basedir)) { | 
					
						
							|  |  |  |             $basedir = INSTALLDIR . '/plugins/' . mb_substr(get_called_class(), 0, -6); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-28 15:54:26 +02:00
										 |  |  |         $file = null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (preg_match('/^(\w+)(Action|Form)$/', $cls, $type)) { | 
					
						
							|  |  |  |             $type = array_map('strtolower', $type); | 
					
						
							|  |  |  |             $file = "$basedir/{$type[2]}s/{$type[1]}.php"; | 
					
						
							| 
									
										
										
										
											2013-09-30 17:13:03 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |         if (!file_exists($file)) { | 
					
						
							| 
									
										
										
										
											2013-08-28 15:54:26 +02:00
										 |  |  |             $file = "$basedir/classes/{$cls}.php"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-30 17:13:03 +02:00
										 |  |  |             // library files can be put into subdirs ('_'->'/' conversion)
 | 
					
						
							|  |  |  |             // such as LRDDMethod_WebFinger -> lib/lrddmethod/webfinger.php
 | 
					
						
							| 
									
										
										
										
											2013-08-28 15:54:26 +02:00
										 |  |  |             if (!file_exists($file)) { | 
					
						
							|  |  |  |                 $type = strtolower($cls); | 
					
						
							| 
									
										
										
										
											2013-09-30 17:13:03 +02:00
										 |  |  |                 $type = str_replace('_', '/', $type); | 
					
						
							| 
									
										
										
										
											2013-08-28 15:54:26 +02:00
										 |  |  |                 $file = "$basedir/lib/{$type}.php"; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!is_null($file) && file_exists($file)) { | 
					
						
							|  |  |  |             require_once($file); | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-08 12:17:11 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Checks if this plugin has localization that needs to be set up. | 
					
						
							|  |  |  |      * Gettext localizations can be called via the _m() helper function. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function setupGettext() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $class = get_class($this); | 
					
						
							|  |  |  |         if (substr($class, -6) == 'Plugin') { | 
					
						
							|  |  |  |             $name = substr($class, 0, -6); | 
					
						
							| 
									
										
										
										
											2010-09-30 19:18:46 -07:00
										 |  |  |             $path = common_config('plugins', 'locale_path'); | 
					
						
							|  |  |  |             if (!$path) { | 
					
						
							|  |  |  |                 // @fixme this will fail for things installed in local/plugins
 | 
					
						
							|  |  |  |                 // ... but then so will web links so far.
 | 
					
						
							|  |  |  |                 $path = INSTALLDIR . "/plugins/$name/locale"; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2009-12-08 12:17:11 -08:00
										 |  |  |             if (file_exists($path) && is_dir($path)) { | 
					
						
							|  |  |  |                 bindtextdomain($name, $path); | 
					
						
							| 
									
										
										
										
											2010-04-28 23:06:08 +00:00
										 |  |  |                 bind_textdomain_codeset($name, 'UTF-8'); | 
					
						
							| 
									
										
										
										
											2009-12-08 12:17:11 -08:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-04 15:34:25 -05:00
										 |  |  |     protected function log($level, $msg) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         common_log($level, get_class($this) . ': '.$msg); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected function debug($msg) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->log(LOG_DEBUG, $msg); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2013-11-01 13:28:52 +01:00
										 |  |  |     public function name() | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         $cls = get_class($this); | 
					
						
							|  |  |  |         return mb_substr($cls, 0, -6); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-01-07 17:33:46 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-01 13:28:52 +01:00
										 |  |  |     public function version() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return GNUSOCIAL_VERSION; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected function userAgent() { | 
					
						
							|  |  |  |         return HTTPClient::userAgent() | 
					
						
							|  |  |  |                 . ' (' . get_class($this) . ' v' . $this->version() . ')'; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-07 17:33:46 -08:00
										 |  |  |     function onPluginVersion(&$versions) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |         $name = $this->name(); | 
					
						
							| 
									
										
										
										
											2010-01-07 17:33:46 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $versions[] = array('name' => $name, | 
					
						
							| 
									
										
										
										
											2010-09-12 17:49:56 +02:00
										 |  |  |                             // TRANS: Displayed as version information for a plugin if no version information was found.
 | 
					
						
							| 
									
										
										
										
											2010-01-07 17:33:46 -08:00
										 |  |  |                             'version' => _('Unknown')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function path($relative) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return self::staticPath($this->name(), $relative); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function staticPath($plugin, $relative) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $isHTTPS = StatusNet::isHTTPS(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($isHTTPS) { | 
					
						
							|  |  |  |             $server = common_config('plugins', 'sslserver'); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $server = common_config('plugins', 'server'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-09 00:09:25 -08:00
										 |  |  |         if (empty($server)) { | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |             if ($isHTTPS) { | 
					
						
							|  |  |  |                 $server = common_config('site', 'sslserver'); | 
					
						
							| 
									
										
										
										
											2011-02-09 00:04:01 -08:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2011-02-09 00:09:25 -08:00
										 |  |  |             if (empty($server)) { | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |                 $server = common_config('site', 'server'); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-11 15:58:47 -05:00
										 |  |  |         if ($isHTTPS) { | 
					
						
							|  |  |  |             $path = common_config('plugins', 'sslpath'); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $path = common_config('plugins', 'path'); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-09 00:09:25 -08:00
										 |  |  |         if (empty($path)) { | 
					
						
							| 
									
										
										
										
											2012-03-07 15:04:49 -06:00
										 |  |  |             // XXX: extra stat().
 | 
					
						
							|  |  |  |             if (@file_exists(INSTALLDIR.'/local/plugins/'.$plugin.'/'.$relative)) { | 
					
						
							|  |  |  |                 $path = common_config('site', 'path') . '/local/plugins/'; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 $path = common_config('site', 'path') . '/plugins/'; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-16 13:56:30 -05:00
										 |  |  |         if ($path[strlen($path)-1] != '/') { | 
					
						
							|  |  |  |             $path .= '/'; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($path[0] != '/') { | 
					
						
							|  |  |  |             $path = '/'.$path; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |         $protocol = ($isHTTPS) ? 'https' : 'http'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $protocol.'://'.$server.$path.$plugin.'/'.$relative; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  | } |