From da1da41bdc4b602f072bb44a3b9bd448f2342d6b Mon Sep 17 00:00:00 2001 From: tbrehm <t.brehm@ispconfig.org> Date: Sun, 07 Feb 2010 13:51:07 -0500 Subject: [PATCH] FS#1064 - Add support for event based plugins to the web frontend. --- interface/lib/config.inc.php | 2 interface/lib/classes/tform_actions.inc.php | 2 interface/lib/classes/plugin.inc.php | 161 ++++++++++++++++++++++++++ interface/web/login/password_reset.php | 176 ++++++++++++++-------------- interface/web/login/index.php | 3 interface/lib/app.inc.php | 11 + interface/web/login/logout.php | 2 7 files changed, 268 insertions(+), 89 deletions(-) diff --git a/interface/lib/app.inc.php b/interface/lib/app.inc.php index 3e1cf75..a38c354 100644 --- a/interface/lib/app.inc.php +++ b/interface/lib/app.inc.php @@ -65,7 +65,7 @@ if(empty($_SESSION['s']['language'])) $_SESSION['s']['language'] = $conf['language']; } - $this->uses('auth'); + $this->uses('auth,plugin'); } public function uses($classes) @@ -98,7 +98,15 @@ /** Priority values are: 0 = DEBUG, 1 = WARNING, 2 = ERROR */ public function log($msg, $priority = 0) { + global $conf; if($priority >= $this->_conf['log_priority']) { + // $server_id = $conf["server_id"]; + $server_id = 0; + $priority = intval($priority); + $tstamp = time(); + $msg = $this->db->quote('[INTERFACE]: '.$msg); + $this->db->query("INSERT INTO sys_log (server_id,datalog_id,loglevel,tstamp,message) VALUES ($server_id,0,$priority,$tstamp,'$msg')"); + /* if (is_writable($this->_conf['log_file'])) { if (!$fp = fopen ($this->_conf['log_file'], 'a')) { $this->error('Unable to open logfile.'); @@ -110,6 +118,7 @@ } else { $this->error('Unable to write to logfile.'); } + */ } } diff --git a/interface/lib/classes/plugin.inc.php b/interface/lib/classes/plugin.inc.php new file mode 100644 index 0000000..50efb90 --- /dev/null +++ b/interface/lib/classes/plugin.inc.php @@ -0,0 +1,161 @@ +<?php + +/* +Copyright (c) 2010, Till Brehm, projektfarm Gmbh +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +class plugin { + + private $subscribed_events = array(); + private $debug = true; + + + /* + This function is called to load the plugins from the plugins folder and update the plugin cache + */ + + private function loadPluginCache() { + global $app,$conf; + + + if(isset($_SESSION['s']['plugin_cache'])) unset($_SESSION['s']['plugin_cache']); + + $plugins_dir = ISPC_LIB_PATH.FS_DIV.'plugins'.FS_DIV; + $_SESSION['s']['plugin_cache'] = array(); + $tmp_plugins = array(); + + if (is_dir($plugins_dir)) { + if ($dh = opendir($plugins_dir)) { + //** Go trough all files in the plugin dir + while (($file = readdir($dh)) !== false) { + if($file != '.' && $file != '..' && substr($file,-8,8) == '.inc.php') { + $plugin_name = substr($file,0,-8); + $tmp_plugins[$plugin_name] = $file; + } + } + //** sort the plugins by name + ksort($tmp_plugins); + + //** load the plugins + foreach($tmp_plugins as $plugin_name => $file) { + include_once($plugins_dir.$file); + if($this->debug) $app->log("Loading Plugin: $plugin_name",LOGLEVEL_DEBUG); + $app->loaded_plugins[$plugin_name] = new $plugin_name; + $app->loaded_plugins[$plugin_name]->onLoad(); + } + } else { + $app->log("Unable to open the plugin directory: $plugins_dir",LOGLEVEL_ERROR); + } + } else { + $app->log("Plugin directory missing: $plugins_dir",LOGLEVEL_ERROR); + } + + } + + /* + This function is called by the plugin to register for an event which is saved into the plugin cache + for faster lookups without the need to load all plugins for every page. + */ + + public function registerEvent($event_name,$plugin_name,$function_name) { + global $app; + + $_SESSION['s']['plugin_cache'][$event_name][] = array('plugin' => $plugin_name, 'function' => $function_name); + if($this->debug) $app->log("Plugin '$plugin_name' has registered the function '$function_name' for the event '$event_name'",LOGLEVEL_DEBUG); + + } + + /* + This function is called when a certian action occurs, e.g. a form gets saved or a user is logged in. + */ + + public function raiseEvent($event_name,$data) { + global $app; + + if(!isset($_SESSION['s']['plugin_cache'])) { + $this->loadPluginCache(); + if($this->debug) $app->log("Loaded the plugin cache.",LOGLEVEL_DEBUG); + } + + + $sub_events = explode(':',$event_name); + + if(is_array($sub_events)) { + if(count($sub_events) == 3) { + $tmp_event = $sub_events[2]; + if($this->debug) $app->log("Called Event '$tmp_event'",LOGLEVEL_DEBUG); + $this->callPluginEvent($tmp_event,$data); + $tmp_event = $sub_events[0].':'.$sub_events[2]; + if($this->debug) $app->log("Called Event '$tmp_event'",LOGLEVEL_DEBUG); + $this->callPluginEvent($tmp_event,$data); + $tmp_event = $sub_events[0].':'.$sub_events[1].':'.$sub_events[2]; + if($this->debug) $app->log("Called Event '$tmp_event'",LOGLEVEL_DEBUG); + $this->callPluginEvent($tmp_event,$data); + + /*$sub_events = array_reverse($sub_events); + $tmp_event = ''; + foreach($sub_events as $n => $sub_event) { + $tmp_event = ($n == 0)?$sub_event:$sub_event.':'.$tmp_event; + if($this->debug) $app->log("Called Event '$tmp_event'",LOGLEVEL_DEBUG); + $this->callPluginEvent($tmp_event,$data); + } + */ + } else { + if($this->debug) $app->log("Called Event '$sub_events[0]'",LOGLEVEL_DEBUG); + $this->callPluginEvent($sub_events[0],$data); + } + } + + } // end function raiseEvent + + //* Internal function to load the plugin and call the event function in the plugin. + private function callPluginEvent($event_name,$data) { + global $app; + + //* execute the functions for the events + if(is_array($_SESSION['s']['plugin_cache'][$event_name])) { + foreach($_SESSION['s']['plugin_cache'][$event_name] as $rec) { + $plugin_name = $rec['plugin']; + $function_name = $rec['function']; + $plugin_file = ISPC_LIB_PATH.FS_DIV.'plugins'.FS_DIV.$plugin_name.'.inc.php'; + if(is_file($plugin_file)) { + if(!isset($app->loaded_plugins[$plugin_name])) { + include_once($plugin_file); + $app->loaded_plugins[$plugin_name] = new $plugin_name; + } + if($this->debug) $app->log("Called method: '$function_name' in plugin '$plugin_name' for event '$event_name'",LOGLEVEL_DEBUG); + call_user_method($function_name,$app->loaded_plugins[$plugin_name],$event_name,$data); + } + } + + } + } // end functiom callPluginEvent + + +} + +?> \ No newline at end of file diff --git a/interface/lib/classes/tform_actions.inc.php b/interface/lib/classes/tform_actions.inc.php index f676b32..87b76c1 100644 --- a/interface/lib/classes/tform_actions.inc.php +++ b/interface/lib/classes/tform_actions.inc.php @@ -118,6 +118,7 @@ } $this->onAfterUpdate(); + $app->plugin->raiseEvent($_SESSION['s']['module']['name'].':'.$app->tform->formDef['name'].':'.'on_after_update',$this); // Write data history (sys_datalog) if($app->tform->formDef['db_history'] == 'yes') { @@ -195,6 +196,7 @@ } $this->onAfterInsert(); + $app->plugin->raiseEvent($_SESSION['s']['module']['name'].':'.$app->tform->formDef['name'].':'.'on_after_insert',$this); // Write data history (sys_datalog) if($app->tform->formDef['db_history'] == 'yes') { diff --git a/interface/lib/config.inc.php b/interface/lib/config.inc.php index cabf632..a70edec 100644 --- a/interface/lib/config.inc.php +++ b/interface/lib/config.inc.php @@ -97,7 +97,7 @@ $conf['app_version'] = ISPC_APP_VERSION; $conf['app_link'] = 'http://www.howtoforge.com/forums/showthread.php?t=26988'; $conf['modules_available'] = 'admin,mail,sites,monitor,client,dns,help'; -$conf["server_id"] = "{server_id}"; +$conf["server_id"] = "1"; //** Interface diff --git a/interface/web/login/index.php b/interface/web/login/index.php index 9f80982..c1fa43b 100644 --- a/interface/web/login/index.php +++ b/interface/web/login/index.php @@ -149,6 +149,9 @@ include_once($_SESSION['s']['user']['startmodule'].'/lib/module.conf.php'); $_SESSION['s']['module'] = $module; } + + $app->plugin->raiseEvent('login',$this); + echo 'HEADER_REDIRECT:'.$_SESSION['s']['module']['startpage']; exit; diff --git a/interface/web/login/logout.php b/interface/web/login/logout.php index 91a7bb6..912a430 100644 --- a/interface/web/login/logout.php +++ b/interface/web/login/logout.php @@ -59,6 +59,8 @@ exit; } +$app->plugin->raiseEvent('logout',true); + $_SESSION["s"]["user"] = null; $_SESSION["s"]["module"] = null; $_SESSION['s_old'] = null; diff --git a/interface/web/login/password_reset.php b/interface/web/login/password_reset.php index 4b39def..e4e2da5 100644 --- a/interface/web/login/password_reset.php +++ b/interface/web/login/password_reset.php @@ -1,88 +1,90 @@ -<?php - -/* -Copyright (c) 2008, Till Brehm, projektfarm Gmbh -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of ISPConfig nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -require_once('../../lib/config.inc.php'); -require_once('../../lib/app.inc.php'); - -// Loading the template -$app->uses('tpl'); -$app->tpl->newTemplate("form.tpl.htm"); -$app->tpl->setInclude('content_tpl','templates/password_reset.htm'); - -$app->tpl_defaults(); - -include(ISPC_ROOT_PATH.'/web/login/lib/lang/'.$_SESSION['s']['language'].'.lng'); -$app->tpl->setVar($wb); - -if(isset($_POST['username']) && $_POST['username'] != '' && $_POST['email'] != '' && $_POST['username'] != 'admin') { - - if(!preg_match("/^[\w\.\-\_]{1,64}$/", $_POST['username'])) die($app->lng('user_regex_error')); - if(!preg_match("/^\w+[\w.-]*\w+@\w+[\w.-]*\w+\.[a-z]{2,10}$/i", $_POST['email'])) die($app->lng('email_error')); - - $username = $app->db->quote($_POST['username']); - $email = $app->db->quote($_POST['email']); - - $client = $app->db->queryOneRecord("SELECT * FROM client WHERE username = '$username' AND email = '$email'"); - - if($client['client_id'] > 0) { - $new_password = md5 (uniqid (rand())); - $salt="$1$"; - for ($n=0;$n<11;$n++) { - $salt.=chr(mt_rand(64,126)); - } - $salt.="$"; - $new_password_encrypted = crypt($new_password,$salt); - $new_password_encrypted = $app->db->quote($new_password_encrypted); - - $username = $app->db->quote($client['username']); - $app->db->query("UPDATE sys_user SET passwort = '$new_password_encrypted' WHERE username = '$username'"); - $app->db->query("UPDATE client SET �password� = '$new_password_encrypted' WHERE username = '$username'"); - $app->tpl->setVar("message",$wb['pw_reset']); - - mail($client['email'],$wb['pw_reset_mail_title'],$wb['pw_reset_mail_msg'].$new_password); - - } else { - $app->tpl->setVar("message",$wb['pw_error']); - } - -} else { - $app->tpl->setVar("message",$wb['pw_error_noinput']); -} - - - -$app->tpl_defaults(); -$app->tpl->pparse(); - - - - - +<?php + +/* +Copyright (c) 2008, Till Brehm, projektfarm Gmbh +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +require_once('../../lib/config.inc.php'); +require_once('../../lib/app.inc.php'); + +// Loading the template +$app->uses('tpl'); +$app->tpl->newTemplate("form.tpl.htm"); +$app->tpl->setInclude('content_tpl','templates/password_reset.htm'); + +$app->tpl_defaults(); + +include(ISPC_ROOT_PATH.'/web/login/lib/lang/'.$_SESSION['s']['language'].'.lng'); +$app->tpl->setVar($wb); + +if(isset($_POST['username']) && $_POST['username'] != '' && $_POST['email'] != '' && $_POST['username'] != 'admin') { + + if(!preg_match("/^[\w\.\-\_]{1,64}$/", $_POST['username'])) die($app->lng('user_regex_error')); + if(!preg_match("/^\w+[\w.-]*\w+@\w+[\w.-]*\w+\.[a-z]{2,10}$/i", $_POST['email'])) die($app->lng('email_error')); + + $username = $app->db->quote($_POST['username']); + $email = $app->db->quote($_POST['email']); + + $client = $app->db->queryOneRecord("SELECT * FROM client WHERE username = '$username' AND email = '$email'"); + + if($client['client_id'] > 0) { + $new_password = md5 (uniqid (rand())); + $salt="$1$"; + for ($n=0;$n<11;$n++) { + $salt.=chr(mt_rand(64,126)); + } + $salt.="$"; + $new_password_encrypted = crypt($new_password,$salt); + $new_password_encrypted = $app->db->quote($new_password_encrypted); + + $username = $app->db->quote($client['username']); + $app->db->query("UPDATE sys_user SET passwort = '$new_password_encrypted' WHERE username = '$username'"); + $app->db->query("UPDATE client SET �password� = '$new_password_encrypted' WHERE username = '$username'"); + $app->tpl->setVar("message",$wb['pw_reset']); + + mail($client['email'],$wb['pw_reset_mail_title'],$wb['pw_reset_mail_msg'].$new_password); + + $app->plugin->raiseEvent('password_reset',true); + + } else { + $app->tpl->setVar("message",$wb['pw_error']); + } + +} else { + $app->tpl->setVar("message",$wb['pw_error_noinput']); +} + + + +$app->tpl_defaults(); +$app->tpl->pparse(); + + + + + ?> \ No newline at end of file -- Gitblit v1.9.1