| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  | // This file is part of GNU social - https://www.gnu.org/software/social
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social 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.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // GNU social 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 GNU social.  If not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  | defined('GNUSOCIAL') || die(); | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:30 +01:00
										 |  |  |  * Base class for plugins | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:30 +01:00
										 |  |  |  * A base class for GNU social plugin. 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. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:18 +01:00
										 |  |  |  * @category Module | 
					
						
							|  |  |  |  * @package  GNUsocial | 
					
						
							| 
									
										
										
										
											2009-08-25 18:19:04 -04:00
										 |  |  |  * @author   Evan Prodromou <evan@status.net> | 
					
						
							| 
									
										
										
										
											2019-07-12 16:31:14 +01:00
										 |  |  |  * @copyright 2010-2019 Free Software Foundation, Inc http://www.fsf.org | 
					
						
							|  |  |  |  * @license   https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @see      Event | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:30 +01:00
										 |  |  | class Plugin extends Module | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:18 +01:00
										 |  |  |     public function __construct() | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:18 +01:00
										 |  |  |         Event::addHandler('InitializePlugin', [$this, 'initialize']); | 
					
						
							|  |  |  |         Event::addHandler('CleanupPlugin', [$this, 'cleanup']); | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         foreach (get_class_methods($this) as $method) { | 
					
						
							|  |  |  |             if (mb_substr($method, 0, 2) == 'on') { | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:30 +01:00
										 |  |  |                 Event::addHandler(mb_substr($method, 2), [$this, $method]); | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2009-12-08 12:17:11 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->setupGettext(); | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:18 +01:00
										 |  |  |     public function initialize() | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:18 +01:00
										 |  |  |     public function cleanup() | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  |     { | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-12-04 15:34:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-28 15:54:26 +02:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2019-07-23 09:30:05 +01:00
										 |  |  |      * Load related components when needed | 
					
						
							| 
									
										
										
										
											2013-08-28 15:54:26 +02:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-23 09:30:05 +01:00
										 |  |  |      * Most non-trivial plugins will require extra components to do their work. Typically | 
					
						
							| 
									
										
										
										
											2013-08-28 15:54:26 +02:00
										 |  |  |      * 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 | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2019-07-23 09:30:05 +01:00
										 |  |  |      * @return bool hook value; true means continue processing, false means stop. | 
					
						
							| 
									
										
										
										
											2013-08-28 15:54:26 +02:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:18 +01:00
										 |  |  |     public function onAutoload($cls) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-08-28 15:54:26 +02:00
										 |  |  |         $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); | 
					
						
							| 
									
										
										
										
											2019-07-23 09:30:05 +01:00
										 |  |  |             $file = "{$basedir}/{$type[2]}s/{$type[1]}.php"; | 
					
						
							| 
									
										
										
										
											2013-09-30 17:13:03 +02:00
										 |  |  |         } | 
					
						
							|  |  |  |         if (!file_exists($file)) { | 
					
						
							| 
									
										
										
										
											2019-07-23 09:30:05 +01:00
										 |  |  |             $file = "{$basedir}/classes/{$cls}.php"; | 
					
						
							| 
									
										
										
										
											2013-08-28 15:54:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2019-07-23 09:30:05 +01:00
										 |  |  |                 $file = "{$basedir}/lib/{$type}.php"; | 
					
						
							| 
									
										
										
										
											2013-08-28 15:54:26 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!is_null($file) && file_exists($file)) { | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:30 +01:00
										 |  |  |             require_once $file; | 
					
						
							| 
									
										
										
										
											2013-08-28 15:54:26 +02:00
										 |  |  |             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); | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:30 +01:00
										 |  |  |         if (substr($class, -6) == 'Plugin') { | 
					
						
							| 
									
										
										
										
											2009-12-08 12:17:11 -08:00
										 |  |  |             $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.
 | 
					
						
							| 
									
										
										
										
											2019-07-23 09:30:05 +01:00
										 |  |  |                 $path = INSTALLDIR . "/plugins/{$name}/locale"; | 
					
						
							|  |  |  |                 if (!file_exists($path)) { | 
					
						
							|  |  |  |                     $path = INSTALLDIR . "/local/plugins/{$name}/locale"; | 
					
						
							| 
									
										
										
										
											2015-05-21 09:35:52 +02:00
										 |  |  |                 } | 
					
						
							| 
									
										
										
										
											2010-09-30 19:18:46 -07:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											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
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:30 +01:00
										 |  |  |     public function onPluginVersion(array &$versions): bool | 
					
						
							| 
									
										
										
										
											2010-01-07 17:33:46 -08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |         $name = $this->name(); | 
					
						
							| 
									
										
										
										
											2010-01-07 17:33:46 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:30 +01:00
										 |  |  |         $versions[] = [ | 
					
						
							|  |  |  |             'name' => $name, | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:18 +01:00
										 |  |  |             // TRANS: Displayed as version information for a plugin if no version information was found.
 | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:30 +01:00
										 |  |  |             'version' => _m('Unknown') | 
					
						
							|  |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2010-01-07 17:33:46 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:30 +01:00
										 |  |  |     public function onModuleVersion(array &$versions): bool | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:30 +01:00
										 |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:30 +01:00
										 |  |  |     public static function staticPath($plugin, $relative) | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-02-10 00:38:14 +01:00
										 |  |  |         if (GNUsocial::useHTTPS()) { | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |             $server = common_config('plugins', 'sslserver'); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $server = common_config('plugins', 'server'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-09 00:09:25 -08:00
										 |  |  |         if (empty($server)) { | 
					
						
							| 
									
										
										
										
											2016-02-10 00:38:14 +01:00
										 |  |  |             if (GNUsocial::useHTTPS()) { | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |                 $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'); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 00:38:14 +01:00
										 |  |  |         if (GNUsocial::useHTTPS()) { | 
					
						
							| 
									
										
										
										
											2011-02-11 15:58:47 -05:00
										 |  |  |             $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().
 | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:30 +01:00
										 |  |  |             if (@file_exists(PUBLICDIR . '/local/plugins/' . $plugin . '/' . $relative)) { | 
					
						
							| 
									
										
										
										
											2012-03-07 15:04:49 -06:00
										 |  |  |                 $path = common_config('site', 'path') . '/local/plugins/'; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 $path = common_config('site', 'path') . '/plugins/'; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:18 +01:00
										 |  |  |         if ($path[strlen($path) - 1] != '/') { | 
					
						
							| 
									
										
										
										
											2011-02-16 13:56:30 -05:00
										 |  |  |             $path .= '/'; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($path[0] != '/') { | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:18 +01:00
										 |  |  |             $path = '/' . $path; | 
					
						
							| 
									
										
										
										
											2011-02-16 13:56:30 -05:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-10 00:38:14 +01:00
										 |  |  |         $protocol = GNUsocial::useHTTPS() ? 'https' : 'http'; | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-12 15:03:30 +01:00
										 |  |  |         return $protocol . '://' . $server . $path . $plugin . '/' . $relative; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function path($relative) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return self::staticPath($this->name(), $relative); | 
					
						
							| 
									
										
										
										
											2011-02-03 10:36:25 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-02-09 08:47:11 -05:00
										 |  |  | } |