From a53ef2ed7a536fbfe3e910912e496f793c37749e Mon Sep 17 00:00:00 2001 From: FreddleSpl0it Date: Mon, 7 Aug 2023 09:26:15 +0200 Subject: [PATCH] [SOGo] remove sogo_view and triggers --- data/Dockerfiles/sogo/bootstrap-sogo.sh | 104 ------------------------ data/web/inc/init_db.inc.php | 8 +- 2 files changed, 5 insertions(+), 107 deletions(-) diff --git a/data/Dockerfiles/sogo/bootstrap-sogo.sh b/data/Dockerfiles/sogo/bootstrap-sogo.sh index aa15525c9..3eb591186 100755 --- a/data/Dockerfiles/sogo/bootstrap-sogo.sh +++ b/data/Dockerfiles/sogo/bootstrap-sogo.sh @@ -24,110 +24,6 @@ while [[ "${DBV_NOW}" != "${DBV_NEW}" ]]; do done echo "DB schema is ${DBV_NOW}" -# Recreate view -if [[ "${MASTER}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then - echo "We are master, preparing sogo_view..." - mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "DROP VIEW IF EXISTS sogo_view" - while [[ ${VIEW_OK} != 'OK' ]]; do - mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF -CREATE VIEW sogo_view (c_uid, domain, c_name, c_password, c_cn, mail, aliases, ad_aliases, ext_acl, kind, multiple_bookings) AS -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; -EOF - if [[ ! -z $(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "SELECT 'OK' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sogo_view'") ]]; then - VIEW_OK=OK - else - echo "Will retry to setup SOGo view in 3s..." - sleep 3 - fi - done -else - while [[ ${VIEW_OK} != 'OK' ]]; do - if [[ ! -z $(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "SELECT 'OK' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'sogo_view'") ]]; then - VIEW_OK=OK - else - echo "Waiting for SOGo view to be created by master..." - sleep 3 - fi - done -fi - -# Wait for static view table if missing after update and update content -if [[ "${MASTER}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then - echo "We are master, preparing _sogo_static_view..." - while [[ ${STATIC_VIEW_OK} != 'OK' ]]; do - if [[ ! -z $(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "SELECT 'OK' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '_sogo_static_view'") ]]; then - STATIC_VIEW_OK=OK - echo "Updating _sogo_static_view content..." - # If changed, also update init_db.inc.php - mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "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;" - mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "DELETE FROM _sogo_static_view WHERE c_uid NOT IN (SELECT username FROM mailbox WHERE active = '1')" - else - echo "Waiting for database initialization..." - sleep 3 - fi - done -else - while [[ ${STATIC_VIEW_OK} != 'OK' ]]; do - if [[ ! -z $(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "SELECT 'OK' FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '_sogo_static_view'") ]]; then - STATIC_VIEW_OK=OK - else - echo "Waiting for database initialization by master..." - sleep 3 - fi - done -fi - - -# Recreate password update trigger -if [[ "${MASTER}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then - echo "We are master, preparing update trigger..." - mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "DROP TRIGGER IF EXISTS sogo_update_password" - while [[ ${TRIGGER_OK} != 'OK' ]]; do - mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} << EOF -DELIMITER - -CREATE TRIGGER sogo_update_password AFTER UPDATE ON _sogo_static_view -FOR EACH ROW -BEGIN -UPDATE mailbox SET password = NEW.c_password WHERE NEW.c_uid = username; -END; -- -DELIMITER ; -EOF - if [[ ! -z $(mysql --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -B -e "SELECT 'OK' FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_NAME = 'sogo_update_password'") ]]; then - TRIGGER_OK=OK - else - echo "Will retry to setup SOGo password update trigger in 3s" - sleep 3 - fi - done -fi - # cat /dev/urandom seems to hang here occasionally and is not recommended anyway, better use openssl RAND_PASS=$(openssl rand -base64 16 | tr -dc _A-Z-a-z-0-9) diff --git a/data/web/inc/init_db.inc.php b/data/web/inc/init_db.inc.php index 7447b5f4b..4f73911a6 100644 --- a/data/web/inc/init_db.inc.php +++ b/data/web/inc/init_db.inc.php @@ -1443,6 +1443,9 @@ function init_db_schema() { )); } + // remove old sogo views and triggers + $pdo->query("DROP TRIGGER IF EXISTS sogo_update_password"); + if (php_sapi_name() == "cli") { echo "DB initialization completed" . PHP_EOL; } else { @@ -1467,6 +1470,7 @@ function init_db_schema() { } if (php_sapi_name() == "cli") { include '/web/inc/vars.inc.php'; + include '/web/inc/functions.inc.php'; include '/web/inc/functions.docker.inc.php'; // $now = new DateTime(); // $mins = $now->getOffset() / 60; @@ -1488,9 +1492,7 @@ if (php_sapi_name() == "cli") { if (intval($res['OK_C']) === 2) { // Be more precise when replacing into _sogo_static_view, col orders may change try { - $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"); - $stmt = $pdo->query("DELETE FROM _sogo_static_view WHERE `c_uid` NOT IN (SELECT `username` FROM `mailbox` WHERE `active` = '1');"); + update_sogo_static_view(); echo "Fixed _sogo_static_view" . PHP_EOL; } catch ( Exception $e ) {