From 00fad6890dfe6605c08b6a492186d68797fdde2e Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Wed, 07 Mar 2007 18:53:56 -0500
Subject: [PATCH] Added basic module processing to the server part.

---
 server/mods-available/mail.module.php |  121 ++++++++++++++++++++++++
 server/lib/classes/modules.inc.php    |   93 ++++++++++++++++++
 config/amavis/amavis_sql.conf         |    9 +
 server/server.php                     |   56 +++-------
 4 files changed, 240 insertions(+), 39 deletions(-)

diff --git a/config/amavis/amavis_sql.conf b/config/amavis/amavis_sql.conf
new file mode 100644
index 0000000..dfcddf1
--- /dev/null
+++ b/config/amavis/amavis_sql.conf
@@ -0,0 +1,9 @@
+ $sql_select_policy =
+   'SELECT *,spamfilter_users.id'.
+   ' FROM spamfilter_users LEFT JOIN spamfilter_policy ON spamfilter_users.policy_id=spamfilter_policy.id'.
+   ' WHERE spamfilter_users.email IN (%k) ORDER BY spamfilter_users.priority DESC';
+
+
+$sql_select_white_black_list = 'SELECT wb FROM spamfilter_wblist'.
+    ' WHERE (spamfilter_wblist.rid=?) AND (spamfilter_wblist.email IN (%k))' .
+    ' ORDER BY spamfilter_wblist.priority DESC';
\ No newline at end of file
diff --git a/server/lib/classes/modules.inc.php b/server/lib/classes/modules.inc.php
new file mode 100644
index 0000000..c0f3776
--- /dev/null
+++ b/server/lib/classes/modules.inc.php
@@ -0,0 +1,93 @@
+<?php
+
+/*
+Copyright (c) 2007, 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 modules {
+	
+	var $notification_hooks = array();
+	
+	/*
+	 This function is called to load the modules from the mods-available folder
+	*/
+	
+	function loadModules() {
+		global $app;
+		
+	}
+	
+	/*
+	 This function is called by the modules to register for a specific
+	 table change notification
+	*/
+	
+	function registerTableHook($table_name,$module_name,$function_name) {
+		$this->notification_hooks[$table_name][] = array('module' => $module_name, 'function' => $function_name);
+	}
+	
+	/*
+	 This function goes through all new records in the
+	 sys_datalog table and and calls the function in the
+	 modules that hooked on to the table change.
+	*/
+	
+	function processDatalog() {
+		global $app;
+		
+		// TODO: process only new entries.
+		$sql = "SELECT * FROM sys_datalog WHERE 1";
+		$records = $app->db->queryAllRecords($sql);
+		foreach($records as $rec) {
+			$data = unserialize(stripslashes($rec["data"]));
+			$this->raiseTableHook($rec["dbtable"],$rec["action"],$data);
+		}
+	}
+	
+	function raiseTableHook($table_name,$action,$data) {
+		global $app;
+		
+		// Get the hooks for this table
+		$hooks = $this->notification_hooks[$table_name];
+		
+		if(is_array($hooks)) {
+			foreach($hooks as $hook) {
+				$module_name = $hook["module"];
+				$function_name = $hook["function"];
+				// Claa the processing function of the module
+				call_user_method($function_name,$app->$module_name,$table_name,$action,$data);
+				unset($module_name);
+				unset($function_name);
+			}
+		}
+		unset($hook);
+		unset($hooks);
+	}
+	
+}
+
+?>
\ No newline at end of file
diff --git a/server/mods-available/mail.module.php b/server/mods-available/mail.module.php
new file mode 100644
index 0000000..ae6b7ee
--- /dev/null
+++ b/server/mods-available/mail.module.php
@@ -0,0 +1,121 @@
+<?php
+
+/*
+Copyright (c) 2007, 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 mail_module {
+	
+	var $module_name = 'mail';
+	var $class_name = 'mail_module';
+	var $actions_available = array(	'mail_domain_insert',
+									'mail_domain_update',
+									'mail_domain_delete',
+									'mail_user_insert',
+									'mail_user_update',
+									'mail_user_delete',
+									'mail_access_insert',
+									'mail_access_update',
+									'mail_access_delete',
+									'mail_forwarding_insert',
+									'mail_forwarding_update',
+									'mail_forwarding_delete',
+									'mail_transport_insert',
+									'mail_transport_update',
+									'mail_transport_delete');
+	
+	/*
+	 	This function is called when the module is loaded
+	*/
+	
+	function onLoad() {
+		
+		/*
+		Annonce the actions that where provided by this module, so plugins 
+		can register on them.
+		*/
+		
+		$app->plugins->registerEvents($this->module_name,$this->actions_available);
+		
+		/*
+		As we want to get notified of any changes on several database tables,
+		we register for them.
+		
+		The following function registers the function "functionname"
+ 		to be executed when a record for the table "dbtable" is 
+ 		processed in the sys_datalog. "classname" is the name of the
+ 		class that contains the function functionname.
+		*/
+		
+		$app->modules->registerTableHook('mail_access','mail_module','process');
+		$app->modules->registerTableHook('mail_domain','mail_module','process');
+		$app->modules->registerTableHook('mail_forwarding','mail_module','process');
+		$app->modules->registerTableHook('mail_transport','mail_module','process');
+		$app->modules->registerTableHook('mail_user','mail_module','process');
+		
+	}
+	
+	/*
+	 This function is called when a change in one of the registered tables is detected.
+	 The function then raises the events for the plugins.
+	*/
+
+	function process($tablename,$action,$data) {
+		global $app;
+		
+		switch ($tablename) {
+			case 'mail_access':
+				if($action == 'i') $app->plugins->raiseEvent('mail_access_insert',$data);
+				if($action == 'u') $app->plugins->raiseEvent('mail_access_update',$data);
+				if($action == 'd') $app->plugins->raiseEvent('mail_access_delete',$data);
+			break;
+			case 'mail_domain':
+				if($action == 'i') $app->plugins->raiseEvent('mail_domain_insert',$data);
+				if($action == 'u') $app->plugins->raiseEvent('mail_domain_update',$data);
+				if($action == 'd') $app->plugins->raiseEvent('mail_domain_delete',$data);
+			break;
+			case 'mail_forwarding':
+				if($action == 'i') $app->plugins->raiseEvent('mail_forwarding_insert',$data);
+				if($action == 'u') $app->plugins->raiseEvent('mail_forwarding_update',$data);
+				if($action == 'd') $app->plugins->raiseEvent('mail_forwarding_delete',$data);
+			break;
+			case 'mail_transport':
+				if($action == 'i') $app->plugins->raiseEvent('mail_transport_insert',$data);
+				if($action == 'u') $app->plugins->raiseEvent('mail_transport_update',$data);
+				if($action == 'd') $app->plugins->raiseEvent('mail_transport_delete',$data);
+			break;
+			case 'mail_user':
+				if($action == 'i') $app->plugins->raiseEvent('mail_user_insert',$data);
+				if($action == 'u') $app->plugins->raiseEvent('mail_user_update',$data);
+				if($action == 'd') $app->plugins->raiseEvent('mail_user_delete',$data);
+			break;
+		} // end switch
+	} // end function
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/server.php b/server/server.php
index d4b0565..ea454ee 100644
--- a/server/server.php
+++ b/server/server.php
@@ -1,7 +1,7 @@
 <?php
 
 /*
-Copyright (c) 2006, Till Brehm, projektfarm Gmbh
+Copyright (c) 2007, Till Brehm, projektfarm Gmbh
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without modification,
@@ -62,52 +62,30 @@
 @touch($conf["temppath"].$conf["fs_div"].".ispconfig_lock");
 $app->log("Set Lock: ".$conf["temppath"].$conf["fs_div"].".ispconfig_lock");
 
+// Load required base-classes
+$this->uses('ini_parser,modules,plugins');
+
 // Get server configuration
-$this->uses('ini_parser');
 $conf["serverconfig"] = $app->ini_parser->parse_ini_string(stripslashes($server_db_record["config"]));
 
-// Run the configuration modules
-if($server_db_record["mail_server"] == 1) {
-	$app->load('mod_mail_base');
-	$mail_module_name = 'mod_mail_'.$conf["serverconfig"]["mail"]["module"];
-	$app->uses($mail_module_name);
-	$app->$mail_module_name->write_config();
-}
+/*
+ Load the modules that are im the mods-enabled folder
+*/
 
-if($server_db_record["web_server"] == 1) {
-	$app->load('mod_web_base');
-	$web_module_name = 'mod_web_'.$conf["serverconfig"]["web"]["module"];
-	$app->uses($web_module_name);
-	$app->$web_module_name->write_config();
-}
+$this->modules->loadModules();
 
-if($server_db_record["dns_server"] == 1) {
-	$app->load('mod_dns_base');
-	$dns_module_name = 'mod_dns_'.$conf["serverconfig"]["dns"]["module"];
-	$app->uses($dns_module_name);
-	$app->$dns_module_name->write_config();
-}
 
-if($server_db_record["file_server"] == 1) {
-	$app->load('mod_file_base');
-	$file_module_name = 'mod_file_'.$conf["serverconfig"]["file"]["module"];
-	$app->uses($file_module_name);
-	$app->$file_module_name->write_config();
-}
+/*
+ Load the plugins that are in the plugins-enabled folder
+*/
 
-if($server_db_record["db_server"] == 1) {
-	$app->load('mod_db_base');
-	$db_module_name = 'mod_db_'.$conf["serverconfig"]["db"]["module"];
-	$app->uses($db_module_name);
-	$app->$db_module_name->write_config();
-}
+$this->plugins->loadPlugins();
 
-if($server_db_record["vserver_server"] == 1) {
-	$app->load('mod_vserver_base');
-	$vserver_module_name = 'mod_vserver_'.$conf["serverconfig"]["vserver"]["module"];
-	$app->uses($vserver_module_name);
-	$app->$vserver_module_name->write_config();
-}
+/*
+ Go trough the sys_datalog table and call the processing functions
+ in the modules that are hooked on to the table actions
+*/
+$this->modules->processDatalog();
 
 // Remove lock
 @unlink($conf["temppath"].$conf["fs_div"].".ispconfig_lock");

--
Gitblit v1.9.1