3 // ----------------------------------------------------------------------
4 // POST-NUKE Content Management System
5 // Copyright (C) 2001 by the Post-Nuke Development Team.
6 // http://www.postnuke.com/
7 // ----------------------------------------------------------------------
9 // PHP-NUKE Web Portal System - http://phpnuke.org/
10 // Thatware - http://thatware.org/
11 // ----------------------------------------------------------------------
14 // This program is free software; you can redistribute it and/or
15 // modify it under the terms of the GNU General Public License (GPL)
16 // as published by the Free Software Foundation; either version 2
17 // of the License, or (at your option) any later version.
19 // This program is distributed in the hope that it will be useful,
20 // but WITHOUT ANY WARRANTY; without even the implied warranty of
21 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 // GNU General Public License for more details.
24 // To read the license please visit http://www.gnu.org/copyleft/gpl.html
25 // ----------------------------------------------------------------------
26 // Original Author of file: Jim McDonald
27 // Purpose of file: Module variable handling
28 // ----------------------------------------------------------------------
31 * pnModGetVar - get a module variable
32 * Takes two parameters:
33 * - the name of the module
34 * - the name of the variable
36 function pnModGetVar($modname, $name)
38 if ((empty($modname)) ||
(empty($name))) {
43 if (isset($pnmodvar[$modname][$name])) {
44 return $pnmodvar[$modname][$name];
47 list($dbconn) = pnDBGetConn();
48 $pntable = pnDBGetTables();
50 $modulevarstable = $pntable['module_vars'];
51 $modulevarscolumn = &$pntable['module_vars_column'];
52 $query = "SELECT $modulevarscolumn[value]
54 WHERE $modulevarscolumn[modname] = '" . pnVarPrepForStore($modname) . "'
55 AND $modulevarscolumn[name] = '" . pnVarPrepForStore($name) . "'";
56 $result = $dbconn->Execute($query);
58 if($dbconn->ErrorNo() != 0) {
63 $pnmodvar[$modname][$name] = false;
67 list($value) = $result->fields
;
70 $pnmodvar[$modname][$name] = $value;
75 * pnModSetVar - set a module variable
76 * Takes three parameters:
77 * - the name of the module
78 * - the name of the variable
79 * - the value of the variable
81 function pnModSetVar($modname, $name, $value)
83 if ((empty($modname)) ||
(empty($name))) {
87 list($dbconn) = pnDBGetConn();
88 $pntable = pnDBGetTables();
90 $curvar = pnModGetVar($modname, $name);
92 $modulevarstable = $pntable['module_vars'];
93 $modulevarscolumn = &$pntable['module_vars_column'];
94 if (!isset($curvar)) {
95 $query = "INSERT INTO $modulevarstable
96 ($modulevarscolumn[modname],
97 $modulevarscolumn[name],
98 $modulevarscolumn[value])
100 ('" . pnVarPrepForStore($modname) . "',
101 '" . pnVarPrepForStore($name) . "',
102 '" . pnVarPrepForStore($value) . "');";
104 $query = "UPDATE $modulevarstable
105 SET $modulevarscolumn[value] = '" . pnVarPrepForStore($value) . "'
106 WHERE $modulevarscolumn[modname] = '" . pnVarPrepForStore($modname) . "'
107 AND $modulevarscolumn[name] = '" . pnVarPrepForStore($name) . "'";
110 $dbconn->Execute($query);
112 if($dbconn->ErrorNo() != 0) {
117 $pnmodvar[$modname][$name] = $value;
123 * pnModDelVar - delete a module variable
124 * Takes two parameters:
125 * - the name of the module
126 * - the name of the variable
128 function pnModDelVar($modname, $name)
130 if ((empty($modname)) ||
(empty($name))) {
134 list($dbconn) = pnDBGetConn();
135 $pntable = pnDBGetTables();
137 $modulevarstable = $pntable['module_vars'];
138 $modulevarscolumn = &$pntable['module_vars_column'];
139 $query = "DELETE FROM $modulevarstable
140 WHERE $modulevarscolumn[modname] = '" . pnVarPrepForStore($modname) . "'
141 AND $modulevarscolumn[name] = '" . pnVarPrepForStore($name) . "'";
142 $dbconn->Execute($query);
144 if($dbconn->ErrorNo() != 0) {
149 if (isset($pnmodvar[$modname][$name])) {
150 unset($pnmodvar[$modname][$name]);
156 * pnModGetIDFromName - get module ID given its name
157 * Takes one parameter:
158 * - the name of the module
160 function pnModGetIDFromName($module)
162 if (empty($module)) {
166 static $modid = array();
167 if (isset($modid[$module])) {
168 return $modid[$module];
171 list($dbconn) = pnDBGetConn();
172 $pntable = pnDBGetTables();
174 $modulestable = $pntable['modules'];
175 $modulescolumn = &$pntable['modules_column'];
176 $query = "SELECT $modulescolumn[id]
178 WHERE $modulescolumn[name] = '" . pnVarPrepForStore($module) . "'";
179 $result = $dbconn->Execute($query);
181 if($dbconn->ErrorNo() != 0) {
186 $modid[$module] = false;
190 list($id) = $result->fields
;
193 $modid[$module] = $id;
198 * get information on module
201 * @ return array of module information or false if core ( id = 0 )
203 function pnModGetInfo($modid)
205 // a $modid of 0 is associated with core ( pn_blocks.mid, ... ).
210 static $modinfo = array();
211 if (isset($modinfo[$modid])) {
212 return $modinfo[$modid];
215 list($dbconn) = pnDBGetConn();
216 $pntable = pnDBGetTables();
218 $modulestable = $pntable['modules'];
219 $modulescolumn = &$pntable['modules_column'];
220 $query = "SELECT $modulescolumn[name],
221 $modulescolumn[type],
222 $modulescolumn[directory],
223 $modulescolumn[regid],
224 $modulescolumn[displayname],
225 $modulescolumn[description],
226 $modulescolumn[version]
228 WHERE $modulescolumn[id] = " . pnVarPrepForStore($modid);
229 $result = $dbconn->Execute($query);
231 if($dbconn->ErrorNo() != 0) {
236 $modinfo[$modid] = false;
240 list($resarray['name'],
242 $resarray['directory'],
244 $resarray['displayname'],
245 $resarray['description'],
246 $resarray['version']) = $result->fields
;
249 $modinfo[$modid] = $resarray;
254 * get list of user modules
256 * @return array of module information arrays
258 function pnModGetUserMods()
260 list($dbconn) = pnDBGetConn();
261 $pntable = pnDBGetTables();
263 $modulestable = $pntable['modules'];
264 $modulescolumn = &$pntable['modules_column'];
265 $query = "SELECT $modulescolumn[name],
266 $modulescolumn[type],
267 $modulescolumn[directory],
268 $modulescolumn[regid],
269 $modulescolumn[displayname],
270 $modulescolumn[description],
271 $modulescolumn[version]
273 WHERE $modulescolumn[state] = " . _PNMODULE_STATE_ACTIVE
. "
274 AND $modulescolumn[user_capable] = 1
275 ORDER BY $modulescolumn[name]";
276 $result = $dbconn->Execute($query);
278 if($dbconn->ErrorNo() != 0) {
293 $version) = $result->fields
) {
296 $tmparray = array('name' => $name,
298 'directory' => $directory,
300 'displayname' => $displayname,
301 'description' => $description,
302 'version' => $version);
304 array_push($resarray, $tmparray);
312 * get list of administration modules
314 * @return array of module information arrays
316 function pnModGetAdminMods()
318 list($dbconn) = pnDBGetConn();
319 $pntable = pnDBGetTables();
321 $modulestable = $pntable['modules'];
322 $modulescolumn = &$pntable['modules_column'];
324 $query = "SELECT $modulescolumn[name],
325 $modulescolumn[type],
326 $modulescolumn[directory],
327 $modulescolumn[regid],
328 $modulescolumn[displayname],
329 $modulescolumn[description],
330 $modulescolumn[version]
332 WHERE $modulescolumn[state] = " . _PNMODULE_STATE_ACTIVE
. "
333 AND $modulescolumn[admin_capable] = 1
334 AND $modulescolumn[directory] != 'NS-Admin'
335 ORDER BY $modulescolumn[name]";
337 $result = $dbconn->Execute($query);
339 if($dbconn->ErrorNo() != 0) {
354 $version) = $result->fields
) {
357 $tmparray = array('name' => $name,
359 'directory' => $directory,
361 'displayname' => $displayname,
362 'description' => $description,
363 'version' => $version);
365 array_push($resarray, $tmparray);
373 * load an API for a module
374 * @param modname - registered name of the module
375 * @param type - type of functions to load
377 * @return true on success, false on failure
379 function pnModAPILoad($modname, $type='user')
381 static $loaded = array();
383 if (empty($modname)) {
387 list($dbconn) = pnDBGetConn();
388 $pntable = pnDBGetTables();
390 if (!empty($loaded["$modname$type"])) {
391 // Already loaded from somewhere else
395 $modulestable = $pntable['modules'];
396 $modulescolumn = &$pntable['modules_column'];
397 $query = "SELECT $modulescolumn[name],
398 $modulescolumn[directory],
399 $modulescolumn[state]
401 WHERE $modulescolumn[name] = '" . pnVarPrepForStore($modname) . "'";
402 $result = $dbconn->Execute($query);
404 if($dbconn->ErrorNo() != 0) {
409 pnSessionSetVar('errmsg', "Unknown module $modname");
413 list($name, $directory, $state) = $result->fields
;
416 list($osdirectory, $ostype) = pnVarPrepForOS($directory, $type);
418 $osfile = "modules/$osdirectory/pn{$ostype}api.php";
419 if (!file_exists($osfile)) {
420 // File does not exist
426 $loaded["$modname$type"] = 1;
428 // Load the module language files
429 $currentlang = pnUserGetLang();
430 $defaultlang = pnConfigGetVar('language');
431 if (empty($defaultlang)) {
432 $defaultlang = 'eng';
435 list($oscurrentlang, $osdefaultlang) = pnVarPrepForOS($currentlang, $defaultlang);
436 if (file_exists("modules/$osdirectory/pnlang/$oscurrentlang/{$ostype}api.php")) {
437 include "modules/$osdirectory/pnlang/$oscurrentlang/{$ostype}api.php";
438 } elseif (file_exists("modules/$osdirectory/pnlang/$osdefaultlang/{$ostype}api.php")) {
439 include "modules/$osdirectory/pnlang/$osdefaultlang/{$ostype}api.php";
443 pnModDBInfoLoad($modname, $directory);
449 * load datbase definition for a module
450 * @param name - name of module to load database definition for
451 * @param directory - directory that module is in (if known)
454 function pnModDBInfoLoad($modname, $directory='')
456 static $loaded = array();
458 // Check to ensure we aren't doing this twice
459 if (isset($loaded[$modname])) {
463 // Get the directory if we don't already have it
464 if (empty($directory)) {
465 list($dbconn) = pnDBGetConn();
466 $pntable = pnDBGetTables();
467 $modulestable = $pntable['modules'];
468 $modulescolumn = &$pntable['modules_column'];
469 $sql = "SELECT $modulescolumn[directory]
471 WHERE $modulescolumn[name] = '" . pnVarPrepForStore($modname) . "'";
472 $result = $dbconn->Execute($sql);
473 if($dbconn->ErrorNo() != 0) {
481 $directory = $result->fields
[0];
485 // Load the database definition if required
486 $ospntablefile = 'modules/' . pnVarPrepForOS($directory) . '/pntables.php';
487 // Ignore errors for this, if it fails we'll find out and handle
488 // it when we look for the function itself
489 @include_once
$ospntablefile;
490 $tablefunc = $modname . '_' . 'pntables';
491 if (function_exists($tablefunc)) {
493 $pntable = array_merge($pntable, $tablefunc());
495 $loaded[$modname] = true;
502 * @param name - name of module to load
503 * @param type - type of functions to load
505 * @return name of module loaded, or false on failure
507 function pnModLoad($modname, $type='user')
509 static $loaded = array();
511 if (empty($modname)) {
515 list($dbconn) = pnDBGetConn();
516 $pntable = pnDBGetTables();
518 $modulestable = $pntable['modules'];
519 $modulescolumn = &$pntable['modules_column'];
521 if (!empty($loaded["$modname$type"])) {
522 // Already loaded from somewhere else
526 $query = "SELECT $modulescolumn[directory],
527 $modulescolumn[state]
529 WHERE $modulescolumn[name] = '" . pnVarPrepForStore($modname) . "'";
530 $result = $dbconn->Execute($query);
532 if($dbconn->ErrorNo() != 0) {
540 list($directory, $state) = $result->fields
;
543 // Load the module and module language files
544 list($osdirectory, $ostype) = pnVarPrepForOS($directory, $type);
545 $osfile = "modules/$osdirectory/pn$ostype.php";
547 if (!file_exists($osfile)) {
548 // File does not exist
554 $loaded["$modname$type"] = 1;
556 $defaultlang = pnConfigGetVar('language');
557 if (empty($defaultlang)) {
558 $defaultlang = 'eng';
561 $currentlang = pnUserGetLang();
562 if (file_exists("modules/$osdirectory/pnlang/$currentlang/$ostype.php")) {
563 include "modules/$osdirectory/pnlang/" . pnVarPrepForOS($currentlang) . "/$ostype.php";
564 } elseif (file_exists("modules/$directory/pnlang/$defaultlang/$ostype.php")) {
565 include "modules/$osdirectory/pnlang/" . pnVarPrepForOS($defaultlang) . "/$ostype.php";
569 pnModDBInfoLoad($modname, $directory);
571 // Return the module name
576 * run a module API function
577 * @param modname - registered name of module
578 * @param type - type of function to run
579 * @param func - specific function to run
580 * @param args - arguments to pass to the function
583 function pnModAPIFunc($modname, $type='user', $func='main', $args=array())
586 if (empty($modname)) {
597 // Build function name and call function
598 $modapifunc = "{$modname}_{$type}api_{$func}";
599 if (function_exists($modapifunc)) {
600 return $modapifunc($args);
607 * run a module function
608 * @param modname - registered name of module
609 * @param type - type of function to run
610 * @param func - specific function to run
611 * @param args - argument array
614 function pnModFunc($modname, $type='user', $func='main', $args=array())
617 if (empty($modname)) {
628 // Build function name and call function
629 $modfunc = "{$modname}_{$type}_{$func}";
630 if (function_exists($modfunc)) {
631 return $modfunc($args);
638 * generate a module function URL
639 * @param modname - registered name of module
640 * @param type - type of function
641 * @param func - module function
642 * @param args - array of arguments to put on the URL
644 * @return absolute URL for call
646 function pnModURL($modname, $type='user', $func='main', $args=array(), $path = '')
648 if (empty($modname)) {
652 global $HTTP_SERVER_VARS;
655 $host = $HTTP_SERVER_VARS['HTTP_HOST'];
657 $host = getenv('HTTP_HOST');
664 $urlargs[] = "module=$modname";
665 if ((!empty($type)) && ($type != 'user')) {
666 $urlargs[] = "type=$type";
668 if ((!empty($func)) && ($func != 'main')) {
669 $urlargs[] = "func=$func";
671 $urlargs = join('&', $urlargs);
672 $url = "index.php?$urlargs";
675 // <rabbitt> added array check on args
677 if (!is_array($args)) {
680 foreach ($args as $k=>$v) {
682 foreach($v as $l=>$w) {
683 $url .= "&$k" . "[$l]=$w";
690 //remove characters not belonging in a path, prevent possible injection
691 //this may break windows path accesses?
692 $path = preg_replace("/[^\.\/a-zA-Z0-9]/","",$path)
695 $final_url = pnGetBaseURL() . $path . $url;
700 * see if a module is available
702 * @return true if the module is available, false if not
704 function pnModAvailable($modname)
706 if (empty($modname)) {
710 static $modstate = array();
711 if (isset($modstate[$modname])) {
712 if ($modstate[$modname] == _PNMODULE_STATE_ACTIVE
) {
719 list($dbconn) = pnDBGetConn();
720 $pntable = pnDBGetTables();
722 $modulestable = $pntable['modules'];
723 $modulescolumn = &$pntable['modules_column'];
724 $query = "SELECT $modulescolumn[state]
726 WHERE $modulescolumn[name] = '" . pnVarPrepForStore($modname) . "'";
727 $result = $dbconn->Execute($query);
729 if($dbconn->ErrorNo() != 0) {
734 $modstate[$modname] = _PNMODULE_STATE_MISSING
;
738 list($state) = $result->fields
;
741 $modstate[$modname] = $state;
742 if ($state == _PNMODULE_STATE_ACTIVE
) {
750 * get name of current top-level module
752 * @return the name of the current top-level module, false if not in a module
754 function pnModGetName() {
755 $modname = pnVarCleanFromInput('module');
756 if (empty($modname)) {
757 $name = pnVarCleanFromInput('name');
760 if (empty($ModName)) {
763 $modname = preg_replace('/^NS-/', '', $ModName);
768 $modname = preg_replace('/^NS-/', '', $modname);
774 * register a hook function
775 * @param hookobject the hook object
776 * @param hookaction the hook action
777 * @param hookarea the area of the hook (either 'GUI' or 'API')
778 * @param hookmodule name of the hook module
779 * @param hooktype name of the hook type
780 * @param hookfunc name of the hook function
782 function pnModRegisterHook($hookobject,
791 list($dbconn) = pnDBGetConn();
792 $pntable = pnDBGetTables();
793 $hookstable = $pntable['hooks'];
794 $hookscolumn = &$pntable['hooks_column'];
797 $sql = "INSERT INTO $hookstable (
799 $hookscolumn[object],
800 $hookscolumn[action],
802 $hookscolumn[tmodule],
806 " . pnVarPrepForStore($dbconn->GenId($hookstable)) . ",
807 '" . pnVarPrepForStore($hookobject) . "',
808 '" . pnVarPrepForStore($hookaction) . "',
809 '" . pnVarPrepForStore($hookarea) . "',
810 '" . pnVarPrepForStore($hookmodule) . "',
811 '" . pnVarPrepForStore($hooktype) . "',
812 '" . pnVarPrepForStore($hookfunc) . "')";
813 $dbconn->Execute($sql);
815 if($dbconn->ErrorNo() != 0) {
823 * unregister a hook function
824 * @param hookobject the hook object
825 * @param hookaction the hook action
826 * @param hookarea the area of the hook (either 'GUI' or 'API')
827 * @param hookmodule name of the hook module
828 * @param hooktype name of the hook type
829 * @param hookfunc name of the hook function
831 function pnModUnregisterHook($hookobject,
840 list($dbconn) = pnDBGetConn();
841 $pntable = pnDBGetTables();
842 $hookstable = $pntable['hooks'];
843 $hookscolumn = &$pntable['hooks_column'];
846 $sql = "DELETE FROM $hookstable
847 WHERE $hookscolumn[object] = '" . pnVarPrepForStore($hookobject) . "'
848 AND $hookscolumn[action] = '" . pnVarPrepForStore($hookaction) . "'
849 AND $hookscolumn[tarea] = '" . pnVarPrepForStore($hookarea) . "'
850 AND $hookscolumn[tmodule] = '" . pnVarPrepForStore($hookmodule) . "'
851 AND $hookscolumn[ttype] = '" . pnVarPrepForStore($hooktype) . "'
852 AND $hookscolumn[tfunc] = '" . pnVarPrepForStore($hookfunc) . "'";
853 $dbconn->Execute($sql);
855 if($dbconn->ErrorNo() != 0) {
863 * carry out hook operations for module
864 * @param hookobject the object the hook is called for - either 'item' or 'category'
865 * @param hookaction the action the hook is called for - one of 'create', 'delete', 'transform', or 'display'
866 * @param hookid the id of the object the hook is called for (module-specific)
867 * @param extrainfo extra information for the hook, dependent on hookaction
869 * @return output from hooks
871 function pnModCallHooks($hookobject, $hookaction, $hookid, $extrainfo) {
874 list($dbconn) = pnDBGetConn();
875 $pntable = pnDBGetTables();
876 $hookstable = $pntable['hooks'];
877 $hookscolumn = &$pntable['hooks_column'];
879 // Get applicable hooks
880 $sql = "SELECT $hookscolumn[tarea],
881 $hookscolumn[tmodule],
885 WHERE $hookscolumn[smodule] = '" . pnVarPrepForStore(pnModGetName()) . "'
886 AND $hookscolumn[object] = '" . pnVarPrepForStore($hookobject) . "'
887 AND $hookscolumn[action] = '" . pnVarPrepForStore($hookaction) . "'";
888 $result = $dbconn->Execute($sql);
890 if($dbconn->ErrorNo() != 0) {
897 for (; !$result->EOF
; $result->MoveNext()) {
898 list($hookarea, $hookmodule, $hooktype, $hookfunc) = $result->fields
;
899 if ($hookarea == 'GUI') {
900 if (pnModAvailable($hookmodule, $hooktype) &&
901 pnModLoad($hookmodule, $hooktype)) {
902 $output .= pnModFunc($hookmodule,
905 array('objectid' => $hookid,
906 'extrainfo' => $extrainfo));
909 if (pnModAvailable($hookmodule, $hooktype) &&
910 pnModAPILoad($hookmodule, $hooktype)) {
911 $extrainfo = pnModAPIFunc($hookmodule,
914 array('objectid' => $hookid,
915 'extrainfo' => $extrainfo));
920 if ($hookaction == 'display') {