Copyright updated
[mailer.git] / 0.2.1 / inc / load_extensions.php
1 <?php\r
2 /************************************************************************\r
3  * MXChange v0.2.1                                    Start: 06/26/2004 *\r
4  * ===============                              Last change: 07/01/2005 *\r
5  *                                                                      *\r
6  * -------------------------------------------------------------------- *\r
7  * File              : load_extensions.php                              *\r
8  * -------------------------------------------------------------------- *\r
9  * Short description : Load all extensions                              *\r
10  * -------------------------------------------------------------------- *\r
11  * Kurzbeschreibung  : Alle Erweiterungen laden                         *\r
12  * -------------------------------------------------------------------- *\r
13  *                                                                      *\r
14  * -------------------------------------------------------------------- *\r
15  * Copyright (c) 2003 - 2008 by Roland Haeder                           *\r
16  * For more information visit: http://www.mxchange.org                  *\r
17  *                                                                      *\r
18  * This program is free software; you can redistribute it and/or modify *\r
19  * it under the terms of the GNU General Public License as published by *\r
20  * the Free Software Foundation; either version 2 of the License, or    *\r
21  * (at your option) any later version.                                  *\r
22  *                                                                      *\r
23  * This program is distributed in the hope that it will be useful,      *\r
24  * but WITHOUT ANY WARRANTY; without even the implied warranty of       *\r
25  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *\r
26  * GNU General Public License for more details.                         *\r
27  *                                                                      *\r
28  * You should have received a copy of the GNU General Public License    *\r
29  * along with this program; if not, write to the Free Software          *\r
30  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,               *\r
31  * MA  02110-1301  USA                                                  *\r
32  ************************************************************************/\r
33 \r
34 // Some security stuff...\r
35 if (ereg(basename(__FILE__), $_SERVER['PHP_SELF']))\r
36 {\r
37         $INC = substr(dirname(__FILE__), 0, strpos(dirname(__FILE__), "/inc") + 4)."/security.php";\r
38         require($INC);\r
39 }\r
40 //\r
41 global $EXT_CSS_FILES;\r
42 $EXT_CSS_FILES = array();\r
43 $ADD = "";\r
44 \r
45 // Skip loading extensions\r
46 if ((!mxchange_installed) || (mxchange_installing)) return;\r
47 \r
48 // Load default sql_patches extension if present\r
49 if (file_exists(PATH."inc/extensions/ext-sql_patches.php") && is_readable(PATH."inc/extensions/ext-sql_patches.php"))\r
50 {\r
51         // Load it...\r
52         $EXT_LOAD_MODE = "";\r
53         require_once(PATH."inc/extensions/ext-sql_patches.php");\r
54         $KEEP_ACTIVE = array('sql_patches' => "Y"); // KEEP THIS ALWAYS ACTIVE!\r
55 }\r
56  else\r
57 {\r
58         // Initialize array for "always keep active extensions"\r
59         $KEEP_ACTIVE = array();\r
60 }\r
61 \r
62 //\r
63 // Load extensions\r
64 //\r
65 if (EXT_IS_ACTIVE("cache"))\r
66 {\r
67         // Load cache extension alone\r
68         include_once(PATH."inc/libs/cache_functions.php");\r
69         $CACHE_FILE = "";\r
70         include_once(PATH."inc/extensions/ext-cache.php");\r
71         switch($CACHE->cache_file("extensions", true))\r
72         {\r
73                 case true : $CACHE_FILE = "load"; break;\r
74                 case false: $CACHE_FILE = "init"; break;\r
75         }\r
76 \r
77         // Do not recreate cache file when it's switched off!\r
78         if (($CACHE_FILE == "init") && ($CONFIG['cache_exts'] == "N")) $CACHE_FILE = "skip";\r
79 \r
80         // Load language\r
81         if ($CACHE_FILE == "load") include(PATH."inc/language/cache_".GET_LANGUAGE().".php");\r
82 }\r
83  else\r
84 {\r
85         $CACHE_FILE = "no";\r
86 }\r
87 \r
88 if ($CACHE_FILE == "load")\r
89 {\r
90         // Load more cache files (like admins)\r
91         require_once(PATH."inc/load_cache.php");\r
92 \r
93         // Re-initialize handler\r
94         $CACHE->cache_file("extensions", true);\r
95 \r
96         // Load extension data from cache file\r
97         $EXT_DUMMY = $CACHE->cache_load();\r
98         foreach ($EXT_DUMMY['ext_name'] as $k=>$name)\r
99         {\r
100                 // Load functions file\r
101                 if ($EXT_DUMMY['ext_funcs'][$k] == "Y") require_once(PATH."inc/libs/".$name."_functions.php");\r
102 \r
103                 // Load Language file\r
104                 if ($EXT_DUMMY['ext_lang'][$k] == "Y")\r
105                 {\r
106                         $INC = sprintf(PATH."inc/language/%s_%s.php", $name, GET_LANGUAGE());\r
107                         if (file_exists($INC)) require_once($INC);\r
108                 }\r
109 \r
110                 // Load CSS file\r
111                 if ($EXT_DUMMY['ext_css'][$k] == "Y") $EXT_CSS_FILES[] = "".$name.".css";\r
112 \r
113                 // Load extension file itself\r
114                 if (($EXT_DUMMY['ext_active'][$k] == "Y") || ($EXT_DUMMY['ext_keep'][$k] == "Y") || (IS_ADMIN()))\r
115                 {\r
116                         require_once(PATH."inc/extensions/ext-".$name.".php");\r
117                 }\r
118 \r
119                 // Transfer version number and active status\r
120                 $EXT_DUMMY['ext_version'][$name] = $EXT_DUMMY['ext_version'][$k];\r
121                 unset($EXT_DUMMY['ext_version'][$k]);\r
122                 $EXT_DUMMY['ext_active'][$name] = $EXT_DUMMY['ext_active'][$k];\r
123                 unset($EXT_DUMMY['ext_active'][$k]);\r
124                 $EXT_DUMMY['ext_menu'][$name] = $EXT_DUMMY['ext_menu'][$k];\r
125                 unset($EXT_DUMMY['ext_menu'][$k]);\r
126                 $KEEP_ACTIVE['$name'] = $EXT_DUMMY['ext_keep'][$k];\r
127                 unset($EXT_DUMMY['ext_keep'][$k]);\r
128                 $k2 = $EXT_DUMMY['ext_id'][$k];\r
129                 $EXT_DUMMY['ext_id'][$k2] = $name;\r
130                 if ($k2 != $k) unset($EXT_DUMMY['ext_id'][$k]);\r
131 \r
132                 // Remove unneccessary data from memory\r
133                 unset($EXT_DUMMY['ext_lang'][$k]);\r
134                 unset($EXT_DUMMY['ext_css'][$k]);\r
135                 unset($EXT_DUMMY['ext_funcs'][$k]);\r
136         }\r
137 \r
138         // Close cache file\r
139         $CACHE->cache_close();\r
140 \r
141         // Loading cache is done so let's free some memory!\r
142         unset($EXT_DUMMY['ext_lang']);\r
143         unset($EXT_DUMMY['ext_keep']);\r
144         unset($EXT_DUMMY['ext_css']);\r
145         unset($EXT_DUMMY['ext_funcs']);\r
146         $EXTENSIONS = $EXT_DUMMY;\r
147         unset($EXT_DUMMY);\r
148 \r
149         // No database load needed\r
150         $res_ext_crt = false;\r
151 }\r
152  else\r
153 {\r
154         // If current user is not admin load only activated extensions\r
155         // The admin shall use every available extension for testing purposes\r
156         if (!IS_ADMIN()) $ADD = " WHERE ext_active='Y'";\r
157 \r
158         if (GET_EXT_VERSION("sql_patches") >= "0.0.6")\r
159         {\r
160                 // Query with CSS file from DB\r
161                 $res_ext_crt = SQL_QUERY("SELECT id, ext_name, ext_lang_file, ext_has_css, ext_active, ext_version\r
162 FROM "._MYSQL_PREFIX."_extensions".$ADD."\r
163 ORDER BY ext_name", __FILE__, __LINE__);\r
164         }\r
165          else\r
166         {\r
167                 // Old obsulete query string\r
168                 $res_ext_crt = SQL_QUERY("SELECT id, ext_name, ext_lang_file, ext_name, ext_active, ext_version\r
169 FROM "._MYSQL_PREFIX."_extensions".$ADD."\r
170 ORDER BY ext_name", __FILE__, __LINE__);\r
171         }\r
172 }\r
173 \r
174 // Array for removed but not uninstalled extensions\r
175 $DEL = array();\r
176 \r
177 // At least one found?\r
178 if ((SQL_NUMROWS($res_ext_crt) > 0) && (($CACHE_FILE == "init") || ($CACHE_FILE == "no")) && ($CSS != "1") && ($CSS != "-1"))\r
179 {\r
180         // Load theme management\r
181         require_once(PATH."inc/theme-manager.php");\r
182 \r
183         // If we need to init the cache init it now\r
184         if ($CACHE_FILE == "init") $CACHE->cache_init("EXTENSIONS");\r
185 \r
186         // Extensions are registered so we load them\r
187         while (list($EXT_ID, $name, $lang, $css, $active, $version) = SQL_FETCHROW($res_ext_crt))\r
188         {\r
189                 // Get menu entry\r
190                 $result_menu = SQL_QUERY_ESC("SELECT has_menu FROM "._MYSQL_PREFIX."_mod_reg WHERE module='%s' LIMIT 1",\r
191                  array($name), __FILE__, __LINE__);\r
192                 list($menu) = SQL_FETCHROW($result_menu);\r
193                 //* DEBUG: */ echo "*".$name."/".$menu."*<br>";\r
194 \r
195                 // An empty menu entry will be interpreted as N (no menu) to avoid problems\r
196                 if (empty($menu)) $menu = "N";\r
197 \r
198                 // Load extensions\r
199                 $file1 = sprintf(PATH."inc/extensions/ext-%s.php", $name);\r
200                 $file2 = $file1; $EXT_CSS = "N"; $EXT_ALWAYS_ACTIVE = "N";\r
201 \r
202                 // Special functions file\r
203                 $file3 = sprintf(PATH."inc/libs/%s_functions.php", $name);\r
204 \r
205                 // Does the extension file exists?\r
206                 if (file_exists($file1) && is_readable($file1))\r
207                 {\r
208                         // If there's no language file specified we don't need to load one... ;-)\r
209                         if (!empty($lang)) {\r
210                                 // Create language file\r
211                                 $file2 = sprintf(PATH."inc/language/%s_%s.php", $lang, GET_LANGUAGE());\r
212                         }\r
213 \r
214                         if (file_exists($file3) && is_readable($file3))\r
215                         {\r
216                                 // Special functions file\r
217                                 $funcs = "Y";\r
218                                 require_once($file3);\r
219                         }\r
220                          else\r
221                         {\r
222                                 // Don't load functions file\r
223                                 $funcs = "N";\r
224                         }\r
225 \r
226                         // Do we need a language file?\r
227                         if (($file1 != $file2) && (file_exists($file2)) && (is_readable($file2)))\r
228                         {\r
229                                 // Load language file\r
230                                 $lang = "Y";\r
231                                 include($file2);\r
232                         }\r
233                          else\r
234                         {\r
235                                 // Don't load language file\r
236                                 $lang = "N";\r
237                         }\r
238 \r
239                         // Load extension\r
240                         if ($name != "sql_patches")\r
241                         {\r
242                                 // Load extension's file\r
243                                 include_once($file1);\r
244                         }\r
245                          else\r
246                         {\r
247                                 // KEEP sql_patches ALWAYS ACTIVE!\r
248                                 $EXT_ALWAYS_ACTIVE = "Y";\r
249                         }\r
250 \r
251                         if ($css == "Y")\r
252                         {\r
253                                 $CSS_FILE = PATH."theme/".GET_CURR_THEME()."/css/".$name.".css";\r
254                                 if (file_exists($CSS_FILE))\r
255                                 {\r
256                                         // CSS file for extension was found (use only relative path for now!)\r
257                                         $EXT_CSS_FILES[] = $name.".css";\r
258                                 }\r
259                                  else\r
260                                 {\r
261                                         // Don't load CSS file\r
262                                         $css = "N";\r
263                                 }\r
264                         }\r
265 \r
266                         // Add cache row\r
267                         if ($CACHE_FILE == "init")\r
268                         {\r
269                                 $CACHE->add_row(array(\r
270                                         'ext_id'      => $EXT_ID,\r
271                                         'ext_name'    => $name,\r
272                                         'ext_lang'    => $lang,\r
273                                         'ext_css'     => $css,\r
274                                         'ext_menu'    => $menu,\r
275                                         'ext_funcs'   => $funcs,\r
276                                         'ext_active'  => $active,\r
277                                         'ext_version' => $version,\r
278                                         'ext_keep'    => $EXT_ALWAYS_ACTIVE,\r
279                                 ));\r
280                         }\r
281                          elseif ($CACHE_FILE == "no")\r
282                         {\r
283                                 // Remember this value for later usage\r
284                                 $KEEP_ACTIVE[$name] = $EXT_ALWAYS_ACTIVE;\r
285                         }\r
286                 }\r
287                  elseif (!file_exists($file1))\r
288                 {\r
289                         // Deleted extension file so we mark it for removal from DB\r
290                         $DEL[] = $name;\r
291                 }\r
292         }\r
293 \r
294         if ($CACHE_FILE == "init")\r
295         {\r
296                 // Close cache file\r
297                 $CACHE->cache_close();\r
298 \r
299                 // Load more cache files (like admins)\r
300                 require_once(PATH."inc/load_cache.php");\r
301         }\r
302 }\r
303 \r
304 // Free memory\r
305 SQL_FREERESULT($res_ext_crt);\r
306 \r
307 // Compile configuration system\r
308 /**\r
309  * Commented out...\r
310  *\r
311  *foreach ($CONFIG as $k=>$v)\r
312  *{\r
313  *      $CONFIG[$k] = COMPILE_CODE($v);\r
314  *}\r
315  */\r
316 \r
317 // Load include files\r
318 if (!empty($INC_POOL[0]))\r
319 {\r
320         foreach ($INC_POOL as $inc)\r
321         {\r
322                 require_once($inc);\r
323         }\r
324 }\r
325 \r
326 // Uninstall extensions that are no longer in our system\r
327 if (!empty($DEL[0]))\r
328 {\r
329         // Remove extensions from two tables: extension registry and tasks table\r
330         foreach ($DEL as $name)\r
331         {\r
332                 // First remove entry from extensions table\r
333                 $result = SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM "._MYSQL_PREFIX."_extensions WHERE ext_name='%s' LIMIT 1",\r
334                  array($name), __FILE__, __LINE__);\r
335 \r
336                 // Remove (maybe?) found tasks (main task and possible updates\r
337                 $result = SQL_QUERY_ESC("DELETE LOW_PRIORITY FROM "._MYSQL_PREFIX."_task_system WHERE subject LIKE '[%s:] %' AND (task_type='EXTENSION' OR task_type='EXTENSION_UPDATE')",\r
338                  array($name), __FILE__, __LINE__);\r
339         }\r
340 \r
341         // I think it's not neccessary to run the optimization function here\r
342         // because we didn't delete so much data from database. Can you aggree?\r
343 }\r
344 //\r
345 ?>\r