]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/plugin.php
Don't trust local HTML either
[quix0rs-gnu-social.git] / lib / plugin.php
index 59bf3ba9d695914c6544dd76dade659e97bd2dad..28040d3f84f22e1faad9348f7e93faf0c5e7cd6e 100644 (file)
@@ -65,6 +65,8 @@ class Plugin
                 Event::addHandler(mb_substr($method, 2), array($this, $method));
             }
         }
+
+        $this->setupGettext();
     }
 
     function initialize()
@@ -77,17 +79,168 @@ class Plugin
         return true;
     }
 
-    /* 
-    * the name of the shortener
-    * shortenerInfo associative array with additional information. One possible element is 'freeService' which can be true or false
-    * shortener array, first element is the name of the class, second element is an array to be passed as constructor parameters to the class
-    */
-    function registerUrlShortener($name, $shortenerInfo, $shortener)
+    /**
+     * 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);
+        $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);
+        }
+
+        $file = null;
+
+        if (preg_match('/^(\w+)(Action|Form)$/', $cls, $type)) {
+            $type = array_map('strtolower', $type);
+            $file = "$basedir/{$type[2]}s/{$type[1]}.php";
+        }
+        if (!file_exists($file)) {
+            $file = "$basedir/classes/{$cls}.php";
+
+            // library files can be put into subdirs ('_'->'/' conversion)
+            // such as LRDDMethod_WebFinger -> lib/lrddmethod/webfinger.php
+            if (!file_exists($file)) {
+                $type = strtolower($cls);
+                $type = str_replace('_', '/', $type);
+                $file = "$basedir/lib/{$type}.php";
+            }
+        }
+
+        if (!is_null($file) && file_exists($file)) {
+            require_once($file);
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * 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);
+            $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";
+                if (!file_exists($path)) {
+                    $path = INSTALLDIR . "/local/plugins/$name/locale";
+                }
+            }
+            if (file_exists($path) && is_dir($path)) {
+                bindtextdomain($name, $path);
+                bind_textdomain_codeset($name, 'UTF-8');
+            }
+        }
+    }
+
+    protected function log($level, $msg)
+    {
+        common_log($level, get_class($this) . ': '.$msg);
+    }
+
+    protected function debug($msg)
+    {
+        $this->log(LOG_DEBUG, $msg);
+    }
+    
+    public function name()
+    {
+        $cls = get_class($this);
+        return mb_substr($cls, 0, -6);
+    }
+
+    public function version()
+    {
+        return GNUSOCIAL_VERSION;
+    }
+
+    protected function userAgent() {
+        return HTTPClient::userAgent()
+                . ' (' . get_class($this) . ' v' . $this->version() . ')';
+    }
+
+    function onPluginVersion(array &$versions)
+    {
+        $name = $this->name();
+
+        $versions[] = array('name' => $name,
+                            // TRANS: Displayed as version information for a plugin if no version information was found.
+                            'version' => _('Unknown'));
+
+        return true;
+    }
+
+    function path($relative)
     {
-        global $_shorteners;
-        if(!is_array($_shorteners)){
-            $_shorteners=array();
+        return self::staticPath($this->name(), $relative);
+    }
+
+    static function staticPath($plugin, $relative)
+    {
+        $isHTTPS = GNUsocial::isHTTPS();
+
+        if ($isHTTPS) {
+            $server = common_config('plugins', 'sslserver');
+        } else {
+            $server = common_config('plugins', 'server');
         }
-        $_shorteners[$name]=array('info'=>$shortenerInfo, 'callInfo'=>$shortener);
+
+        if (empty($server)) {
+            if ($isHTTPS) {
+                $server = common_config('site', 'sslserver');
+            }
+            if (empty($server)) {
+                $server = common_config('site', 'server');
+            }
+        }
+
+        if ($isHTTPS) {
+            $path = common_config('plugins', 'sslpath');
+        } else {
+            $path = common_config('plugins', 'path');
+        }
+
+        if (empty($path)) {
+            // 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/';
+            }
+        }
+
+        if ($path[strlen($path)-1] != '/') {
+            $path .= '/';
+        }
+
+        if ($path[0] != '/') {
+            $path = '/'.$path;
+        }
+
+        $protocol = ($isHTTPS) ? 'https' : 'http';
+
+        return $protocol.'://'.$server.$path.$plugin.'/'.$relative;
     }
 }