]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - plugins/Minify/MinifyPlugin.php
XSS vulnerability when remote-subscribing
[quix0rs-gnu-social.git] / plugins / Minify / MinifyPlugin.php
1 <?php
2 /*
3 StatusNet Plugin: 0.9
4 Plugin Name: Minify
5 Description: Minifies resources (Javascript and CSS)
6 Version: 0.1
7 Author: Craig Andrews <candrews@integralblue.com>
8 Author URI: http://candrews.integralblue.com/
9 */
10
11 /*
12  * StatusNet - the distributed open-source microblogging tool
13  * Copyright (C) 2009, StatusNet, Inc.
14  *
15  * This program is free software: you can redistribute it and/or modify
16  * it under the terms of the GNU Affero General Public License as published by
17  * the Free Software Foundation, either version 3 of the License, or
18  * (at your option) any later version.
19  *
20  * This program is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23  * GNU Affero General Public License for more details.
24  *
25  * You should have received a copy of the GNU Affero General Public License
26  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
27  */
28
29 /**
30  * @package MinifyPlugin
31  * @maintainer Craig Andrews <candrews@integralblue.com>
32  * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org
33  */
34
35 if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
36
37 // We bundle the minify library...
38 set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/minify/min/lib');
39
40 class MinifyPlugin extends Plugin
41 {
42     private $minifyInlineJs = true;
43     private $minifyInlineCss = true;
44
45     const cacheKey = 'minify';
46
47     /**
48      * Add Minification related paths to the router table
49      *
50      * Hook for RouterInitialized event.
51      *
52      * @return boolean hook return
53      */
54     function onStartInitializeRouter($m)
55     {
56         $m->connect('main/min',
57                     array('action' => 'minify'));
58         return true;
59     }
60
61     function onLoginAction($action, &$login)
62     {
63         switch ($action)
64         {
65          case 'minify':
66             $login = true;
67             return false;
68          default:
69             return true;
70         }
71     }
72
73     function onStartScriptElement($action,&$src,&$type) {
74         $url = parse_url($src);
75         if( empty($url['scheme']) && empty($url['host']) && empty($url['query']) && empty($url['fragment']))
76         {
77             if (strpos($src, 'plugins/') === 0 || strpos($src, 'local/') === 0) {
78                 $src = $this->minifyUrl($src);
79             } else {
80                 $src = $this->minifyUrl('js/'.$src);
81             }
82         }
83     }
84
85     function onStartCssLinkElement($action,&$src,&$theme,&$media) {
86         $allowThemeMinification =
87             is_null(common_config('theme', 'dir'))
88             && is_null(common_config('theme', 'path'))
89             && is_null(common_config('theme', 'server'));
90         $url = parse_url($src);
91         if( empty($url['scheme']) && empty($url['host']) && empty($url['query']) && empty($url['fragment']))
92         {
93             if(!isset($theme)) {
94                 $theme = common_config('site', 'theme');
95             }
96             if($allowThemeMinification && file_exists(INSTALLDIR.'/local/theme/'.$theme.'/'.$src)) {
97                 $src = $this->minifyUrl('local/theme/'.$theme.'/'.$src);
98             } else if($allowThemeMinification && file_exists(INSTALLDIR.'/theme/'.$theme.'/'.$src)) {
99                 $src = $this->minifyUrl('theme/'.$theme.'/'.$src);
100             }else if(file_exists(INSTALLDIR.'/'.$src)){
101                 $src = $this->minifyUrl($src);
102             }
103         }
104     }
105
106     function onStartInlineScriptElement($action,&$code,&$type)
107     {
108         if($this->minifyInlineJs && $type=='text/javascript'){
109             $c = Cache::instance();
110             if (!empty($c)) {
111                 $cacheKey = Cache::key(self::cacheKey . ':' . crc32($code));
112                 $out = $c->get($cacheKey);
113             }
114             if(empty($out)) {
115                 $out = $this->minifyJs($code);
116             }
117             if (!empty($c)) {
118                 $c->set($cacheKey, $out);
119             }
120             if(!empty($out)) {
121                 $code = $out;
122             }
123         }
124     }
125
126     function onStartStyleElement($action,&$code,&$type,&$media)
127     {
128         if($this->minifyInlineCss && $type=='text/css'){
129             $c = Cache::instance();
130             if (!empty($c)) {
131                 $cacheKey = Cache::key(self::cacheKey . ':' . crc32($code));
132                 $out = $c->get($cacheKey);
133             }
134             if(empty($out)) {
135                 $out = $this->minifyCss($code);
136             }
137             if (!empty($c)) {
138                 $c->set($cacheKey, $out);
139             }
140             if(!empty($out)) {
141                 $code = $out;
142             }
143         }
144     }
145
146     function minifyUrl($src) {
147         return common_local_url('minify',null,array('f' => $src ,v => GNUSOCIAL_VERSION));
148     }
149
150     static function minifyJs($code) {
151         require_once('JSMin.php');
152         return JSMin::minify($code);
153     }
154
155     static function minifyCss($code, $options = array()) {
156         require_once('Minify/CSS.php');
157         return Minify_CSS::minify($code,$options);
158     }
159
160     function onPluginVersion(array &$versions)
161     {
162         $versions[] = array('name' => 'Minify',
163                             'version' => GNUSOCIAL_VERSION,
164                             'author' => 'Craig Andrews',
165                             'homepage' => 'http://status.net/wiki/Plugin:Minify',
166                             'rawdescription' =>
167                             // TRANS: Plugin description.
168                             _m('The Minify plugin minifies StatusNet\'s CSS and JavaScript, removing whitespace and comments.'));
169         return true;
170     }
171 }