Browse Source

[Web] optimizing update_sogo_static_view function

FreddleSpl0it 2 years ago
parent
commit
d9d958356a
2 changed files with 72 additions and 4 deletions
  1. 63 3
      data/web/inc/functions.inc.php
  2. 9 1
      data/web/inc/functions.mailbox.inc.php

+ 63 - 3
data/web/inc/functions.inc.php

@@ -1015,7 +1015,7 @@ function formatBytes($size, $precision = 2) {
   }
   return round(pow(1024, $base - floor($base)), $precision) . $suffixes[floor($base)];
 }
-function update_sogo_static_view() {
+function update_sogo_static_view($mailbox = null) {
   if (getenv('SKIP_SOGO') == "y") {
     return true;
   }
@@ -1025,8 +1025,68 @@ function update_sogo_static_view() {
     WHERE TABLE_NAME = 'sogo_view'");
   $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
   if ($num_results != 0) {
-    $stmt = $pdo->query("REPLACE INTO _sogo_static_view (`c_uid`, `domain`, `c_name`, `c_password`, `c_cn`, `mail`, `aliases`, `ad_aliases`, `ext_acl`, `kind`, `multiple_bookings`)
-      SELECT `c_uid`, `domain`, `c_name`, `c_password`, `c_cn`, `mail`, `aliases`, `ad_aliases`, `ext_acl`, `kind`, `multiple_bookings` from sogo_view");
+    if ($mailbox == null){
+      $stmt = $pdo->query("REPLACE INTO _sogo_static_view (`c_uid`, `domain`, `c_name`, `c_password`, `c_cn`, `mail`, `aliases`, `ad_aliases`, `ext_acl`, `kind`, `multiple_bookings`)
+        SELECT
+          mailbox.username,
+          mailbox.domain,
+          mailbox.username,
+          IF(JSON_UNQUOTE(JSON_VALUE(attributes, '$.force_pw_update')) = '0', IF(JSON_UNQUOTE(JSON_VALUE(attributes, '$.sogo_access')) = 1, password, '{SSHA256}A123A123A321A321A321B321B321B123B123B321B432F123E321123123321321'), '{SSHA256}A123A123A321A321A321B321B321B123B123B321B432F123E321123123321321'),
+          mailbox.name,
+          mailbox.username,
+          IFNULL(GROUP_CONCAT(ga.aliases ORDER BY ga.aliases SEPARATOR ' '), ''),
+          IFNULL(gda.ad_alias, ''),
+          IFNULL(external_acl.send_as_acl, ''),
+          mailbox.kind,
+          mailbox.multiple_bookings
+        FROM
+          mailbox
+          LEFT OUTER JOIN
+              grouped_mail_aliases ga
+              ON ga.username REGEXP CONCAT('(^|,)', mailbox.username, '($|,)')
+          LEFT OUTER JOIN
+              grouped_domain_alias_address gda
+              ON gda.username = mailbox.username
+          LEFT OUTER JOIN
+              grouped_sender_acl_external external_acl
+              ON external_acl.username = mailbox.username
+        WHERE
+          mailbox.active = '1'
+        GROUP BY
+          mailbox.username;");
+    } else {
+      $stmt = $pdo->prepare("REPLACE INTO _sogo_static_view (`c_uid`, `domain`, `c_name`, `c_password`, `c_cn`, `mail`, `aliases`, `ad_aliases`, `ext_acl`, `kind`, `multiple_bookings`)
+        SELECT `c_uid`, `domain`, `c_name`, `c_password`, `c_cn`, `mail`, `aliases`, `ad_aliases`, `ext_acl`, `kind`, `multiple_bookings` from sogo_view where `c_uid` = :mailbox
+        SELECT
+          mailbox.username,
+          mailbox.domain,
+          mailbox.username,
+          IF(JSON_UNQUOTE(JSON_VALUE(attributes, '$.force_pw_update')) = '0', IF(JSON_UNQUOTE(JSON_VALUE(attributes, '$.sogo_access')) = 1, password, '{SSHA256}A123A123A321A321A321B321B321B123B123B321B432F123E321123123321321'), '{SSHA256}A123A123A321A321A321B321B321B123B123B321B432F123E321123123321321'),
+          mailbox.name,
+          mailbox.username,
+          IFNULL(GROUP_CONCAT(ga.aliases ORDER BY ga.aliases SEPARATOR ' '), ''),
+          IFNULL(gda.ad_alias, ''),
+          IFNULL(external_acl.send_as_acl, ''),
+          mailbox.kind,
+          mailbox.multiple_bookings
+        FROM
+          mailbox
+          LEFT OUTER JOIN
+              grouped_mail_aliases ga
+              ON ga.username REGEXP CONCAT('(^|,)', mailbox.username, '($|,)')
+          LEFT OUTER JOIN
+              grouped_domain_alias_address gda
+              ON gda.username = mailbox.username
+          LEFT OUTER JOIN
+              grouped_sender_acl_external external_acl
+              ON external_acl.username = mailbox.username
+        WHERE
+          mailbox.active = '1' AND
+          mailbox.username = :mailbox
+        GROUP BY
+          mailbox.username;");
+      $stmt->execute(array(':mailbox' => $mailbox));
+    }
     $stmt = $pdo->query("DELETE FROM _sogo_static_view WHERE `c_uid` NOT IN (SELECT `username` FROM `mailbox` WHERE `active` = '1');");
   }
   flush_memcached();

+ 9 - 1
data/web/inc/functions.mailbox.inc.php

@@ -1264,11 +1264,13 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
             ));
           }
 
+          update_sogo_static_view($username);
           $_SESSION['return'][] = array(
             'type' => 'success',
             'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
             'msg' => array('mailbox_added', htmlspecialchars($username))
           );
+          return true;
         break;
         case 'resource':
           $domain             = idn_to_ascii(strtolower(trim($_data['domain'])), 0, INTL_IDNA_VARIANT_UTS46);
@@ -3130,7 +3132,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
               'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
               'msg' => array('mailbox_modified', $username)
             );
+
+            update_sogo_static_view($username);
           }
+          return true;
         break;
         case 'mailbox_templates':
           if ($_SESSION['mailcow_cc_role'] != "admin") {
@@ -5053,12 +5058,15 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
               );
               continue;
             }
+            
+            update_sogo_static_view($username);
             $_SESSION['return'][] = array(
               'type' => 'success',
               'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
               'msg' => array('mailbox_removed', htmlspecialchars($username))
             );
           }
+          return true;
         break;
         case 'mailbox_templates':
           if ($_SESSION['mailcow_cc_role'] != "admin") {
@@ -5264,7 +5272,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
       }
     break;
   }
-  if ($_action != 'get' && in_array($_type, array('domain', 'alias', 'alias_domain', 'mailbox', 'resource')) && getenv('SKIP_SOGO') != "y") {
+  if ($_action != 'get' && in_array($_type, array('domain', 'alias', 'alias_domain', 'resource')) && getenv('SKIP_SOGO') != "y") {
     update_sogo_static_view();
   }
 }