From d87f76019fc231ec20d95126a7fee0487e7be5f0 Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Tue, 14 Aug 2012 10:56:20 -0400
Subject: [PATCH] - Added new web folder named private to web folder layout. The folder is intended to store data that shall not be visible in the web directory, it is owned by the user of the web. - Changed ownership of web root directory to root user in all security modes to prevent symlink attacks. - Apache log files are now owned by user root. - Improved functions in system library.

---
 server/lib/classes/db_mysql.inc.php |   69 +++++++++++++++++++---------------
 1 files changed, 39 insertions(+), 30 deletions(-)

diff --git a/server/lib/classes/db_mysql.inc.php b/server/lib/classes/db_mysql.inc.php
index 27a62bd..d2b4dd6 100644
--- a/server/lib/classes/db_mysql.inc.php
+++ b/server/lib/classes/db_mysql.inc.php
@@ -1,4 +1,3 @@
-
 <?php
 /*
    Copyright (c) 2005, Till Brehm, projektfarm Gmbh
@@ -30,7 +29,7 @@
 
 class db extends mysqli
 {
-  private $dbHost = '';		// hostname of the MySQL server
+  protected $dbHost = '';		// hostname of the MySQL server
   private $dbName = '';		// logical database name on that server
   private $dbUser = '';		// database authorized user
   private $dbPass = '';		// user's password
@@ -42,34 +41,39 @@
   private $record	= array();	// last record fetched
   private $autoCommit = 1;    // Autocommit Transactions
   private $currentRow;		// current row number
-  private $errorNumber = 0;	// last error number
+  public $errorNumber = 0;	// last error number
   public $errorMessage = '';	// last error message
   private $errorLocation = '';// last error location
   public $show_error_messages = false; // false in server, true in interface
 
   // constructor
-  public function __construct() {
-    global $conf;
-    $this->dbHost = $conf['db_host'];
-    $this->dbName = $conf['db_database'];
-    $this->dbUser = $conf['db_user'];
-    $this->dbPass = $conf['db_password'];
+  public function __construct($host = NULL , $user = NULL, $pass = NULL, $database = NULL) {
+    global $app, $conf;
+
+    $this->dbHost = $host ? $host  : $conf['db_host'];
+    $this->dbName = $database ? $database : $conf['db_database'];
+    $this->dbUser = $user ? $user : $conf['db_user'];
+    $this->dbPass = $pass ? $pass : $conf['db_password'];
     $this->dbCharset = $conf['db_charset'];
     $this->dbNewLink = $conf['db_new_link'];
     $this->dbClientFlags = $conf['db_client_flags'];
-    parent::__construct($conf['db_host'], $conf['db_user'],$conf['db_password'],$conf['db_database']);
+
+    parent::__construct($this->dbHost, $this->dbUser, $this->dbPass,$this->dbName);
     if ($this->connect_error) {
       $this->updateError('DB::__construct');
-      return false;
     }
     parent::query( 'SET NAMES '.$this->dbCharset); 
     parent::query( "SET character_set_results = '".$this->dbCharset."', character_set_client = '".$this->dbCharset."', character_set_connection = '".$this->dbCharset."', character_set_database = '".$this->dbCharset."', character_set_server = '".$this->dbCharset."'");
-
   }
 
   public function __destruct() {
     $this->close(); // helps avoid memory leaks, and persitent connections that don't go away.
   }
+
+  /* This allows our private variables to be "read" out side of the class */
+   public function __get($var) {
+	   return isset($this->$var) ? $this->$var : NULL;
+   }
 
   // error handler
   public function updateError($location) {
@@ -89,8 +93,11 @@
       // This right here will allow us to use the samefile for server & interface
       if($this->show_error_messages) {
 	echo $error_msg;
-      } else if(method_exists($app, 'log')) {
+      } else if(is_object($app) && method_exists($app, 'log')) {
 	$app->log($error_msg, LOGLEVEL_WARN);
+      } else {
+	      /* This could be called before $app is ever declared..  In that case we should just spit out to error_log() */
+	   error_log($error_msg);
       }
     }
   }
@@ -218,10 +225,10 @@
     if(is_array($record_old) && count($record_old) > 0) {
       foreach($record_old as $key => $val) {
 	// if(!isset($record_new[$key]) || $record_new[$key] != $val) {
-	if($record_new[$key] != $val) {
+	if(@$record_new[$key] != $val) {
 	  // Record has changed
 	  $diffrec_full['old'][$key] = $val;
-	  $diffrec_full['new'][$key] = $record_new[$key];
+	  $diffrec_full['new'][$key] = @$record_new[$key];
 	  $diff_num++;
 	} else {
 	  $diffrec_full['old'][$key] = $val;
@@ -245,8 +252,8 @@
       return array('diff_num' => $diff_num, 'diff_rec' => $diffrec_full);
 
     }
-
-    //** Function to fill the datalog with a full differential record.
+	
+	//** Function to fill the datalog with a full differential record.
     public function datalogSave($db_table, $action, $primary_field, $primary_id, $record_old, $record_new) {
       global $app,$conf;
 
@@ -267,19 +274,21 @@
       if(isset($record_new['server_id'])) $server_id = $record_new['server_id'];
 
 
-      if($diff_num > 0) {
-	//print_r($diff_num);
-	//print_r($diffrec_full);
-	$diffstr = $app->db->quote(serialize($diffrec_full));
-	$username = $app->db->quote($_SESSION['s']['user']['username']);
-	$dbidx = $primary_field.':'.$primary_id;
+	if($diff_num > 0) {
+		$diffstr = $this->quote(serialize($diffrec_full));
+		if(isset($_SESSION)) {
+			$username = $this->quote($_SESSION['s']['user']['username']);
+		} else {
+			$username = 'admin';
+		}
+		$dbidx = $primary_field.':'.$primary_id;
 
-	if($action == 'INSERT') $action = 'i';
-	if($action == 'UPDATE') $action = 'u';
-	if($action == 'DELETE') $action = 'd';
-	$sql = "INSERT INTO sys_datalog (dbtable,dbidx,server_id,action,tstamp,user,data) VALUES ('".$db_table."','$dbidx','$server_id','$action','".time()."','$username','$diffstr')";
-	$app->db->query($sql);
-      }
+		if($action == 'INSERT') $action = 'i';
+		if($action == 'UPDATE') $action = 'u';
+		if($action == 'DELETE') $action = 'd';
+		$sql = "INSERT INTO sys_datalog (dbtable,dbidx,server_id,action,tstamp,user,data) VALUES ('".$db_table."','$dbidx','$server_id','$action','".time()."','$username','$diffstr')";
+		$this->query($sql);
+	}
 
       return true;
     }
@@ -583,4 +592,4 @@
 
 	      }
 
-	      ?>
+	      ?>
\ No newline at end of file

--
Gitblit v1.9.1