From b9a3ef486ebcde18a5ade37865ff8f397185d24f Mon Sep 17 00:00:00 2001
From: Till Brehm <tbrehm@ispconfig.org>
Date: Sun, 24 Jul 2016 05:30:59 -0400
Subject: [PATCH] Fixed #3979 Mailbox users unable to save autoresponders

---
 server/lib/classes/cron.d/300-quota_notify.inc.php |  339 ++++++++++++++++++++++++++++++++------------------------
 1 files changed, 194 insertions(+), 145 deletions(-)

diff --git a/server/lib/classes/cron.d/300-quota_notify.inc.php b/server/lib/classes/cron.d/300-quota_notify.inc.php
index 1d24e7c..d250fe7 100644
--- a/server/lib/classes/cron.d/300-quota_notify.inc.php
+++ b/server/lib/classes/cron.d/300-quota_notify.inc.php
@@ -49,64 +49,11 @@
 
 	public function onRunJob() {
 		global $app, $conf;
-
-		//########
-		// function for sending notification emails
-		//########
-		function send_notification_email($template, $placeholders, $recipients) {
-			global $conf;
-
-			if(!is_array($recipients) || count($recipients) < 1) return false;
-			if(!is_array($placeholders)) $placeholders = array();
-
-			if(file_exists($conf['rootpath'].'/conf-custom/mail/' . $template . '_'.$conf['language'].'.txt')) {
-				$lines = file($conf['rootpath'].'/conf-custom/mail/' . $template . '_'.$conf['language'].'.txt');
-			} elseif(file_exists($conf['rootpath'].'/conf-custom/mail/' . $template . '_en.txt')) {
-				$lines = file($conf['rootpath'].'/conf-custom/mail/' . $template . '_en.txt');
-			} elseif(file_exists($conf['rootpath'].'/conf/mail/' . $template . '_'.$conf['language'].'.txt')) {
-				$lines = file($conf['rootpath'].'/conf/mail/' . $template . '_'.$conf['language'].'.txt');
-			} else {
-				$lines = file($conf['rootpath'].'/conf/mail/' . $template . '_en.txt');
-			}
-
-			//* get mail headers, subject and body
-			$mailHeaders = '';
-			$mailBody = '';
-			$mailSubject = '';
-			$inHeader = true;
-			for($l = 0; $l < count($lines); $l++) {
-				if($lines[$l] == '') {
-					$inHeader = false;
-					continue;
-				}
-				if($inHeader == true) {
-					$parts = explode(':', $lines[$l], 2);
-					if(strtolower($parts[0]) == 'subject') $mailSubject = trim($parts[1]);
-					unset($parts);
-					$mailHeaders .= trim($lines[$l]) . "\n";
-				} else {
-					$mailBody .= trim($lines[$l]) . "\n";
-				}
-			}
-			$mailBody = trim($mailBody);
-
-			//* Replace placeholders
-			$mailHeaders = strtr($mailHeaders, $placeholders);
-			$mailSubject = strtr($mailSubject, $placeholders);
-			$mailBody = strtr($mailBody, $placeholders);
-
-			for($r = 0; $r < count($recipients); $r++) {
-				mail($recipients[$r], $mailSubject, $mailBody, $mailHeaders);
-			}
-
-			unset($mailSubject);
-			unset($mailHeaders);
-			unset($mailBody);
-			unset($lines);
-
-			return true;
-		}
-
+		
+		/* used for all monitor cronjobs */
+		$app->load('monitor_tools');
+		$this->_tools = new monitor_tools();
+		/* end global section for monitor cronjobs */
 
 		//######################################################################################################
 		// enforce traffic quota (run only on the "master-server")
@@ -127,26 +74,12 @@
 					$web_traffic_quota = $rec['traffic_quota'];
 					$domain = $rec['domain'];
 
-					// get the client
-					/*
-                    $client_group_id = $rec["sys_groupid"];
-                    $client = $app->db->queryOneRecord("SELECT limit_traffic_quota,parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-                    $reseller = $app->db->queryOneRecord("SELECT limit_traffic_quota FROM client WHERE client_id = ".intval($client['parent_client_id']));
-
-                    $client_traffic_quota = intval($client['limit_traffic_quota']);
-                    $reseller_traffic_quota = intval($reseller['limit_traffic_quota']);
-                    */
-
 					//* get the traffic
 					$tmp = $app->db->queryOneRecord("SELECT SUM(traffic_bytes) As total_traffic_bytes FROM web_traffic WHERE traffic_date like '$current_month%' AND hostname = '$domain'");
 					$web_traffic = round($tmp['total_traffic_bytes']/1024/1024);
 
-					//* Website is over quota, we will disable it
-					/*if( ($web_traffic_quota > 0 && $web_traffic > $web_traffic_quota) ||
-                        ($client_traffic_quota > 0 && $web_traffic > $client_traffic_quota) ||
-                        ($reseller_traffic_quota > 0 && $web_traffic > $reseller_traffic_quota)) {*/
 					if($web_traffic_quota > 0 && $web_traffic > $web_traffic_quota) {
-						$app->dbmaster->datalogUpdate('web_domain', "traffic_quota_lock = 'y',active = 'n'", 'domain_id', $rec['domain_id']);
+						$app->dbmaster->datalogUpdate('web_domain', array("traffic_quota_lock" => 'y', "active" => 'n'), 'domain_id', $rec['domain_id']);
 						$app->log('Traffic quota for '.$rec['domain'].' exceeded. Disabling website.', LOGLEVEL_DEBUG);
 
 						//* Send traffic notifications
@@ -164,19 +97,19 @@
 							//* Send email to client
 							if($web_config['overtraffic_notify_client'] == 'y') {
 								$client_group_id = $rec["sys_groupid"];
-								$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+								$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
 								if($client['email'] != '') {
 									$recipients[] = $client['email'];
 								}
 							}
 
-							send_notification_email('web_traffic_notification', $placeholders, $recipients);
+							$this->_tools->send_notification_email('web_traffic_notification', $placeholders, $recipients);
 						}
 
 					} else {
 						//* unlock the website, if traffic is lower then quota
 						if($rec['traffic_quota_lock'] == 'y') {
-							$app->dbmaster->datalogUpdate('web_domain', "traffic_quota_lock = 'n',active = 'y'", 'domain_id', $rec['domain_id']);
+							$app->dbmaster->datalogUpdate('web_domain', array("traffic_quota_lock" => 'n', "active" => 'y'), 'domain_id', $rec['domain_id']);
 							$app->log('Traffic quota for '.$rec['domain'].' ok again. Re-enabling website.', LOGLEVEL_DEBUG);
 						}
 					}
@@ -214,10 +147,10 @@
 					$domain = $rec['domain'];
 
 					$username = $rec['system_user'];
-					$rec['used'] = $monitor_data['user'][$username]['used'];
-					$rec['soft'] = $monitor_data['user'][$username]['soft'];
-					$rec['hard'] = $monitor_data['user'][$username]['hard'];
-					$rec['files'] = $monitor_data['user'][$username]['files'];
+					$rec['used'] = @$monitor_data['user'][$username]['used'];
+					$rec['soft'] = @$monitor_data['user'][$username]['soft'];
+					$rec['hard'] = @$monitor_data['user'][$username]['hard'];
+					$rec['files'] = @$monitor_data['user'][$username]['files'];
 
 					if (!is_numeric($rec['used'])){
 						if ($rec['used'][0] > $rec['used'][1]){
@@ -264,7 +197,7 @@
 					// send notifications only if 90% or more of the quota are used
 					if($used_ratio < 0.9) {
 						// reset notification date
-						if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('web_domain', "last_quota_notification = NULL", 'domain_id', $rec['domain_id']);
+						if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('web_domain', array("last_quota_notification" => null), 'domain_id', $rec['domain_id']);
 
 						// send notification - everything ok again
 						if($rec['last_quota_notification'] && $web_config['overquota_notify_onok'] == 'y' && ($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_client'] == 'y')) {
@@ -285,49 +218,48 @@
 							//* Send email to client
 							if($web_config['overquota_notify_client'] == 'y') {
 								$client_group_id = $rec["sys_groupid"];
-								$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+								$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
 								if($client['email'] != '') {
 									$recipients[] = $client['email'];
 								}
 							}
-							send_notification_email('web_quota_ok_notification', $placeholders, $recipients);
+							$this->_tools->send_notification_email('web_quota_ok_notification', $placeholders, $recipients);
 						}
+					} else {
 
-						continue;
-					}
+						// could a notification be sent?
+						$send_notification = false;
+						if(!$rec['last_quota_notification']) $send_notification = true; // not yet notified
+						elseif($web_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $web_config['overquota_notify_freq']) $send_notification = true;
 
-					// could a notification be sent?
-					$send_notification = false;
-					if(!$rec['last_quota_notification']) $send_notification = true; // not yet notified
-					elseif($web_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $web_config['overquota_notify_freq']) $send_notification = true;
+						//* Send quota notifications
+						if(($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_client'] == 'y') && $send_notification == true) {
+							$app->dbmaster->datalogUpdate('web_domain', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'domain_id', $rec['domain_id']);
 
-					//* Send quota notifications
-					if(($web_config['overquota_notify_admin'] == 'y' || $web_config['overquota_notify_client'] == 'y') && $send_notification == true) {
-						$app->dbmaster->datalogUpdate('web_domain', "last_quota_notification = CURDATE()", 'domain_id', $rec['domain_id']);
+							$placeholders = array('{domain}' => $rec['domain'],
+								'{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'),
+								'{used}' => $rec['used'],
+								'{soft}' => $rec['soft'],
+								'{hard}' => $rec['hard'],
+								'{ratio}' => $rec['ratio']);
 
-						$placeholders = array('{domain}' => $rec['domain'],
-							'{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'),
-							'{used}' => $rec['used'],
-							'{soft}' => $rec['soft'],
-							'{hard}' => $rec['hard'],
-							'{ratio}' => $rec['ratio']);
+							$recipients = array();
 
-						$recipients = array();
-
-						//* send email to admin
-						if($global_config['admin_mail'] != '' && $web_config['overquota_notify_admin'] == 'y') {
-							$recipients[] = $global_config['admin_mail'];
-						}
-
-						//* Send email to client
-						if($web_config['overquota_notify_client'] == 'y') {
-							$client_group_id = $rec["sys_groupid"];
-							$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-							if($client['email'] != '') {
-								$recipients[] = $client['email'];
+							//* send email to admin
+							if($global_config['admin_mail'] != '' && $web_config['overquota_notify_admin'] == 'y') {
+								$recipients[] = $global_config['admin_mail'];
 							}
+
+							//* Send email to client
+							if($web_config['overquota_notify_client'] == 'y') {
+								$client_group_id = $rec["sys_groupid"];
+								$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
+								if($client['email'] != '') {
+									$recipients[] = $client['email'];
+								}
+							}
+							$this->_tools->send_notification_email('web_quota_notification', $placeholders, $recipients);
 						}
-						send_notification_email('web_quota_notification', $placeholders, $recipients);
 					}
 				}
 			}
@@ -394,7 +326,7 @@
 					// send notifications only if 90% or more of the quota are used
 					if($used_ratio < 0.9) {
 						// reset notification date
-						if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('mail_user', "last_quota_notification = NULL", 'mailuser_id', $rec['mailuser_id']);
+						if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('mail_user', array("last_quota_notification" => null), 'mailuser_id', $rec['mailuser_id']);
 
 						// send notification - everything ok again
 						if($rec['last_quota_notification'] && $mail_config['overquota_notify_onok'] == 'y' && ($mail_config['overquota_notify_admin'] == 'y' || $mail_config['overquota_notify_client'] == 'y')) {
@@ -414,56 +346,173 @@
 							//* Send email to client
 							if($mail_config['overquota_notify_client'] == 'y') {
 								$client_group_id = $rec["sys_groupid"];
-								$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
+								$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
 								if($client['email'] != '') {
 									$recipients[] = $client['email'];
 								}
 							}
 
-							send_notification_email('mail_quota_ok_notification', $placeholders, $recipients);
+							$this->_tools->send_notification_email('mail_quota_ok_notification', $placeholders, $recipients);
 						}
+					} else {
 
-						continue;
-					}
+						//* Send quota notifications
+						// could a notification be sent?
+						$send_notification = false;
+						if(!$rec['last_quota_notification']) $send_notification = true; // not yet notified
+						elseif($mail_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $mail_config['overquota_notify_freq']) $send_notification = true;
 
-					//* Send quota notifications
-					// could a notification be sent?
-					$send_notification = false;
-					if(!$rec['last_quota_notification']) $send_notification = true; // not yet notified
-					elseif($mail_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $mail_config['overquota_notify_freq']) $send_notification = true;
+						if(($mail_config['overquota_notify_admin'] == 'y' || $mail_config['overquota_notify_client'] == 'y') && $send_notification == true) {
+							$app->dbmaster->datalogUpdate('mail_user', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'mailuser_id', $rec['mailuser_id']);
 
-					if(($mail_config['overquota_notify_admin'] == 'y' || $mail_config['overquota_notify_client'] == 'y') && $send_notification == true) {
-						$app->dbmaster->datalogUpdate('mail_user', "last_quota_notification = CURDATE()", 'mailuser_id', $rec['mailuser_id']);
+							$placeholders = array('{email}' => $rec['email'],
+								'{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'),
+								'{used}' => $rec['used'],
+								'{name}' => $rec['name'],
+								'{quota}' => $rec['quota'],
+								'{ratio}' => $rec['ratio']);
 
-						$placeholders = array('{email}' => $rec['email'],
-							'{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'),
-							'{used}' => $rec['used'],
-							'{name}' => $rec['name'],
-							'{quota}' => $rec['quota'],
-							'{ratio}' => $rec['ratio']);
-
-						$recipients = array();
-						//* send email to admin
-						if($global_config['admin_mail'] != '' && $mail_config['overquota_notify_admin'] == 'y') {
-							$recipients[] = $global_config['admin_mail'];
-						}
-
-						//* Send email to client
-						if($mail_config['overquota_notify_client'] == 'y') {
-							$client_group_id = $rec["sys_groupid"];
-							$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = $client_group_id");
-							if($client['email'] != '') {
-								$recipients[] = $client['email'];
+							$recipients = array();
+							//* send email to admin
+							if($global_config['admin_mail'] != '' && $mail_config['overquota_notify_admin'] == 'y') {
+								$recipients[] = $global_config['admin_mail'];
 							}
-						}
 
-						send_notification_email('mail_quota_notification', $placeholders, $recipients);
+							//* Send email to client
+							if($mail_config['overquota_notify_client'] == 'y') {
+								$client_group_id = $rec["sys_groupid"];
+								$client = $app->db->queryOneRecord("SELECT client.email FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
+								if($client['email'] != '') {
+									$recipients[] = $client['email'];
+								}
+							}
+
+							$this->_tools->send_notification_email('mail_quota_notification', $placeholders, $recipients);
+						}
 					}
 				}
 			}
 		}
 
+		//######################################################################################################
+		// send database quota warnings by email
+		//######################################################################################################
 
+		if ($app->dbmaster == $app->db) {
+
+			$global_config = $app->getconf->get_global_config('mail');
+
+			//* get monitor-data
+			$tmp_rec = $app->db->queryAllRecords("SELECT data from monitor_data WHERE type = 'database_size' ORDER BY created DESC");
+			if(is_array($tmp_rec)) {
+				$monitor_data = array();
+				foreach ($tmp_rec as $tmp_mon) {
+					$tmp_array = unserialize($app->db->unquote($tmp_mon['data']));
+					if(is_array($tmp_array)) 
+						foreach($tmp_array as $sys_groupid => $data)
+							$monitor_data[$data['sys_groupid']][] = $data;
+				}
+				//* remove duplicates from monitor-data
+				foreach($monitor_data as $_monitor_data) 
+					$monitor_data[$_monitor_data[0]['sys_groupid']]=array_map("unserialize", array_unique(array_map("serialize", $_monitor_data)));
+			}
+
+			//* get databases
+			$database_records = $app->db->queryAllRecords("SELECT database_id,sys_groupid,database_name,database_quota,last_quota_notification,DATEDIFF(CURDATE(), last_quota_notification) as `notified_before` FROM web_database");
+
+			if(is_array($database_records) && !empty($database_records) && is_array($monitor_data) && !empty($monitor_data)) {
+				//* check database-quota
+				foreach($database_records as $rec) {
+					$database = $rec['database_name'];
+					$quota = $rec['database_quota'] * 1024 * 1024;
+					if (!is_numeric($quota)) break;
+
+					foreach ($monitor_data as $cid) {
+
+						foreach($cid_data as $monitor) {
+
+							if ($monitor['database_name'] == $database) {
+								//* get the client
+								$client = $app->db->queryOneRecord("SELECT client.username, client.email FROM web_database, sys_group, client WHERE web_database.sys_groupid = sys_group.groupid AND sys_group.client_id = client.client_id AND web_database.database_name=?", $database);
+
+								//* check quota
+								if ($quota > 0) $used_ratio = $monitor['size'] / $quota;
+								else $used_ratio = 0;
+
+								//* send notifications only if 90% or more of the quota are used
+								if($used_ratio > 0.9) {
+
+									//* reset notification date
+									if($rec['last_quota_notification']) $app->dbmaster->datalogUpdate('web_database', array("last_quota_notification" => null), 'database_id', $rec['database_id']);
+
+									$app->dbmaster->datalogUpdate('web_database', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'database_id', $rec['database_id']);
+
+									// send notification - everything ok again
+									if($rec['last_quota_notification'] && $web_config['overquota_notify_onok'] == 'y' && ($web_config['overquota_db_notify_admin'] == 'y' || $web_config['overquota_db_notify_client'] == 'y')) {
+										$placeholders = array(
+											'{database_name}' => $rec['database_name'],
+											'{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'),
+											'{used}' => $app->functions->formatBytes($monitor['size']),
+											'{quota}' => $quota.' MB',
+											'{ratio}' => number_format($used_ratio * 100, 2, '.', '').'%'
+										);
+
+										$recipients = array();
+
+										//* send email to admin
+										if($global_config['admin_mail'] != '' && $web_config['overquota_db_notify_admin'] == 'y') 
+											$recipients[] = $global_config['admin_mail'];
+
+										//* Send email to client
+										if($web_config['overquota_db_notify_client'] == 'y' && $client['email'] != '') 
+											$recipients[] = $client['email'];
+
+										$this->_tools->send_notification_email('db_quota_ok_notification', $placeholders, $recipients);
+
+									}
+
+								}
+
+								//* could a notification be sent?
+								$send_notification = false;
+								if(!$rec['last_quota_notification']) $send_notification = true; //* not yet notified
+								elseif($web_config['overquota_notify_freq'] > 0 && $rec['notified_before'] >= $web_config['overquota_notify_freq']) $send_notification = true;
+
+								//* Send quota notifications
+								if(($web_config['overquota_db_notify_admin'] == 'y' || $web_config['overquota_db_notify_client'] == 'y') && $send_notification == true) {
+									$app->dbmaster->datalogUpdate('web_database', array("last_quota_notification" => array("SQL" => "CURDATE()")), 'database_id', $rec['database_id']);
+									$placeholders = array(
+										'{database_name}' => $rec['database_name'],
+										'{admin_mail}' => ($global_config['admin_mail'] != ''? $global_config['admin_mail'] : 'root'),
+										'{used}' => $app->functions->formatBytes($monitor['size']),
+										'{quota}' => $quota.' MB',
+										'{ratio}' => number_format($used_ratio * 100, 2, '.', '').'%'
+									);
+
+									$recipients = array();
+
+									//* send email to admin
+									if($global_config['admin_mail'] != '' && $web_config['overquota_db_notify_admin'] == 'y')
+										$recipients[] = $global_config['admin_mail'];
+
+									//* Send email to client
+									if($web_config['overquota_db_notify_client'] == 'y' && $client['email'] != '')
+										$recipients[] = $client['email'];
+
+									$this->_tools->send_notification_email('db_quota_notification', $placeholders, $recipients);
+
+								}
+
+							}
+
+						}   
+
+					}
+
+				}
+
+			}
+		}
 		parent::onRunJob();
 	}
 

--
Gitblit v1.9.1