From d3922572892bf857027bbd41b22daa6f8d164fc5 Mon Sep 17 00:00:00 2001
From: andryyy <andre.peters@debinux.de>
Date: Mon, 27 Apr 2020 17:27:47 +0200
Subject: [PATCH] [Web] Some changes [SOGo] Allow to not spawn SOGo but an
 idling shell [Rspamd] Remove X-CSA-Complaints from bulk headers...

---
 data/Dockerfiles/sogo/bootstrap-sogo.sh |  6 +++
 data/Dockerfiles/watchdog/watchdog.sh   |  2 +
 data/conf/rspamd/custom/bulk_header.map |  1 -
 data/conf/rspamd/local.d/multimap.conf  |  8 +++
 data/web/autodiscover.php               | 10 ++++
 data/web/edit.php                       | 12 +++++
 data/web/inc/header.inc.php             |  2 +-
 data/web/inc/vars.inc.php               |  1 +
 data/web/index.php                      | 65 ++++++++++++-------------
 data/web/lang/lang.ca.json              |  2 +
 data/web/lang/lang.cs.json              |  2 +
 data/web/lang/lang.de.json              |  2 +
 data/web/lang/lang.en.json              |  2 +
 data/web/lang/lang.es.json              |  2 +
 data/web/lang/lang.fi.json              |  2 +
 data/web/lang/lang.fr.json              |  2 +
 data/web/lang/lang.it.json              |  2 +
 data/web/lang/lang.lv.json              |  2 +
 data/web/lang/lang.nl.json              |  2 +
 data/web/lang/lang.pl.json              |  2 +
 data/web/lang/lang.pt.json              |  2 +
 data/web/lang/lang.ru.json              |  2 +
 data/web/lang/lang.sk.json              |  2 +
 data/web/lang/lang.sv.json              |  2 +
 data/web/mailbox.php                    |  9 +++-
 data/web/modals/mailbox.php             | 30 ++++++++++++
 docker-compose.yml                      |  9 ++--
 generate_config.sh                      |  4 ++
 update.sh                               |  1 +
 29 files changed, 151 insertions(+), 39 deletions(-)

diff --git a/data/Dockerfiles/sogo/bootstrap-sogo.sh b/data/Dockerfiles/sogo/bootstrap-sogo.sh
index 443b836e..612a4e00 100755
--- a/data/Dockerfiles/sogo/bootstrap-sogo.sh
+++ b/data/Dockerfiles/sogo/bootstrap-sogo.sh
@@ -258,4 +258,10 @@ else
   rm /etc/cron.d/sogo
 fi
 
+if [[ "${SKIP_SOGO}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
+  echo "SKIP_SOGO=y, skipping SOGo..."
+  sleep 365d
+  exit 0
+fi
+
 exec gosu sogo /usr/sbin/sogod
diff --git a/data/Dockerfiles/watchdog/watchdog.sh b/data/Dockerfiles/watchdog/watchdog.sh
index 7cf7530b..17acf56f 100755
--- a/data/Dockerfiles/watchdog/watchdog.sh
+++ b/data/Dockerfiles/watchdog/watchdog.sh
@@ -770,6 +770,7 @@ PID=$!
 echo "Spawned phpfpm_checks with PID ${PID}"
 BACKGROUND_TASKS+=(${PID})
 
+if [[ "${SKIP_SOGO}" =~ ^([nN][oO]|[nN])+$ ]]; then
 (
 while true; do
   if ! sogo_checks; then
@@ -781,6 +782,7 @@ done
 PID=$!
 echo "Spawned sogo_checks with PID ${PID}"
 BACKGROUND_TASKS+=(${PID})
+fi
 
 if [ ${CHECK_UNBOUND} -eq 1 ]; then
 (
diff --git a/data/conf/rspamd/custom/bulk_header.map b/data/conf/rspamd/custom/bulk_header.map
index bebdba3d..ed1997c2 100644
--- a/data/conf/rspamd/custom/bulk_header.map
+++ b/data/conf/rspamd/custom/bulk_header.map
@@ -1,4 +1,3 @@
-/X-CSA-Complaints: .*/i
 /X-EMV-Platform; .*/i
 /.*nur-1-click*/i
 /.*episerver.*/i
diff --git a/data/conf/rspamd/local.d/multimap.conf b/data/conf/rspamd/local.d/multimap.conf
index a7df7304..25551422 100644
--- a/data/conf/rspamd/local.d/multimap.conf
+++ b/data/conf/rspamd/local.d/multimap.conf
@@ -96,6 +96,7 @@ SIEVE_HOST {
   type = "ip";
   map = "$LOCAL_CONFDIR/custom/dovecot_trusted.map";
   symbols_set = ["SIEVE_HOST"];
+  score = -15;
 }
 
 RSPAMD_HOST {
@@ -150,3 +151,10 @@ BAD_LANG {
   regexp = true;
   score = 5.0;
 }
+
+BAZAR_ABUSE_CH {
+  type = "selector";
+  selector = "attachments(hex,sha256)";
+  map = "https://bazaar.abuse.ch/export/txt/md5/recent/";
+  score = 10.0;
+}
diff --git a/data/web/autodiscover.php b/data/web/autodiscover.php
index 3f258e86..c18edbfc 100644
--- a/data/web/autodiscover.php
+++ b/data/web/autodiscover.php
@@ -37,6 +37,10 @@ if (strpos($data, 'autodiscover/outlook/responseschema') !== false) {
   }
 }
 
+if (getenv('SKIP_SOGO') == "y") {
+  $autodiscover_config['autodiscoverType'] = 'imap';
+}
+
 //$dsn = $database_type . ":host=" . $database_host . ";dbname=" . $database_name;
 $dsn = $database_type . ":unix_socket=" . $database_sock . ";dbname=" . $database_name;
 $opt = [
@@ -176,6 +180,9 @@ if ($login_role === "user") {
         <UsePOPAuth>on</UsePOPAuth>
         <SMTPLast>off</SMTPLast>
       </Protocol>
+    <?php
+    if (getenv('SKIP_SOGO') != "y") {
+    ?>
       <Protocol>
         <Type>CalDAV</Type>
         <Server>https://<?=$autodiscover_config['caldav']['server'];?><?php if ($autodiscover_config['caldav']['port'] != 443) echo ':'.$autodiscover_config['caldav']['port']; ?>/SOGo/dav/<?=$email;?>/</Server>
@@ -188,6 +195,9 @@ if ($login_role === "user") {
         <DomainRequired>off</DomainRequired>
         <LoginName><?=$email;?></LoginName>
       </Protocol>
+    <?php
+    }
+    ?>
     </Account>
   </Response>
 <?php
diff --git a/data/web/edit.php b/data/web/edit.php
index 2fc6bfe0..4d880629 100644
--- a/data/web/edit.php
+++ b/data/web/edit.php
@@ -48,11 +48,17 @@ if (isset($_SESSION['mailcow_cc_role'])) {
                 <div class="checkbox">
                   <label><input class="goto_checkbox" type="checkbox" value="1" name="goto_ham" <?= ($result['goto'] == "ham@localhost") ? "checked" : null; ?>> <?=$lang['add']['goto_ham'];?></label>
                 </div>
+                <?php
+                if (getenv('SKIP_SOGO') != "y") {
+                ?>
                 <hr>
                 <div class="checkbox">
                   <label><input type="checkbox" value="1" name="sogo_visible" <?php if (isset($result['sogo_visible_int']) && $result['sogo_visible_int']=="1") { echo "checked"; }; ?>> <?=$lang['edit']['sogo_visible'];?></label>
                 </div>
                 <p class="help-block"><?=$lang['edit']['sogo_visible_info'];?></p>
+                <?php
+                }
+                ?>
               </div>
             </div>
             <hr>
@@ -719,6 +725,9 @@ if (isset($_SESSION['mailcow_cc_role'])) {
               </div>
             </div>
           </div>
+          <?php
+          if (getenv('SKIP_SOGO') != "y") {
+          ?>
           <div data-acl="<?=$_SESSION['acl']['sogo_access'];?>" class="form-group">
             <div class="col-sm-offset-2 col-sm-10">
               <div class="checkbox">
@@ -727,6 +736,9 @@ if (isset($_SESSION['mailcow_cc_role'])) {
               </div>
             </div>
           </div>
+          <?php
+          }
+          ?>
           <div class="form-group">
             <div class="col-sm-offset-2 col-sm-10">
               <button class="btn btn-success" data-action="edit_selected" data-id="editmailbox" data-item="<?=htmlspecialchars($result['username']);?>" data-api-url='edit/mailbox' data-api-attr='{}' href="#"><?=$lang['edit']['save'];?></button>
diff --git a/data/web/inc/header.inc.php b/data/web/inc/header.inc.php
index 4f58833b..429745c2 100644
--- a/data/web/inc/header.inc.php
+++ b/data/web/inc/header.inc.php
@@ -108,7 +108,7 @@
           <li<?= (preg_match("/quarantine/i", $_SERVER['REQUEST_URI'])) ? ' class="active"' : ''; ?>><a href="/quarantine"><span class="glyphicon glyphicon-briefcase"></span> <?= $lang['header']['quarantine']; ?></a></li>
           <?php
           }
-          if ($_SESSION['mailcow_cc_role'] == 'admin') {
+          if ($_SESSION['mailcow_cc_role'] == 'admin' && getenv('SKIP_SOGO') != "y") {
           ?>
           <li><a href data-toggle="modal" data-container="sogo-mailcow" data-target="#RestartContainer"><span class="glyphicon glyphicon-refresh"></span> <?= $lang['header']['restart_sogo']; ?></a></li>
           <?php
diff --git a/data/web/inc/vars.inc.php b/data/web/inc/vars.inc.php
index c7e2174f..b45c340a 100644
--- a/data/web/inc/vars.inc.php
+++ b/data/web/inc/vars.inc.php
@@ -34,6 +34,7 @@ if ($https_port === FALSE) {
 $autodiscover_config = array(
   // General autodiscover service type: "activesync" or "imap"
   // emClient uses autodiscover, but does not support ActiveSync. mailcow excludes emClient from ActiveSync.
+  // With SOGo disabled, the type will always fallback to imap. CalDAV and CardDAV will be excluded, too.
   'autodiscoverType' => 'activesync',
   // If autodiscoverType => activesync, also use ActiveSync (EAS) for Outlook desktop clients (>= Outlook 2013 on Windows)
   // Outlook for Mac does not support ActiveSync
diff --git a/data/web/index.php b/data/web/index.php
index 83482c63..f0f622ed 100644
--- a/data/web/index.php
+++ b/data/web/index.php
@@ -34,11 +34,11 @@ $_SESSION['index_query_string'] = $_SERVER['QUERY_STRING'];
           <div class="text-center mailcow-logo"><img src="<?=($main_logo = customize('get', 'main_logo')) ? $main_logo : '/img/cow_mailcow.svg';?>" alt="mailcow"></div>
           <legend><?= isset($_SESSION['oauth2_request']) ? $lang['oauth2']['authorize_app'] : $UI_TEXTS['main_name'];?></legend>
             <?php
-            if (strpos($_SESSION['index_query_string'], 'mobileconfig') !== false):
+            if (strpos($_SESSION['index_query_string'], 'mobileconfig') !== false) {
             ?>
             <div class="alert alert-info"><?= $lang['login']['mobileconfig_info']; ?></div>
             <?php
-            endif;
+            }
             ?>
             <form method="post" autofill="off">
             <div class="form-group">
@@ -57,55 +57,54 @@ $_SESSION['index_query_string'] = $_SERVER['QUERY_STRING'];
             </div>
             <div class="form-group">
               <button type="submit" class="btn btn-success" value="Login"><?= $lang['login']['login']; ?></button>
-              <?php if(!isset($_SESSION['oauth2_request'])): ?>
+              <?php if(!isset($_SESSION['oauth2_request'])) { ?>
               <div class="btn-group pull-right">
                 <button type="button" <?=(isset($_SESSION['mailcow_locale']) && count($AVAILABLE_LANGUAGES) === 1) ? 'disabled="true"' : '' ?> class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                   <span class="lang-sm lang-lbl" lang="<?= $_SESSION['mailcow_locale']; ?>"></span> <span class="caret"></span>
                 </button>
                 <ul class="dropdown-menu">
                   <?php
-                  foreach ($AVAILABLE_LANGUAGES as $language):
+                  foreach ($AVAILABLE_LANGUAGES as $language) {
                   ?>
                   <li<?= ($_SESSION['mailcow_locale'] == $language) ? ' class="active"' : ''; ?>><a href="?<?= http_build_query(array_merge($_GET, array('lang' => $language))) ?>"><span class="lang-xs lang-lbl-full" lang="<?= $language; ?>"></span></a></li>
-                  <?php
-                  endforeach;
-                  ?>
+                  <?php } ?>
                 </ul>
               </div>
-              <?php endif ?>
+              <?php } ?>
             </div>
             </form>
             <?php
-            if (isset($_SESSION['ldelay']) && $_SESSION['ldelay'] != '0'):
+            if (isset($_SESSION['ldelay']) && $_SESSION['ldelay'] != '0') {
             ?>
             <p><div class="alert alert-info"><?= sprintf($lang['login']['delayed'], $_SESSION['ldelay']); ?></b></div></p>
+            <?php } ?>
+          <?php if(!isset($_SESSION['oauth2_request'])) { ?>
+            <legend><span class="glyphicon glyphicon-link" aria-hidden="true"></span> <?=$UI_TEXTS['apps_name'];?></legend>
             <?php
-            endif;
-            ?>
-          <?php if(!isset($_SESSION['oauth2_request'])): ?>
-          <legend><span class="glyphicon glyphicon-link" aria-hidden="true"></span> <?=$UI_TEXTS['apps_name'];?></legend>
-          <?php
-          foreach ($MAILCOW_APPS as $app):
-          ?>
-            <a href="<?= htmlspecialchars($app['link']); ?>" role="button" style="margin-bottom:3pt" title="<?= htmlspecialchars($app['description']); ?>" class="btn btn-primary"><?= htmlspecialchars($app['name']); ?></a>&nbsp;
-          <?php
-          endforeach;
-          $app_links = customize('get', 'app_links');
-          if (!empty($app_links)) {
-            foreach ($app_links as $row) {
-              foreach ($row as $key => $val):
-            ?>
-              <a href="<?= htmlspecialchars($val); ?>" role="button" style="margin-bottom:3pt" class="btn btn-primary"><?= htmlspecialchars($key); ?></a>&nbsp;
-            <?php 
-              endforeach;
+            if (!empty($MAILCOW_APPS)) {
+              foreach ($MAILCOW_APPS as $app) {
+                if (getenv('SKIP_SOGO') == "y" && preg_match('/^\/SOGo/i', $app['link'])) { continue; }
+              ?>
+                <a href="<?= htmlspecialchars($app['link']); ?>" role="button" style="margin-bottom:3pt" title="<?= htmlspecialchars($app['description']); ?>" class="btn btn-primary"><?= htmlspecialchars($app['name']); ?></a>&nbsp;
+              <?php
+              }
+              $app_links = customize('get', 'app_links');
+              if (!empty($app_links)) {
+                foreach ($app_links as $row) {
+                  foreach ($row as $key => $val) {
+                ?>
+                  <a href="<?= htmlspecialchars($val); ?>" role="button" style="margin-bottom:3pt" class="btn btn-primary"><?= htmlspecialchars($key); ?></a>&nbsp;
+                <?php 
+                  }
+                }
+              }
             }
           }
-          endif;
           ?>
         </div>
       </div>
     </div>
-    <?php if(!isset($_SESSION['oauth2_request'])): ?>
+    <?php if(!isset($_SESSION['oauth2_request'])) { ?>
     <div class="col-md-offset-3 col-md-6">
       <div class="panel panel-default">
         <div class="panel-heading">
@@ -113,19 +112,19 @@ $_SESSION['index_query_string'] = $_SERVER['QUERY_STRING'];
         </div>
         <div id="collapse1" class="panel-collapse collapse">
           <div class="panel-body">
-            <?php if ($UI_TEXTS['help_text']): ?>
+            <?php if ($UI_TEXTS['help_text']) { ?>
             <p><?=$UI_TEXTS['help_text'];?></p>
-            <?php else: ?>
+            <?php } else { ?>
             <p><span style="border-bottom: 1px dotted #999;"><?=$UI_TEXTS['main_name'];?></span></p>
             <p><?= $lang['start']['mailcow_panel_detail']; ?></p>
             <p><span style="border-bottom: 1px dotted #999;"><?=$UI_TEXTS['apps_name'];?></span></p>
             <p><?= $lang['start']['mailcow_apps_detail']; ?></p>
-            <?php endif; ?>
+            <?php } ?>
           </div>
         </div>
       </div>
     </div>
-    <?php endif ?>
+    <?php } ?>
   </div>
 </div><!-- /.container -->
 <?php
diff --git a/data/web/lang/lang.ca.json b/data/web/lang/lang.ca.json
index 5b66daae..5020ff8d 100644
--- a/data/web/lang/lang.ca.json
+++ b/data/web/lang/lang.ca.json
@@ -8,6 +8,7 @@
     "add": {
         "activate_filter_warn": "All other filters will be deactivated, when active is checked.",
         "active": "Actiu",
+        "add": "Afegir",
         "add_domain_only": "Afegir el domini",
         "add_domain_restart": "Afegir el domini i reiniciar SOGo",
         "alias_address": "Dirección/es àlies:",
@@ -292,6 +293,7 @@
         "action": "Acció",
         "activate": "Activar",
         "active": "Actiu",
+        "add": "Afegir",
         "add_alias": "Afegir àlies",
         "add_bcc_entry": "Afegir BCC map",
         "add_domain": "Afegir domini",
diff --git a/data/web/lang/lang.cs.json b/data/web/lang/lang.cs.json
index 6b1aea73..884208c4 100644
--- a/data/web/lang/lang.cs.json
+++ b/data/web/lang/lang.cs.json
@@ -25,6 +25,7 @@
     "add": {
         "activate_filter_warn": "Pokud je zaškrtlá volba \"Aktivní\", budou všechny ostatní filtry deaktivovány.",
         "active": "Aktivní",
+        "add": "Přidat",
         "add_domain_only": "Přidat doménu",
         "add_domain_restart": "Přidat doménu a restartovat SOGo",
         "alias_address": "Adresa/y aliasů",
@@ -526,6 +527,7 @@
         "action": "Akce",
         "activate": "Zapnout",
         "active": "Aktivní",
+        "add": "Přidat",
         "add_alias": "Přidat alias",
         "add_bcc_entry": "Přidat BCC mapu",
         "add_domain": "Přidat doménu",
diff --git a/data/web/lang/lang.de.json b/data/web/lang/lang.de.json
index 129bfeb1..9780e111 100644
--- a/data/web/lang/lang.de.json
+++ b/data/web/lang/lang.de.json
@@ -27,6 +27,7 @@
     "add": {
         "activate_filter_warn": "Alle anderen Filter diesen Typs werden deaktiviert, falls dieses Script aktiv markiert wird.",
         "active": "Aktiv",
+        "add": "Hinzufügen",
         "add_domain_only": "Nur Domain hinzufügen",
         "add_domain_restart": "Domain hinzufügen und SOGo neustarten",
         "alias_address": "Alias-Adresse(n)",
@@ -573,6 +574,7 @@
         "action": "Aktion",
         "activate": "Aktivieren",
         "active": "Aktiv",
+        "add": "Hinzufügen",
         "add_alias": "Alias hinzufügen",
         "add_bcc_entry": "BCC-Eintrag hinzufügen",
         "add_domain": "Domain hinzufügen",
diff --git a/data/web/lang/lang.en.json b/data/web/lang/lang.en.json
index dfd598e3..fb3ad31b 100644
--- a/data/web/lang/lang.en.json
+++ b/data/web/lang/lang.en.json
@@ -27,6 +27,7 @@
     "add": {
         "activate_filter_warn": "All other filters will be deactivated, when active is checked.",
         "active": "Active",
+        "add": "Add",
         "add_domain_only": "Add domain only",
         "add_domain_restart": "Add domain and restart SOGo",
         "alias_address": "Alias address/es",
@@ -572,6 +573,7 @@
         "action": "Action",
         "activate": "Activate",
         "active": "Active",
+        "add": "Add",
         "add_alias": "Add alias",
         "add_bcc_entry": "Add BCC map",
         "add_domain": "Add domain",
diff --git a/data/web/lang/lang.es.json b/data/web/lang/lang.es.json
index ff60bfc5..83ea9119 100644
--- a/data/web/lang/lang.es.json
+++ b/data/web/lang/lang.es.json
@@ -23,6 +23,7 @@
     "add": {
         "activate_filter_warn": "Todos los demás filtros se desactivarán cuando este filtro se active.",
         "active": "Activo",
+        "add": "Agregar",
         "add_domain_only": "Agregar dominio solamente",
         "add_domain_restart": "Agregar dominio y reiniciar SOGo",
         "alias_address": "Dirección(es) alias:",
@@ -465,6 +466,7 @@
         "action": "Acción",
         "activate": "Activar",
         "active": "Activo",
+        "add": "Agregar",
         "add_alias": "Agregar alias",
         "add_bcc_entry": "Añadir regla de BCC",
         "add_domain": "Agregar dominio",
diff --git a/data/web/lang/lang.fi.json b/data/web/lang/lang.fi.json
index 9431bd50..25c69b22 100644
--- a/data/web/lang/lang.fi.json
+++ b/data/web/lang/lang.fi.json
@@ -25,6 +25,7 @@
     "add": {
         "activate_filter_warn": "Kaikki muut suodattimet deaktivoidaan, kun aktiivinen on valittu.",
         "active": "Aktiivinen",
+        "add": "Lisää",
         "add_domain_only": "Lisää vain verkkotunnus alue",
         "add_domain_restart": "Lisää verkkotunnus alue ja käynnistä SOGo uudelleen",
         "alias_address": "Alias osoite",
@@ -526,6 +527,7 @@
         "action": "Toiminnot",
         "activate": "Aktivoi",
         "active": "Aktiivinen",
+        "add": "Lisää",
         "add_alias": "Lisää alias",
         "add_bcc_entry": "Lisää piilo kopio kartta",
         "add_domain": "Lisää verkkotunnus alue",
diff --git a/data/web/lang/lang.fr.json b/data/web/lang/lang.fr.json
index f2d587ca..f4d227b0 100644
--- a/data/web/lang/lang.fr.json
+++ b/data/web/lang/lang.fr.json
@@ -4,6 +4,7 @@
     },
     "add": {
         "active": "Actif",
+        "add": "Ajouter",
         "alias_address": "Adresse(s) alias",
         "alias_address_info": "<small>Adresse de courriel complète ou @exemple.com pour recevoir tous les messages d'un domaine (séparés par de virgules). <b>Domaines mailcow seulement</b></small>",
         "alias_domain": "Alias de domaine",
@@ -240,6 +241,7 @@
         "action": "Action",
         "activate": "Activer",
         "active": "Actif",
+        "add": "Ajouter",
         "add_alias": "Ajouter un alias",
         "add_domain": "Ajouter un domaine",
         "add_domain_alias": "Ajouter un alias de domaine",
diff --git a/data/web/lang/lang.it.json b/data/web/lang/lang.it.json
index 503ca951..7180a8ef 100644
--- a/data/web/lang/lang.it.json
+++ b/data/web/lang/lang.it.json
@@ -4,6 +4,7 @@
     },
     "add": {
         "active": "Attiva",
+        "add": "Aggiungi",
         "alias_address": "Indirizzo alias/es:",
         "alias_address_info": "<small>Indirizzo e-mail completo/es @example.com, per catturare tutti i messaggi di un dominio (separati da virgola). <b>solo domini mailcow</b>.</small>",
         "alias_domain": "Dominio alias",
@@ -203,6 +204,7 @@
         "action": "Azione",
         "activate": "Attiva",
         "active": "Attiva",
+        "add": "Aggiungi",
         "add_alias": "Aggiungi alias",
         "add_domain": "Aggiungi Dominio",
         "add_domain_alias": "Aggiungi alias Dominio",
diff --git a/data/web/lang/lang.lv.json b/data/web/lang/lang.lv.json
index 0ba17ed0..1e2d025c 100644
--- a/data/web/lang/lang.lv.json
+++ b/data/web/lang/lang.lv.json
@@ -8,6 +8,7 @@
     "add": {
         "activate_filter_warn": "Visi pārējie filtri tiks deaktivizēti, kad aktīvs ir atzīmēts.",
         "active": "Aktīvs",
+        "add": "Pievienot",
         "add_domain_only": "Tikai pievienot domēnu",
         "add_domain_restart": "Pievienot domēnu un restartēt SOGo",
         "alias_address": "Alias addrese/s",
@@ -295,6 +296,7 @@
         "action": "Rīcība",
         "activate": "Activate",
         "active": "Aktīvs",
+        "add": "Pievienot",
         "add_alias": "Pievienot alias",
         "add_bcc_entry": "Pievienot BCC karti",
         "add_domain": "Pievienot domēnu",
diff --git a/data/web/lang/lang.nl.json b/data/web/lang/lang.nl.json
index 84c1d53e..0f0e18cd 100644
--- a/data/web/lang/lang.nl.json
+++ b/data/web/lang/lang.nl.json
@@ -27,6 +27,7 @@
     "add": {
         "activate_filter_warn": "Alle andere filters worden gedeactiveerd zolang deze geactiveerd is.",
         "active": "Actief",
+        "add": "Toevoegen",
         "add_domain_only": "Voeg alleen domein toe",
         "add_domain_restart": "Voeg domein toe en herstart SOGo",
         "alias_address": "Aliasadres(sen)",
@@ -570,6 +571,7 @@
         "action": "Handeling",
         "activate": "Activeer",
         "active": "Actief",
+        "add": "Toevoegen",
         "add_alias": "Voeg alias toe",
         "add_bcc_entry": "Voeg BCC-map toe",
         "add_domain": "Voeg domein toe",
diff --git a/data/web/lang/lang.pl.json b/data/web/lang/lang.pl.json
index 4cd595a0..995f088c 100644
--- a/data/web/lang/lang.pl.json
+++ b/data/web/lang/lang.pl.json
@@ -5,6 +5,7 @@
     },
     "add": {
         "active": "Aktywny",
+        "add": "Dodaj",
         "alias_address": "Alias/y:",
         "alias_address_info": "<small>Pełny/e adres/y email lub @example.com, aby przejąć wszystkie wiadomości dla domeny (oddzielone przecinkami). <b>tylko domeny mailcow</b>.</small>",
         "alias_domain": "Alias domeny",
@@ -219,6 +220,7 @@
         "action": "Działanie",
         "activate": "Aktywuj",
         "active": "Aktywny",
+        "add": "Dodaj",
         "add_alias": "Dodaj alias",
         "add_domain": "Dodaj domenę",
         "add_domain_alias": "Dodaj alias domeny",
diff --git a/data/web/lang/lang.pt.json b/data/web/lang/lang.pt.json
index bad1a9ba..e791ae37 100644
--- a/data/web/lang/lang.pt.json
+++ b/data/web/lang/lang.pt.json
@@ -1,6 +1,7 @@
 {
     "add": {
         "active": "Ativo",
+        "add": "Salvar",
         "alias_address": "Apelidos:",
         "alias_address_info": "<small>Endereço de email completo ou @example.com, para uma conta coringa -catch all. (separado por vírgula). <b>apenas domínios cadastrados</b>.</small>",
         "alias_domain": "Encaminhamento de Domínio",
@@ -164,6 +165,7 @@
     "mailbox": {
         "action": "Ação",
         "active": "Ativo",
+        "add": "Salvar",
         "add_alias": "Adicionar Apelido",
         "add_domain": "Adicionar Domínio",
         "add_domain_alias": "Adicionar Apelido de Domínio",
diff --git a/data/web/lang/lang.ru.json b/data/web/lang/lang.ru.json
index 4c85e170..be181dad 100644
--- a/data/web/lang/lang.ru.json
+++ b/data/web/lang/lang.ru.json
@@ -27,6 +27,7 @@
     "add": {
         "activate_filter_warn": "Активация этого фильтра отключит все остальные фильтры этого типа.",
         "active": "Активный",
+        "add": "Добавить",
         "add_domain_only": "Только добавить домен",
         "add_domain_restart": "Добавить домен и перезапустить SOGo",
         "alias_address": "Псевдоним/ы",
@@ -571,6 +572,7 @@
         "action": "Действия",
         "activate": "Включить",
         "active": "Активный",
+        "add": "Добавить",
         "add_alias": "Добавить псевдоним",
         "add_bcc_entry": "Добавить правило BBC",
         "add_domain": "Добавить домен",
diff --git a/data/web/lang/lang.sk.json b/data/web/lang/lang.sk.json
index 24759993..2523a065 100644
--- a/data/web/lang/lang.sk.json
+++ b/data/web/lang/lang.sk.json
@@ -27,6 +27,7 @@
     "add": {
         "activate_filter_warn": "Všetky ostatné filtre budú deaktivované, ak bude zaškrtnuté pole \"Aktívny\".",
         "active": "Aktívne",
+        "add": "Pridať",
         "add_domain_only": "Pridať iba doménu",
         "add_domain_restart": "Pridať doménu a reštartovať SOGo",
         "alias_address": "Alias adresa/y",
@@ -567,6 +568,7 @@
         "action": "Akcia",
         "activate": "Aktivovať",
         "active": "Aktívny",
+        "add": "Pridať",
         "add_alias": "Pridať alias",
         "add_bcc_entry": "Pridať BCC mapu",
         "add_domain": "Pridať doménu",
diff --git a/data/web/lang/lang.sv.json b/data/web/lang/lang.sv.json
index 1b8bca08..55e1a831 100644
--- a/data/web/lang/lang.sv.json
+++ b/data/web/lang/lang.sv.json
@@ -27,6 +27,7 @@
     "add": {
         "activate_filter_warn": "Alla andra filter av den här typen kommer inaktiveras om det här skriptet markeras som aktivt.",
         "active": "Aktiv",
+        "add": "Lägg till",
         "add_domain_only": "Lägg bara till domänen",
         "add_domain_restart": "Lägg till domänen, och starta om SOGo",
         "alias_address": "Alias-adress/adresser",
@@ -573,6 +574,7 @@
         "action": "Åtgärd",
         "activate": "Aktivera",
         "active": "Aktiv",
+        "add": "Lägg till",
         "add_alias": "Lägg till alias",
         "add_bcc_entry": "Lägg till ny koppling",
         "add_domain": "Lägg till domän",
diff --git a/data/web/mailbox.php b/data/web/mailbox.php
index 2831dfac..f8313b58 100644
--- a/data/web/mailbox.php
+++ b/data/web/mailbox.php
@@ -93,7 +93,7 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
               </div>
             </div>
             <?php
-            if (preg_match("/^([yY][eE][sS]|[yY])+$/", $_ENV["ALLOW_ADMIN_EMAIL_LOGIN"])):
+            if (preg_match("/^([yY][eE][sS]|[yY])+$/", $_ENV["ALLOW_ADMIN_EMAIL_LOGIN"]) && getenv('SKIP_SOGO') != "y"):
             ?>
             <div class="panel-body help-block">
             <?=$lang['mailbox']['sogo_allow_admin_hint'];?>
@@ -256,9 +256,16 @@ $_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
                   <li><a data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"active":"0"}' href="#"><?=$lang['mailbox']['deactivate'];?></a></li>
                   <li role="separator" class="divider"></li>
                   <li><a data-action="delete_selected" data-id="alias" data-api-url='delete/alias' href="#"><?=$lang['mailbox']['remove'];?></a></li>
+                  <?php
+                  if (getenv('SKIP_SOGO') != "y") {
+                  ?>
                   <li role="separator" class="divider"></li>
                   <li><a data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"sogo_visible":"1"}' href="#"><?=$lang['mailbox']['sogo_visible_y'];?></a></li>
                   <li><a data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"sogo_visible":"0"}' href="#"><?=$lang['mailbox']['sogo_visible_n'];?></a></li>
+                  <?php
+                  }
+                  ?>
+                  
                 </ul>
                 <a class="btn btn-sm btn-success" href="#" data-toggle="modal" data-target="#addAliasModal"><span class="glyphicon glyphicon-plus"></span> <?=$lang['mailbox']['add_alias'];?></a>
               </div>
diff --git a/data/web/modals/mailbox.php b/data/web/modals/mailbox.php
index 2e00a273..4f5ed4df 100644
--- a/data/web/modals/mailbox.php
+++ b/data/web/modals/mailbox.php
@@ -129,6 +129,9 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
             <input type="number" class="form-control" name="quota" value="10240" required>
             </div>
           </div>
+          <?php
+          if (getenv('SKIP_SOGO') != "y") {
+          ?>
           <div class="form-group">
             <div class="col-sm-offset-2 col-sm-10">
               <div class="checkbox">
@@ -137,6 +140,9 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
               </div>
             </div>
           </div>
+          <?php
+          }
+          ?>
           <div class="form-group">
             <div class="col-sm-offset-2 col-sm-10">
               <div class="checkbox">
@@ -177,11 +183,29 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
           <hr>
           <div class="form-group">
             <div class="col-sm-offset-2 col-sm-10">
+              <?php
+              if (getenv('SKIP_SOGO') != "y") {
+              ?>
               <button class="btn btn-default" data-action="add_item" data-id="add_domain" data-api-url='add/domain' data-api-attr='{}' href="#"><?=$lang['add']['add_domain_only'];?></button>
               <button class="btn btn-default" data-action="add_item" data-id="add_domain" data-api-url='add/domain' data-api-attr='{"restart_sogo":"1"}' href="#"><?=$lang['add']['add_domain_restart'];?></button>
+              <?php
+              }
+              else {
+              ?>
+              <button class="btn btn-default" data-action="add_item" data-id="add_domain" data-api-url='add/domain' data-api-attr='{}' href="#"><?=$lang['add']['add'];?></button>
+              <?php
+              }
+              ?>
             </div>
           </div>
+          <?php
+          // TODO: Separate SOGo-related text
+          if (getenv('SKIP_SOGO') != "y") {
+          ?>
           <p><span class="glyphicon glyphicon-exclamation-sign text-danger"></span> <?=$lang['add']['post_domain_add'];?></p>
+          <?php
+          }
+          ?>
         </form>
       </div>
     </div>
@@ -289,11 +313,17 @@ if (!isset($_SESSION['mailcow_cc_role'])) {
               <div class="checkbox">
                 <label><input class="goto_checkbox" type="checkbox" value="1" name="goto_ham"> <?=$lang['add']['goto_ham'];?></label>
               </div>
+              <?php
+              if (getenv('SKIP_SOGO') != "y") {
+              ?>
               <hr>
               <div class="checkbox">
                 <label><input type="checkbox" value="1" name="sogo_visible" checked> <?=$lang['edit']['sogo_visible'];?></label>
               </div>
               <p class="help-block"><?=$lang['edit']['sogo_visible_info'];?></p>
+              <?php
+              }
+              ?>
             </div>
           </div>
           <div class="form-group">
diff --git a/docker-compose.yml b/docker-compose.yml
index 5da3f419..144a4014 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -148,6 +148,7 @@ services:
         - COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized}
         - SKIP_SOLR=${SKIP_SOLR:-y}
         - SKIP_CLAMD=${SKIP_CLAMD:-n}
+        - SKIP_SOGO=${SKIP_SOGO:-n}
         - ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
         - MASTER=${MASTER:-y}
       restart: always
@@ -157,7 +158,7 @@ services:
             - phpfpm
 
     sogo-mailcow:
-      image: mailcow/sogo:1.73
+      image: mailcow/sogo:1.74
       environment:
         - DBNAME=${DBNAME}
         - DBUSER=${DBUSER}
@@ -169,6 +170,7 @@ services:
         - ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
         - IPV4_NETWORK=${IPV4_NETWORK:-172.22.1}
         - SOGO_EXPIRE_SESSION=${SOGO_EXPIRE_SESSION:-480}
+        - SKIP_SOGO=${SKIP_SOGO:-n}
         - MASTER=${MASTER:-y}
         - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-}
         - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-}
@@ -189,7 +191,7 @@ services:
             - sogo
 
     dovecot-mailcow:
-      image: mailcow/dovecot:1.120
+      image: mailcow/dovecot:1.121
       depends_on:
         - mysql-mailcow
       dns:
@@ -394,7 +396,7 @@ services:
         - /lib/modules:/lib/modules:ro
 
     watchdog-mailcow:
-      image: mailcow/watchdog:1.74
+      image: mailcow/watchdog:1.75
       # Debug
       #command: /watchdog.sh
       dns:
@@ -423,6 +425,7 @@ services:
         - CHECK_UNBOUND=${CHECK_UNBOUND:-1}
         - SKIP_CLAMD=${SKIP_CLAMD:-n}
         - SKIP_LETS_ENCRYPT=${SKIP_LETS_ENCRYPT:-n}
+        - SKIP_SOGO=${SKIP_SOGO:-n}
         - HTTPS_PORT=${HTTPS_PORT:-443}
         - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-}
         - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-}
diff --git a/generate_config.sh b/generate_config.sh
index c225a255..2b8e3405 100755
--- a/generate_config.sh
+++ b/generate_config.sh
@@ -218,6 +218,10 @@ SKIP_HTTP_VERIFICATION=n
 
 SKIP_CLAMD=${SKIP_CLAMD}
 
+# Skip SOGo: Will disable SOGo integration and therefore webmail, DAV protocols and ActiveSync support (experimental) - y/n
+
+SKIP_SOGO=n
+
 # Skip Solr on low-memory systems or if you do not want to store a readable index of your mails in solr-vol-1.
 
 SKIP_SOLR=${SKIP_SOLR}
diff --git a/update.sh b/update.sh
index d1fb19f2..fab4b1c9 100755
--- a/update.sh
+++ b/update.sh
@@ -169,6 +169,7 @@ if cp --help 2>&1 | head -n 1 | grep -q -i "busybox"; then echo "BusybBox cp det
 
 CONFIG_ARRAY=(
   "SKIP_LETS_ENCRYPT"
+  "SKIP_SOGO"
   "USE_WATCHDOG"
   "WATCHDOG_NOTIFY_EMAIL"
   "WATCHDOG_NOTIFY_BAN"