From b5e5f8f9348c76c213cfc0583183601a90a24ee4 Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Sun, 1 Jan 2017 19:49:02 +0100
Subject: [PATCH 01/14] Add volume

---
 data/Dockerfiles/sogo/Dockerfile | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/data/Dockerfiles/sogo/Dockerfile b/data/Dockerfiles/sogo/Dockerfile
index 2d043fdd..932dc751 100644
--- a/data/Dockerfiles/sogo/Dockerfile
+++ b/data/Dockerfiles/sogo/Dockerfile
@@ -38,6 +38,8 @@ COPY supervisord.conf /etc/supervisor/supervisord.conf
 EXPOSE 20000
 EXPOSE 9191
 
+VOLUME /usr/lib/GNUstep/SOGo/WebServerResources/
+
 CMD exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
 
 RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

From bb3ef747219f78f4b10c8a7aa94e61109af1db61 Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Sun, 1 Jan 2017 21:23:10 +0100
Subject: [PATCH 02/14] Change service names to skip alias

---
 docker-compose.yml | 77 ++++++++++++++++------------------------------
 1 file changed, 27 insertions(+), 50 deletions(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index b91c5516..2c74fc5c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,7 +1,7 @@
 version: '2'
 
 services:
-    pdns-mailcow:
+    pdns:
       image: andryyy/mailcow-dockerized:pdns
       volumes:
         - ./data/conf/pdns/:/etc/powerdns/
@@ -9,13 +9,11 @@ services:
       networks:
         mailcow-network:
           ipv4_address: 172.22.1.254
-          aliases:
-            - pdns
 
-    mysql-mailcow:
+    mysql:
       image: mariadb:10.1
       depends_on:
-        - pdns-mailcow
+        - pdns
       command: mysqld
       volumes:
         - mysql-vol-1:/var/lib/mysql/
@@ -31,13 +29,11 @@ services:
       restart: always
       networks:
         mailcow-network:
-          aliases:
-            - mysql
 
-    redis-mailcow:
+    redis:
       image: redis
       depends_on:
-        - pdns-mailcow
+        - pdns
       volumes:
         - redis-vol-1:/data/
       restart: always
@@ -46,13 +42,11 @@ services:
       dns_search: mailcow-network
       networks:
         mailcow-network:
-          aliases:
-            - redis
 
-    rspamd-mailcow:
+    rspamd:
       image: andryyy/mailcow-dockerized:rspamd
       depends_on:
-        - pdns-mailcow
+        - pdns
       volumes:
         - ./data/conf/rspamd/override.d/:/etc/rspamd/override.d:ro
         - ./data/conf/rspamd/local.d/:/etc/rspamd/local.d:ro
@@ -64,13 +58,11 @@ services:
       dns_search: mailcow-network
       networks:
         mailcow-network:
-          aliases:
-            - rspamd
 
-    php-fpm-mailcow:
+    phpfpm:
       image: andryyy/mailcow-dockerized:phpfpm
       depends_on:
-        - pdns-mailcow
+        - pdns
       volumes:
         - ./data/web:/web:ro
         - ./data/conf/rspamd/dynmaps:/dynmaps:ro
@@ -87,14 +79,12 @@ services:
       restart: always
       networks:
         mailcow-network:
-          aliases:
-            - phpfpm
 
-    sogo-mailcow:
+    sogo:
       image: andryyy/mailcow-dockerized:sogo
       depends_on:
-        - pdns-mailcow
-        - mysql-mailcow
+        - pdns
+        - mysql
       environment:
         - DBNAME=${DBNAME}
         - DBUSER=${DBUSER}
@@ -105,17 +95,14 @@ services:
       dns_search: mailcow-network
       volumes:
         - ./data/conf/sogo/:/etc/sogo/
-        - /usr/lib/GNUstep/SOGo/WebServerResources/
       restart: always
       networks:
         mailcow-network:
-          aliases:
-            - sogo
 
-    rmilter-mailcow:
+    rmilter:
       image: andryyy/mailcow-dockerized:rmilter
       depends_on:
-        - pdns-mailcow
+        - pdns
       volumes:
         - ./data/conf/rmilter/:/etc/rmilter.conf.d/:ro
       restart: always
@@ -124,19 +111,17 @@ services:
       dns_search: mailcow-network
       networks:
         mailcow-network:
-          aliases:
-            - rmilter
 
-    dovecot-mailcow:
+    dovecot:
       image: andryyy/mailcow-dockerized:dovecot
       depends_on:
-        - pdns-mailcow
+        - pdns
       volumes:
         - ./data/conf/dovecot:/etc/dovecot
         - ./data/assets/ssl:/etc/ssl/mail/:ro
         - vmail-vol-1:/var/vmail
       volumes_from:
-        - sogo-mailcow
+        - sogo
       environment:
         - DBNAME=${DBNAME}
         - DBUSER=${DBUSER}
@@ -154,13 +139,11 @@ services:
       hostname: ${MAILCOW_HOSTNAME}
       networks:
         mailcow-network:
-          aliases:
-            - dovecot
 
-    postfix-mailcow:
+    postfix:
       image: andryyy/mailcow-dockerized:postfix
       depends_on:
-        - pdns-mailcow
+        - pdns
       volumes:
         - ./data/conf/postfix:/opt/postfix/conf
         - ./data/assets/ssl:/etc/ssl/mail/:ro
@@ -179,31 +162,27 @@ services:
       dns_search: mailcow-network
       networks:
         mailcow-network:
-          aliases:
-            - postfix
 
-    memcached-mailcow:
+    memcached:
       image: memcached
       depends_on:
-        - pdns-mailcow
+        - pdns
       restart: always
       dns:
         - 172.22.1.254
       dns_search: mailcow-network
       networks:
         mailcow-network:
-          aliases:
-            - memcached
 
-    nginx-mailcow:
+    nginx:
       depends_on:
-        - mysql-mailcow
-        - sogo-mailcow
-        - php-fpm-mailcow
-        - rspamd-mailcow
+        - mysql
+        - sogo
+        - phpfpm
+        - rspamd
       image: nginx:mainline
       volumes_from:
-        - sogo-mailcow
+        - sogo
       volumes:
         - ./data/web:/web:ro
         - ./data/conf/rspamd/dynmaps:/dynmaps:ro
@@ -217,8 +196,6 @@ services:
       restart: always
       networks:
         mailcow-network:
-          aliases:
-            - nginx
 
 networks:
   mailcow-network:

From c0b31ff2d4ef51a97e9c9d0c7d6419ad64a3064a Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Sun, 1 Jan 2017 21:23:35 +0100
Subject: [PATCH 03/14] Change ports in docker-compose file if needed

---
 generate_config.sh | 13 -------------
 1 file changed, 13 deletions(-)

diff --git a/generate_config.sh b/generate_config.sh
index cb1a516e..92deccb5 100755
--- a/generate_config.sh
+++ b/generate_config.sh
@@ -29,7 +29,6 @@ MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
 # ------------------------------
 DBNAME=mailcow
 DBUSER=mailcow
-
 # Please use long, random alphanumeric strings (A-Za-z0-9)
 DBPASS=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28)
 DBROOT=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28)
@@ -37,17 +36,5 @@ DBROOT=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28)
 # ------------------------------
 # Misc configuration
 # ------------------------------
-# You should leave that alone
-# Can also be 11.22.33.44:25 or 0.0.0.0:465 etc. for specific bindings
-SMTP_PORT=25
-SMTPS_PORT=465
-SUBMISSION_PORT=587
-IMAP_PORT=143
-IMAPS_PORT=993
-POP_PORT=110
-POPS_PORT=995
-SIEVE_PORT=4190
-
-# Your timezone
 TZ=${TZ}
 EOF

From b53df6e08851a580a6f94edd1653382d5f1c6c1b Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Sun, 1 Jan 2017 21:26:51 +0100
Subject: [PATCH 04/14] Change ports in docker-compose file if needed

---
 docker-compose.yml | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/docker-compose.yml b/docker-compose.yml
index 2c74fc5c..f54d9f4a 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -127,11 +127,11 @@ services:
         - DBUSER=${DBUSER}
         - DBPASS=${DBPASS}
       ports:
-        - "${IMAP_PORT}:143"
-        - "${IMAPS_PORT}:993"
-        - "${POP_PORT}:110"
-        - "${POPS_PORT}:995"
-        - "${SIEVE_PORT}:4190"
+        - "143:143"
+        - "993:993"
+        - "110:110"
+        - "995:995"
+        - "4190:4190"
       dns:
         - 172.22.1.254
       dns_search: mailcow-network
@@ -152,9 +152,9 @@ services:
         - DBUSER=${DBUSER}
         - DBPASS=${DBPASS}
       ports:
-        - "${SMTP_PORT}:25"
-        - "${SMTPS_PORT}:465"
-        - "${SUBMISSION_PORT}:587"
+        - "25:25"
+        - "465:465"
+        - "587:587"
       restart: always
       hostname: ${MAILCOW_HOSTNAME}
       dns: 

From 2c822accb8f5d602529979fb1f710b56144ab74b Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Tue, 3 Jan 2017 10:33:06 +0100
Subject: [PATCH 05/14] Do not change service names

---
 docker-compose.yml | 93 +++++++++++++++++++++++++++++-----------------
 generate_config.sh | 13 +++++++
 2 files changed, 71 insertions(+), 35 deletions(-)
 mode change 100755 => 100644 generate_config.sh

diff --git a/docker-compose.yml b/docker-compose.yml
index f54d9f4a..b91c5516 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,7 +1,7 @@
 version: '2'
 
 services:
-    pdns:
+    pdns-mailcow:
       image: andryyy/mailcow-dockerized:pdns
       volumes:
         - ./data/conf/pdns/:/etc/powerdns/
@@ -9,11 +9,13 @@ services:
       networks:
         mailcow-network:
           ipv4_address: 172.22.1.254
+          aliases:
+            - pdns
 
-    mysql:
+    mysql-mailcow:
       image: mariadb:10.1
       depends_on:
-        - pdns
+        - pdns-mailcow
       command: mysqld
       volumes:
         - mysql-vol-1:/var/lib/mysql/
@@ -29,11 +31,13 @@ services:
       restart: always
       networks:
         mailcow-network:
+          aliases:
+            - mysql
 
-    redis:
+    redis-mailcow:
       image: redis
       depends_on:
-        - pdns
+        - pdns-mailcow
       volumes:
         - redis-vol-1:/data/
       restart: always
@@ -42,11 +46,13 @@ services:
       dns_search: mailcow-network
       networks:
         mailcow-network:
+          aliases:
+            - redis
 
-    rspamd:
+    rspamd-mailcow:
       image: andryyy/mailcow-dockerized:rspamd
       depends_on:
-        - pdns
+        - pdns-mailcow
       volumes:
         - ./data/conf/rspamd/override.d/:/etc/rspamd/override.d:ro
         - ./data/conf/rspamd/local.d/:/etc/rspamd/local.d:ro
@@ -58,11 +64,13 @@ services:
       dns_search: mailcow-network
       networks:
         mailcow-network:
+          aliases:
+            - rspamd
 
-    phpfpm:
+    php-fpm-mailcow:
       image: andryyy/mailcow-dockerized:phpfpm
       depends_on:
-        - pdns
+        - pdns-mailcow
       volumes:
         - ./data/web:/web:ro
         - ./data/conf/rspamd/dynmaps:/dynmaps:ro
@@ -79,12 +87,14 @@ services:
       restart: always
       networks:
         mailcow-network:
+          aliases:
+            - phpfpm
 
-    sogo:
+    sogo-mailcow:
       image: andryyy/mailcow-dockerized:sogo
       depends_on:
-        - pdns
-        - mysql
+        - pdns-mailcow
+        - mysql-mailcow
       environment:
         - DBNAME=${DBNAME}
         - DBUSER=${DBUSER}
@@ -95,14 +105,17 @@ services:
       dns_search: mailcow-network
       volumes:
         - ./data/conf/sogo/:/etc/sogo/
+        - /usr/lib/GNUstep/SOGo/WebServerResources/
       restart: always
       networks:
         mailcow-network:
+          aliases:
+            - sogo
 
-    rmilter:
+    rmilter-mailcow:
       image: andryyy/mailcow-dockerized:rmilter
       depends_on:
-        - pdns
+        - pdns-mailcow
       volumes:
         - ./data/conf/rmilter/:/etc/rmilter.conf.d/:ro
       restart: always
@@ -111,27 +124,29 @@ services:
       dns_search: mailcow-network
       networks:
         mailcow-network:
+          aliases:
+            - rmilter
 
-    dovecot:
+    dovecot-mailcow:
       image: andryyy/mailcow-dockerized:dovecot
       depends_on:
-        - pdns
+        - pdns-mailcow
       volumes:
         - ./data/conf/dovecot:/etc/dovecot
         - ./data/assets/ssl:/etc/ssl/mail/:ro
         - vmail-vol-1:/var/vmail
       volumes_from:
-        - sogo
+        - sogo-mailcow
       environment:
         - DBNAME=${DBNAME}
         - DBUSER=${DBUSER}
         - DBPASS=${DBPASS}
       ports:
-        - "143:143"
-        - "993:993"
-        - "110:110"
-        - "995:995"
-        - "4190:4190"
+        - "${IMAP_PORT}:143"
+        - "${IMAPS_PORT}:993"
+        - "${POP_PORT}:110"
+        - "${POPS_PORT}:995"
+        - "${SIEVE_PORT}:4190"
       dns:
         - 172.22.1.254
       dns_search: mailcow-network
@@ -139,11 +154,13 @@ services:
       hostname: ${MAILCOW_HOSTNAME}
       networks:
         mailcow-network:
+          aliases:
+            - dovecot
 
-    postfix:
+    postfix-mailcow:
       image: andryyy/mailcow-dockerized:postfix
       depends_on:
-        - pdns
+        - pdns-mailcow
       volumes:
         - ./data/conf/postfix:/opt/postfix/conf
         - ./data/assets/ssl:/etc/ssl/mail/:ro
@@ -152,9 +169,9 @@ services:
         - DBUSER=${DBUSER}
         - DBPASS=${DBPASS}
       ports:
-        - "25:25"
-        - "465:465"
-        - "587:587"
+        - "${SMTP_PORT}:25"
+        - "${SMTPS_PORT}:465"
+        - "${SUBMISSION_PORT}:587"
       restart: always
       hostname: ${MAILCOW_HOSTNAME}
       dns: 
@@ -162,27 +179,31 @@ services:
       dns_search: mailcow-network
       networks:
         mailcow-network:
+          aliases:
+            - postfix
 
-    memcached:
+    memcached-mailcow:
       image: memcached
       depends_on:
-        - pdns
+        - pdns-mailcow
       restart: always
       dns:
         - 172.22.1.254
       dns_search: mailcow-network
       networks:
         mailcow-network:
+          aliases:
+            - memcached
 
-    nginx:
+    nginx-mailcow:
       depends_on:
-        - mysql
-        - sogo
-        - phpfpm
-        - rspamd
+        - mysql-mailcow
+        - sogo-mailcow
+        - php-fpm-mailcow
+        - rspamd-mailcow
       image: nginx:mainline
       volumes_from:
-        - sogo
+        - sogo-mailcow
       volumes:
         - ./data/web:/web:ro
         - ./data/conf/rspamd/dynmaps:/dynmaps:ro
@@ -196,6 +217,8 @@ services:
       restart: always
       networks:
         mailcow-network:
+          aliases:
+            - nginx
 
 networks:
   mailcow-network:
diff --git a/generate_config.sh b/generate_config.sh
old mode 100755
new mode 100644
index 92deccb5..cb1a516e
--- a/generate_config.sh
+++ b/generate_config.sh
@@ -29,6 +29,7 @@ MAILCOW_HOSTNAME=${MAILCOW_HOSTNAME}
 # ------------------------------
 DBNAME=mailcow
 DBUSER=mailcow
+
 # Please use long, random alphanumeric strings (A-Za-z0-9)
 DBPASS=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28)
 DBROOT=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28)
@@ -36,5 +37,17 @@ DBROOT=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28)
 # ------------------------------
 # Misc configuration
 # ------------------------------
+# You should leave that alone
+# Can also be 11.22.33.44:25 or 0.0.0.0:465 etc. for specific bindings
+SMTP_PORT=25
+SMTPS_PORT=465
+SUBMISSION_PORT=587
+IMAP_PORT=143
+IMAPS_PORT=993
+POP_PORT=110
+POPS_PORT=995
+SIEVE_PORT=4190
+
+# Your timezone
 TZ=${TZ}
 EOF

From 850398093097c6a94d8ed0e86e557fb4e7bf0a69 Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Tue, 3 Jan 2017 10:35:41 +0100
Subject: [PATCH 06/14] Revert vol change

---
 data/Dockerfiles/sogo/Dockerfile | 2 --
 1 file changed, 2 deletions(-)

diff --git a/data/Dockerfiles/sogo/Dockerfile b/data/Dockerfiles/sogo/Dockerfile
index 932dc751..2d043fdd 100644
--- a/data/Dockerfiles/sogo/Dockerfile
+++ b/data/Dockerfiles/sogo/Dockerfile
@@ -38,8 +38,6 @@ COPY supervisord.conf /etc/supervisor/supervisord.conf
 EXPOSE 20000
 EXPOSE 9191
 
-VOLUME /usr/lib/GNUstep/SOGo/WebServerResources/
-
 CMD exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
 
 RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

From 2aace3d5cc2a15380c9d182e76fb2195963c9087 Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Tue, 3 Jan 2017 10:36:12 +0100
Subject: [PATCH 07/14] Fix permission

---
 generate_config.sh | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 mode change 100644 => 100755 generate_config.sh

diff --git a/generate_config.sh b/generate_config.sh
old mode 100644
new mode 100755

From 8e07d29f0a43e3c44b7341aa4906f9dd81350c4c Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Tue, 3 Jan 2017 10:39:32 +0100
Subject: [PATCH 08/14] Some slight changes in permission checks for future
 updates

---
 data/web/inc/functions.inc.php | 35 +++++++++++++++++++++++++++++++---
 1 file changed, 32 insertions(+), 3 deletions(-)

diff --git a/data/web/inc/functions.inc.php b/data/web/inc/functions.inc.php
index ce1b374e..cfa3fdb4 100644
--- a/data/web/inc/functions.inc.php
+++ b/data/web/inc/functions.inc.php
@@ -8,11 +8,12 @@ function hasDomainAccess($username, $role, $domain) {
 	if (!filter_var($username, FILTER_VALIDATE_EMAIL) && !ctype_alnum(str_replace(array('_', '.', '-'), '', $username))) {
 		return false;
 	}
-
 	if (!is_valid_domain_name($domain)) {
 		return false;
 	}
-
+	if ($role != 'admin' && $role != 'domainadmin' && $role != 'user') {
+		return false;
+	}
 	try {
 		$stmt = $pdo->prepare("SELECT `domain` FROM `domain_admins`
 			WHERE (
@@ -2192,6 +2193,9 @@ function delete_domain_admin($postarray) {
 function get_spam_score($username) {
 	global $pdo;
 	$default = "5, 15";
+	if ($_SESSION['mailcow_cc_role'] != "user") {
+		return false;
+	}
 	if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {
 		return $default;
 	}
@@ -2235,6 +2239,13 @@ function get_spam_score($username) {
 function set_spam_score($postarray) {
 	global $lang;
 	global $pdo;
+	if ($_SESSION['mailcow_cc_role'] != "user") {
+		$_SESSION['return'] = array(
+			'type' => 'danger',
+			'msg' => sprintf($lang['danger']['access_denied'])
+		);
+		return false;
+	}
 	$username		= $_SESSION['mailcow_cc_username'];
 	$lowspamlevel	= explode(',', $postarray['score'])[0];
 	$highspamlevel	= explode(',', $postarray['score'])[1];
@@ -2288,7 +2299,15 @@ function set_spam_score($postarray) {
 function set_policy_list($postarray) {
 	global $lang;
 	global $pdo;
-
+	if ($_SESSION['mailcow_cc_role'] != "admin" &&
+		$_SESSION['mailcow_cc_role'] != "domainadmin" &&
+		$_SESSION['mailcow_cc_role'] != "user") {
+		$_SESSION['return'] = array(
+			'type' => 'danger',
+			'msg' => sprintf($lang['danger']['access_denied'])
+		);
+		return false;
+	}
 	(isset($postarray['domain'])) ? $object = $postarray['domain'] : $object = $_SESSION['mailcow_cc_username'];
 	($postarray['object_list'] == "bl") ? $object_list = "blacklist_from" : $object_list = "whitelist_from";
 	$object_from = preg_replace('/\.+/', '.', rtrim(preg_replace("/\.\*/", "*", trim(strtolower($postarray['object_from']))), '.'));
@@ -2389,6 +2408,13 @@ function set_policy_list($postarray) {
 function set_tls_policy($postarray) {
 	global $lang;
 	global $pdo;
+	if ($_SESSION['mailcow_cc_role'] != "user") {
+		$_SESSION['return'] = array(
+			'type' => 'danger',
+			'msg' => sprintf($lang['danger']['access_denied'])
+		);
+		return false;
+	}
 	isset($postarray['tls_in']) ? $tls_in = '1' : $tls_in = '0';
 	isset($postarray['tls_out']) ? $tls_out = '1' : $tls_out = '0';
 	$username = $_SESSION['mailcow_cc_username'];
@@ -2422,6 +2448,9 @@ function set_tls_policy($postarray) {
 function get_tls_policy($username) {
 	global $lang;
 	global $pdo;
+	if ($_SESSION['mailcow_cc_role'] != "user") {
+		return false;
+	}
 	if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {
 		$_SESSION['return'] = array(
 			'type' => 'danger',

From 887f7db7a8f059924a2d0c6769773e1516ae1e40 Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Tue, 3 Jan 2017 11:46:11 +0100
Subject: [PATCH 09/14] Add language strings

---
 data/web/inc/footer.inc.php | 6 +++---
 data/web/inc/header.inc.php | 2 +-
 data/web/lang/lang.de.php   | 5 ++++-
 data/web/lang/lang.en.php   | 6 ++++--
 4 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/data/web/inc/footer.inc.php b/data/web/inc/footer.inc.php
index 052f03b2..b2976bec 100644
--- a/data/web/inc/footer.inc.php
+++ b/data/web/inc/footer.inc.php
@@ -6,12 +6,12 @@ if ($_SESSION['mailcow_cc_role'] == "admin"):
 		<div class="modal-content">
 		<div class="modal-header">
 			<button type="button" class="close" data-dismiss="modal">&times;</button>
-			<h4 class="modal-title">Restart SOGo</h4>
+			<h4 class="modal-title"><?=$lang['footer']['restart_sogo'];?></h4>
 		</div>
 		<div class="modal-body">
-			<p>Some tasks, e.g. adding a domain, require you to restart SOGo to catch changes made in the mailcow UI.</p>
+			<p><?=$lang['footer']['restart_sogo_info'];?></p>
 			<hr />
-			<button class="btn btn-md btn-primary" id="triggerRestartSogo">Restart SOGo</button>
+			<button class="btn btn-md btn-primary" id="triggerRestartSogo"><?=$lang['footer']['restart_now'];?></button>
 			<br /><br />
 			<div id="statusTriggerRestartSogo"></div>
 		</div>
diff --git a/data/web/inc/header.inc.php b/data/web/inc/header.inc.php
index 2059f0e6..d72ec73f 100644
--- a/data/web/inc/header.inc.php
+++ b/data/web/inc/header.inc.php
@@ -226,7 +226,7 @@ endif;
 				<?php
 				if ($_SESSION['mailcow_cc_role'] == "admin"):
 				?>
-				<li><a href data-toggle="modal" data-target="#RestartSOGo"><span style="font-size:12px" class="glyphicon glyphicon-refresh" aria-hidden="true"></span> Restart SOGo</a></li>
+				<li><a href data-toggle="modal" data-target="#RestartSOGo"><span style="font-size:12px" class="glyphicon glyphicon-refresh" aria-hidden="true"></span> <?=$lang['header']['restart_sogo'];?></a></li>
 				<?php
 				endif;
 				?>
diff --git a/data/web/lang/lang.de.php b/data/web/lang/lang.de.php
index dc96774e..358f87e1 100644
--- a/data/web/lang/lang.de.php
+++ b/data/web/lang/lang.de.php
@@ -5,7 +5,10 @@
 //
 */
 $lang['footer']['loading'] = 'Einen Moment bitte...';
-$lang['getmail']['no_status'] = 'Keinen letzten Vorgang festgestellt.';
+$lang['header']['restart_sogo'] = 'SOGo neustarten';
+$lang['footer']['restart_sogo'] = 'SOGo neustarten';
+$lang['footer']['restart_now'] = 'Restart now';
+$lang['footer']['restart_sogo_info'] = 'Einige Änderungen an Domains benötigen einen Neustart SOGos. Hier können Sie SOGo neustarten.<br /><br /><b>Wichtig:</b> Ein korrekter Neustart SOGos kann eine Weile in Anspruch nehmen, bitte warten Sie, bis der Prozess vollständig beendet wurde.';
 $lang['dkim']['confirm'] = 'Sind Sie sicher?';
 $lang['danger']['dkim_not_found'] = 'DKIM-Record nicht gefunden';
 $lang['danger']['dkim_remove_failed'] = 'Kann DKIM-Record nicht entfernen';
diff --git a/data/web/lang/lang.en.php b/data/web/lang/lang.en.php
index 4f227ede..90b8a6c2 100644
--- a/data/web/lang/lang.en.php
+++ b/data/web/lang/lang.en.php
@@ -5,8 +5,10 @@
 //
 */
 $lang['footer']['loading'] = "Please wait...";
-$lang['getmail']['no_status'] = "No previous status found.";
-$lang['dkim']['confirm'] = "Are you sure?";
+$lang['header']['restart_sogo'] = 'Restart SOGo';
+$lang['footer']['restart_sogo'] = 'Restart SOGo';
+$lang['footer']['restart_now'] = 'Jetzt neustarten';
+$lang['footer']['restart_sogo_info'] = 'Some tasks, e.g. adding a domain, require you to restart SOGo to catch changes made in the mailcow UI.<br /><br /><b>Important:</b> A graceful restart may take a while to finish, please wait for it to finish.';$lang['dkim']['confirm'] = "Are you sure?";
 $lang['danger']['dkim_not_found'] = "DKIM record not found";
 $lang['danger']['dkim_remove_failed'] = "Cannot remove selected DKIM record";
 $lang['danger']['dkim_add_failed'] = "Cannot add given DKIM record";

From ebfc45df9ff7954f58657e6542bf89be6aa156d9 Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Tue, 3 Jan 2017 11:47:09 +0100
Subject: [PATCH 10/14] Set huge timeout in PHP for SOGo childs to stop

---
 data/conf/nginx/site.conf | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/data/conf/nginx/site.conf b/data/conf/nginx/site.conf
index 43570d0c..ffc3f607 100644
--- a/data/conf/nginx/site.conf
+++ b/data/conf/nginx/site.conf
@@ -27,6 +27,10 @@ server {
     include fastcgi_params;
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
     fastcgi_param PATH_INFO $fastcgi_path_info;
+    fastcgi_param PHP_VALUE "max_execution_time = 1200
+                             max_input_time = 1200
+                             memory_limit = 64M";
+    fastcgi_read_timeout 1200;
   }
 
   rewrite ^(/save.+)$ /rspamd$1 last;

From caa6890cae014f7e13c9f317a7efb392360bed08 Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Tue, 3 Jan 2017 11:50:08 +0100
Subject: [PATCH 11/14] Add lang strings

---
 data/web/lang/lang.de.php | 2 +-
 data/web/lang/lang.en.php | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/data/web/lang/lang.de.php b/data/web/lang/lang.de.php
index 358f87e1..09b79c9b 100644
--- a/data/web/lang/lang.de.php
+++ b/data/web/lang/lang.de.php
@@ -7,7 +7,7 @@
 $lang['footer']['loading'] = 'Einen Moment bitte...';
 $lang['header']['restart_sogo'] = 'SOGo neustarten';
 $lang['footer']['restart_sogo'] = 'SOGo neustarten';
-$lang['footer']['restart_now'] = 'Restart now';
+$lang['footer']['restart_now'] = 'Jetzt neustarten';
 $lang['footer']['restart_sogo_info'] = 'Einige Änderungen an Domains benötigen einen Neustart SOGos. Hier können Sie SOGo neustarten.<br /><br /><b>Wichtig:</b> Ein korrekter Neustart SOGos kann eine Weile in Anspruch nehmen, bitte warten Sie, bis der Prozess vollständig beendet wurde.';
 $lang['dkim']['confirm'] = 'Sind Sie sicher?';
 $lang['danger']['dkim_not_found'] = 'DKIM-Record nicht gefunden';
diff --git a/data/web/lang/lang.en.php b/data/web/lang/lang.en.php
index 90b8a6c2..0a603393 100644
--- a/data/web/lang/lang.en.php
+++ b/data/web/lang/lang.en.php
@@ -7,7 +7,7 @@
 $lang['footer']['loading'] = "Please wait...";
 $lang['header']['restart_sogo'] = 'Restart SOGo';
 $lang['footer']['restart_sogo'] = 'Restart SOGo';
-$lang['footer']['restart_now'] = 'Jetzt neustarten';
+$lang['footer']['restart_now'] = 'Restart now';
 $lang['footer']['restart_sogo_info'] = 'Some tasks, e.g. adding a domain, require you to restart SOGo to catch changes made in the mailcow UI.<br /><br /><b>Important:</b> A graceful restart may take a while to finish, please wait for it to finish.';$lang['dkim']['confirm'] = "Are you sure?";
 $lang['danger']['dkim_not_found'] = "DKIM record not found";
 $lang['danger']['dkim_remove_failed'] = "Cannot remove selected DKIM record";

From 7384f83932e763571aa08d76a6dcd9b1b20f8694 Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Thu, 5 Jan 2017 20:33:37 +0100
Subject: [PATCH 12/14] Add rspamd volume

---
 docker-compose.yml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/docker-compose.yml b/docker-compose.yml
index b91c5516..3888762c 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -58,6 +58,7 @@ services:
         - ./data/conf/rspamd/local.d/:/etc/rspamd/local.d:ro
         - ./data/conf/rspamd/lua/:/etc/rspamd/lua/:ro
         - dkim-vol-1:/data/dkim
+        - rspamd-vol-1:/var/lib/rspamd
       restart: always
       dns: 
         - 172.22.1.254
@@ -234,3 +235,4 @@ volumes:
   mysql-vol-1:
   dkim-vol-1:
   redis-vol-1:
+  rspamd-vol-1:

From 75139e51cc0fc19de8ff17bcdc6227742479bed8 Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Thu, 5 Jan 2017 20:35:46 +0100
Subject: [PATCH 13/14] Use a single view for all domains - easier but will
 cause more load with large setups, use procs here instead

---
 data/Dockerfiles/sogo/reconf-domains.sh | 61 +++++++++++++------------
 1 file changed, 31 insertions(+), 30 deletions(-)

diff --git a/data/Dockerfiles/sogo/reconf-domains.sh b/data/Dockerfiles/sogo/reconf-domains.sh
index 78482859..8cc24052 100755
--- a/data/Dockerfiles/sogo/reconf-domains.sh
+++ b/data/Dockerfiles/sogo/reconf-domains.sh
@@ -1,17 +1,27 @@
 #!/bin/bash
 
-# Go in a 5 minute loop
-while true; do
+# Recreate view
 
-	# Wait for MySQL to warm-up
-	while ! mysqladmin ping --host mysql --silent; do
-		sleep 1
-	done
+mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "DROP VIEW IF EXISTS sogo_view"
 
-	mkdir -p /var/lib/sogo/GNUstep/Defaults/
+mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF
+CREATE VIEW sogo_view (c_uid, domain, c_name, c_password, c_cn, mail, aliases, ad_aliases, senderacl, home) AS
+SELECT mailbox.username, mailbox.domain, mailbox.username, mailbox.password, mailbox.name, mailbox.username, IFNULL(ga.aliases, ''), IFNULL(gda.ad_alias, ''), IFNULL(gs.send_as, ''), CONCAT('/var/vmail/', maildir) FROM mailbox
+LEFT OUTER JOIN grouped_mail_aliases ga ON ga.username = mailbox.username
+LEFT OUTER JOIN grouped_sender_acl gs ON gs.username = mailbox.username
+LEFT OUTER JOIN grouped_domain_alias_address gda ON gda.username = mailbox.username
+WHERE mailbox.active = '1';
+EOF
 
-	# Generate plist header with timezone data
-	cat <<EOF > /var/lib/sogo/GNUstep/Defaults/sogod.plist
+# Wait for MySQL to warm-up
+while ! mysqladmin ping --host mysql --silent; do
+	sleep 1
+done
+
+mkdir -p /var/lib/sogo/GNUstep/Defaults/
+
+# Generate plist header with timezone data
+cat <<EOF > /var/lib/sogo/GNUstep/Defaults/sogod.plist
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//GNUstep//DTD plist 0.9//EN" "http://www.gnustep.org/plist-0_9.xml">
 <plist version="0.9">
@@ -22,6 +32,8 @@ while true; do
     <string>mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_cache_folder</string>
     <key>OCSEMailAlarmsFolderURL</key>
     <string>mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_alarms_folder</string>
+    <key>DomainFieldName</key>
+    <string>domain</string>
     <key>OCSFolderInfoURL</key>
     <string>mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_folder_info</string>
     <key>OCSSessionsFolderURL</key>
@@ -36,14 +48,14 @@ while true; do
     <dict>
 EOF
 
-	# Generate multi-domain setup
-	while read line
+# Generate multi-domain setup
+while read line
 	do
 	DOMAIN_SANE=$(echo ${line} | tr '-' 'b' | tr '.' 'p' | tr -cd '[[:alnum:]]')
 	echo "        <key>${line}</key>
         <dict>
             <key>SOGoMailDomain</key>
-            <string>$(echo ${line} | tr '-' 'b' | tr '.' 'p')</string>
+            <string>${DOMAIN_SANE}</string>
             <key>SOGoUserSources</key>
             <array>
                 <dict>
@@ -72,30 +84,19 @@ EOF
                     <key>userPasswordAlgorithm</key>
                     <string>ssha256</string>
                     <key>viewURL</key>
-                    <string>mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_view_${DOMAIN_SANE}</string>
+                    <string>mysql://${DBUSER}:${DBPASS}@mysql:3306/${DBNAME}/sogo_view</string>
                 </dict>
             </array>
         </dict>" >> /var/lib/sogo/GNUstep/Defaults/sogod.plist
-	mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "DROP VIEW IF EXISTS sogo_view_${DOMAIN_SANE}"
-	mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF
-CREATE VIEW sogo_view_${DOMAIN_SANE} (c_uid, c_name, c_password, c_cn, mail, aliases, ad_aliases, senderacl, home) AS
-SELECT mailbox.username, mailbox.username, mailbox.password, mailbox.name, mailbox.username, IFNULL(ga.aliases, ''), IFNULL(gda.ad_alias, ''), IFNULL(gs.send_as, ''), CONCAT('/var/vmail/', maildir) FROM mailbox
-LEFT OUTER JOIN grouped_mail_aliases ga ON ga.username = mailbox.username
-LEFT OUTER JOIN grouped_sender_acl gs ON gs.username = mailbox.username
-LEFT OUTER JOIN grouped_domain_alias_address gda ON gda.username = mailbox.username
-WHERE mailbox.active = '1' AND domain = '${line}';
-EOF
 done < <(mysql --host mysql -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT domain FROM domain;" -B -N)
 
-	# Generate footer
-	echo '    </dict>
+# Generate footer
+echo '    </dict>
 </dict>
 </plist>' >> /var/lib/sogo/GNUstep/Defaults/sogod.plist
 
-	# Fix permissions
-	chown sogo:sogo -R /var/lib/sogo/
-	chmod 600 /var/lib/sogo/GNUstep/Defaults/sogod.plist
+# Fix permissions
+chown sogo:sogo -R /var/lib/sogo/
+chmod 600 /var/lib/sogo/GNUstep/Defaults/sogod.plist
 
-	sleep 300
-
-done
+sleep infinite

From 77c81f95daa777be211ab469afc75bd52cd1bcae Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Thu, 5 Jan 2017 21:12:59 +0100
Subject: [PATCH 14/14] Move line

---
 data/web/lang/lang.en.php | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/data/web/lang/lang.en.php b/data/web/lang/lang.en.php
index 0a603393..ce9906d5 100644
--- a/data/web/lang/lang.en.php
+++ b/data/web/lang/lang.en.php
@@ -8,7 +8,8 @@ $lang['footer']['loading'] = "Please wait...";
 $lang['header']['restart_sogo'] = 'Restart SOGo';
 $lang['footer']['restart_sogo'] = 'Restart SOGo';
 $lang['footer']['restart_now'] = 'Restart now';
-$lang['footer']['restart_sogo_info'] = 'Some tasks, e.g. adding a domain, require you to restart SOGo to catch changes made in the mailcow UI.<br /><br /><b>Important:</b> A graceful restart may take a while to finish, please wait for it to finish.';$lang['dkim']['confirm'] = "Are you sure?";
+$lang['footer']['restart_sogo_info'] = 'Some tasks, e.g. adding a domain, require you to restart SOGo to catch changes made in the mailcow UI.<br /><br /><b>Important:</b> A graceful restart may take a while to complete, please wait for it to finish.';
+$lang['dkim']['confirm'] = "Are you sure?";
 $lang['danger']['dkim_not_found'] = "DKIM record not found";
 $lang['danger']['dkim_remove_failed'] = "Cannot remove selected DKIM record";
 $lang['danger']['dkim_add_failed'] = "Cannot add given DKIM record";