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/100-monitor_email_quota.inc.php |  125 ++++++++++++++++++++++-------------------
 1 files changed, 66 insertions(+), 59 deletions(-)

diff --git a/server/lib/classes/cron.d/100-monitor_email_quota.inc.php b/server/lib/classes/cron.d/100-monitor_email_quota.inc.php
index 12bd3fe..75014c3 100644
--- a/server/lib/classes/cron.d/100-monitor_email_quota.inc.php
+++ b/server/lib/classes/cron.d/100-monitor_email_quota.inc.php
@@ -29,40 +29,40 @@
 */
 
 class cronjob_monitor_email_quota extends cronjob {
-    
-    // job schedule
-    protected $_schedule = '*/15 * * * *';
-    protected $_run_at_new = true;
-	
-    private $_tools = null;
-    
-    /* this function is optional if it contains no custom code */
-    public function onPrepare() {
-        global $app;
-        
-        parent::onPrepare();
-    }
-    
-    /* this function is optional if it contains no custom code */
-    public function onBeforeRun() {
-        global $app;
-        
-        return parent::onBeforeRun();
-    }
-    
-    public function onRunJob() {
-        global $app, $conf;
-        
+
+	// job schedule
+	protected $_schedule = '*/15 * * * *';
+	protected $_run_at_new = true;
+
+	private $_tools = null;
+
+	/* this function is optional if it contains no custom code */
+	public function onPrepare() {
+		global $app;
+
+		parent::onPrepare();
+	}
+
+	/* this function is optional if it contains no custom code */
+	public function onBeforeRun() {
+		global $app;
+
+		return parent::onBeforeRun();
+	}
+
+	public function onRunJob() {
+		global $app, $conf;
+
 		$app->uses('getconf');
 		$mail_config = $app->getconf->get_server_config($conf['server_id'], 'mail');
 		if($mail_config['mailbox_quota_stats'] == 'n') return;
 
-        /* used for all monitor cronjobs */
-        $app->load('monitor_tools');
-        $this->_tools = new monitor_tools();
-        /* end global section for monitor cronjobs */
-        
-        
+		/* used for all monitor cronjobs */
+		$app->load('monitor_tools');
+		$this->_tools = new monitor_tools();
+		/* end global section for monitor cronjobs */
+
+
 		//* Initialize data array
 		$data = array();
 
@@ -75,19 +75,32 @@
 		//* The state of the email_quota.
 		$state = 'ok';
 
-		$mailboxes = $app->db->queryAllRecords("SELECT email,maildir FROM mail_user WHERE server_id = $server_id");
+		$mailboxes = $app->db->queryAllRecords("SELECT email,maildir FROM mail_user WHERE server_id = ?", $server_id);
 		if(is_array($mailboxes)) {
+
+			//* with dovecot we can use doveadm instead of 'du -s'
+			$dovecot = false;
+			if (isset($mail_config['pop3_imap_daemon']) && $mail_config ['pop3_imap_daemon'] = 'dovecot' && is_executable('doveadm')) {
+				exec('doveadm quota 2>&1', $tmp_output, $tmp_retval); // with dovecot 2.2.x 'doveadm quota' is unuseable
+				if ($retval = 64) $dovecot = true;
+			}
+
 			foreach($mailboxes as $mb) {
 				$email = $mb['email'];
-				$email_parts = explode('@',$mb['email']);
+				$email_parts = explode('@', $mb['email']);
 				$filename = $mb['maildir'].'/.quotausage';
+				if(!file_exists($filename) && $dovecot) {
+					exec('doveadm quota recalc -u '.$email);
+				}
 				if(file_exists($filename) && !is_link($filename)) {
 					$quotafile = file($filename);
-					$data[$email]['used'] = trim($quotafile['1']);
+					preg_match('/storage.*?([0-9]+)/s', implode('',$quotafile), $storage_value);
+					$data[$email]['used'] = $storage_value[1];
+					$app->log("Mail storage $email: " . $storage_value[1], LOGLEVEL_DEBUG);
 					unset($quotafile);
 				} else {
-					exec('du -s '.escapeshellcmd($mb['maildir']),$out);
-					$parts = explode(' ',$out[0]);
+					exec('du -s '.escapeshellcmd($mb['maildir']), $out);
+					$parts = explode(' ', $out[0]);
 					$data[$email]['used'] = intval($parts[0])*1024;
 					unset($out);
 					unset($parts);
@@ -97,7 +110,7 @@
 
 		unset($mailboxes);
 
-				//* Dovecot quota check Courier in progress lathama@gmail.com
+		//* Dovecot quota check Courier in progress lathama@gmail.com
 		/*
 				if($dir = opendir("/var/vmail")){
 						while (($quotafiles = readdir($dir)) !== false){
@@ -111,38 +124,32 @@
 						closedir($dir);
 				}
 		*/
-        $res = array();
+		$res = array();
 		$res['server_id'] = $server_id;
 		$res['type'] = $type;
 		$res['data'] = $data;
 		$res['state'] = $state;
 
-        /*
+		/*
          * Insert the data into the database
          */
-        $sql = 'REPLACE INTO monitor_data (server_id, type, created, data, state) ' .
-                'VALUES (' .
-                $res['server_id'] . ', ' .
-                "'" . $app->dbmaster->quote($res['type']) . "', " .
-                'UNIX_TIMESTAMP(), ' .
-                "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " .
-                "'" . $res['state'] . "'" .
-                ')';
-        $app->dbmaster->query($sql);
+		$sql = 'REPLACE INTO monitor_data (server_id, type, created, data, state) ' .
+			'VALUES (?, ?, UNIX_TIMESTAMP(), ?, ?)';
+		$app->dbmaster->query($sql, $res['server_id'], $res['type'], serialize($res['data']), $res['state']);
 
-        /* The new data is written, now we can delete the old one */
-        $this->_tools->delOldRecords($res['type'], $res['server_id']);
+		/* The new data is written, now we can delete the old one */
+		$this->_tools->delOldRecords($res['type'], $res['server_id']);
 
-        
-        parent::onRunJob();
-    }
-    
-    /* this function is optional if it contains no custom code */
-    public function onAfterRun() {
-        global $app;
-        
-        parent::onAfterRun();
-    }
+
+		parent::onRunJob();
+	}
+
+	/* this function is optional if it contains no custom code */
+	public function onAfterRun() {
+		global $app;
+
+		parent::onAfterRun();
+	}
 
 }
 

--
Gitblit v1.9.1