diff --git a/data/Dockerfiles/sogo/Dockerfile b/data/Dockerfiles/sogo/Dockerfile index f2981ad04..4cfd1dc5d 100644 --- a/data/Dockerfiles/sogo/Dockerfile +++ b/data/Dockerfiles/sogo/Dockerfile @@ -27,6 +27,7 @@ RUN echo "Building from repository $SOGO_DEBIAN_REPOSITORY" \ psmisc \ wget \ patch \ + python3 python3-pip \ && dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \ && wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" \ && chmod +x /usr/local/bin/gosu \ @@ -42,18 +43,18 @@ RUN echo "Building from repository $SOGO_DEBIAN_REPOSITORY" \ && rm -rf /var/lib/apt/lists/* \ && touch /etc/default/locale -COPY ./bootstrap-sogo.sh /bootstrap-sogo.sh -COPY syslog-ng.conf /etc/syslog-ng/syslog-ng.conf -COPY syslog-ng-redis_slave.conf /etc/syslog-ng/syslog-ng-redis_slave.conf -COPY supervisord.conf /etc/supervisor/supervisord.conf -COPY acl.diff /acl.diff -COPY navMailcowBtns.diff /navMailcowBtns.diff -COPY stop-supervisor.sh /usr/local/sbin/stop-supervisor.sh -COPY docker-entrypoint.sh / +RUN pip install --break-system-packages \ + mysql-connector-python \ + jinja2 -RUN chmod +x /bootstrap-sogo.sh \ - /usr/local/sbin/stop-supervisor.sh -ENTRYPOINT ["/docker-entrypoint.sh"] +COPY data/Dockerfiles/bootstrap /bootstrap +COPY data/Dockerfiles/sogo/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf +COPY data/Dockerfiles/sogo/syslog-ng-redis_slave.conf /etc/syslog-ng/syslog-ng-redis_slave.conf +COPY data/Dockerfiles/sogo/supervisord.conf /etc/supervisor/supervisord.conf +COPY data/Dockerfiles/sogo/stop-supervisor.sh /usr/local/sbin/stop-supervisor.sh +COPY data/Dockerfiles/sogo/docker-entrypoint.sh / -CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"] \ No newline at end of file +RUN chmod +x /usr/local/sbin/stop-supervisor.sh + +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"] diff --git a/data/Dockerfiles/sogo/acl.diff b/data/Dockerfiles/sogo/acl.diff deleted file mode 100644 index 513700388..000000000 --- a/data/Dockerfiles/sogo/acl.diff +++ /dev/null @@ -1,11 +0,0 @@ ---- /usr/lib/GNUstep/SOGo/Templates/UIxAclEditor.wox 2018-08-17 18:29:57.987504204 +0200 -+++ /usr/lib/GNUstep/SOGo/Templates/UIxAclEditor.wox 2018-08-17 18:29:35.918291298 +0200 -@@ -46,7 +46,7 @@ - - - -- - diff --git a/data/Dockerfiles/sogo/bootstrap-sogo.sh b/data/Dockerfiles/sogo/bootstrap-sogo.sh deleted file mode 100755 index abd398b34..000000000 --- a/data/Dockerfiles/sogo/bootstrap-sogo.sh +++ /dev/null @@ -1,153 +0,0 @@ -#!/bin/bash - -# Wait for MySQL to warm-up -while ! mariadb-admin status --ssl=false --socket=/var/run/mysqld/mysqld.sock -u${DBUSER} -p${DBPASS} --silent; do - echo "Waiting for database to come up..." - sleep 2 -done - -# Wait until port becomes free and send sig -until ! nc -z sogo-mailcow 20000; -do - killall -TERM sogod - sleep 3 -done - -# Wait for updated schema -DBV_NOW=$(mariadb --skip-ssl --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT version FROM versions WHERE application = 'db_schema';" -BN) -DBV_NEW=$(grep -oE '\$db_version = .*;' init_db.inc.php | sed 's/$db_version = //g;s/;//g' | cut -d \" -f2) -while [[ "${DBV_NOW}" != "${DBV_NEW}" ]]; do - echo "Waiting for schema update..." - DBV_NOW=$(mariadb --skip-ssl --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT version FROM versions WHERE application = 'db_schema';" -BN) - DBV_NEW=$(grep -oE '\$db_version = .*;' init_db.inc.php | sed 's/$db_version = //g;s/;//g' | cut -d \" -f2) - sleep 5 -done -echo "DB schema is ${DBV_NOW}" - -# 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) - -# Generate plist header with timezone data -mkdir -p /var/lib/sogo/GNUstep/Defaults/ -cat < /var/lib/sogo/GNUstep/Defaults/sogod.plist - - - - - OCSAclURL - mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_acl - SOGoIMAPServer - imap://${IPV4_NETWORK}.250:143/?TLS=YES&tlsVerifyMode=none - SOGoSieveServer - sieve://${IPV4_NETWORK}.250:4190/?TLS=YES&tlsVerifyMode=none - SOGoSMTPServer - smtp://${IPV4_NETWORK}.253:588/?TLS=YES&tlsVerifyMode=none - SOGoTrustProxyAuthentication - YES - SOGoEncryptionKey - ${RAND_PASS} - OCSAdminURL - mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_admin - OCSCacheFolderURL - mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_cache_folder - OCSEMailAlarmsFolderURL - mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_alarms_folder - OCSFolderInfoURL - mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_folder_info - OCSSessionsFolderURL - mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_sessions_folder - OCSStoreURL - mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_store - SOGoProfileURL - mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/sogo_user_profile - SOGoTimeZone - ${TZ} - domains - -EOF - -# Generate multi-domain setup -while read -r line gal - do - echo " ${line} - - SOGoMailDomain - ${line} - SOGoUserSources - - - MailFieldNames - - aliases - ad_aliases - ext_acl - - KindFieldName - kind - DomainFieldName - domain - MultipleBookingsFieldName - multiple_bookings - listRequiresDot - NO - canAuthenticate - YES - displayName - GAL ${line} - id - ${line} - isAddressBook - ${gal} - type - sql - userPasswordAlgorithm - ${MAILCOW_PASS_SCHEME} - prependPasswordScheme - YES - viewURL - mysql://${DBUSER}:${DBPASS}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/${DBNAME}/_sogo_static_view - " >> /var/lib/sogo/GNUstep/Defaults/sogod.plist - # Generate alternative LDAP authentication dict, when SQL authentication fails - # This will nevertheless read attributes from LDAP - /etc/sogo/plist_ldap.sh ${line} ${gal} >> /var/lib/sogo/GNUstep/Defaults/sogod.plist - echo " - " >> /var/lib/sogo/GNUstep/Defaults/sogod.plist -done < <(mariadb --skip-ssl --socket=/var/run/mysqld/mysqld.sock -u ${DBUSER} -p${DBPASS} ${DBNAME} -e "SELECT domain, CASE gal WHEN '1' THEN 'YES' ELSE 'NO' END AS gal FROM domain;" -B -N) - -# Generate footer -echo ' - -' >> /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 - -# Patch ACLs -#if [[ ${ACL_ANYONE} == 'allow' ]]; then -# #enable any or authenticated targets for ACL -# if patch -R -sfN --dry-run /usr/lib/GNUstep/SOGo/Templates/UIxAclEditor.wox < /acl.diff > /dev/null; then -# patch -R /usr/lib/GNUstep/SOGo/Templates/UIxAclEditor.wox < /acl.diff; -# fi -#else -# #disable any or authenticated targets for ACL -# if patch -sfN --dry-run /usr/lib/GNUstep/SOGo/Templates/UIxAclEditor.wox < /acl.diff > /dev/null; then -# patch /usr/lib/GNUstep/SOGo/Templates/UIxAclEditor.wox < /acl.diff; -# fi -#fi - -if patch -R -sfN --dry-run /usr/lib/GNUstep/SOGo/Templates/UIxTopnavToolbar.wox < /navMailcowBtns.diff > /dev/null; then - patch -R /usr/lib/GNUstep/SOGo/Templates/UIxTopnavToolbar.wox < /navMailcowBtns.diff; -fi - -# Rename custom logo, if any -[[ -f /etc/sogo/sogo-full.svg ]] && mv /etc/sogo/sogo-full.svg /etc/sogo/custom-fulllogo.svg - -# Rsync web content -echo "Syncing web content with named volume" -rsync -a /usr/lib/GNUstep/SOGo/. /sogo_web/ - -# Chown backup path -chown -R sogo:sogo /sogo_backup - -exec gosu sogo /usr/sbin/sogod diff --git a/data/Dockerfiles/sogo/docker-entrypoint.sh b/data/Dockerfiles/sogo/docker-entrypoint.sh index 4e20e960e..73831395b 100755 --- a/data/Dockerfiles/sogo/docker-entrypoint.sh +++ b/data/Dockerfiles/sogo/docker-entrypoint.sh @@ -1,17 +1,5 @@ #!/bin/bash -if [[ "${SKIP_SOGO}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then - echo "SKIP_SOGO=y, skipping SOGo..." - sleep 365d - exit 0 -fi - -if [[ ! -z ${REDIS_SLAVEOF_IP} ]]; then - cp /etc/syslog-ng/syslog-ng-redis_slave.conf /etc/syslog-ng/syslog-ng.conf -fi - -echo "$TZ" > /etc/timezone - # Run hooks for file in /hooks/*; do if [ -x "${file}" ]; then @@ -20,4 +8,13 @@ for file in /hooks/*; do fi done -exec "$@" +python3 /bootstrap/main.py +BOOTSTRAP_EXIT_CODE=$? + +if [ $BOOTSTRAP_EXIT_CODE -ne 0 ]; then + echo "Bootstrap failed with exit code $BOOTSTRAP_EXIT_CODE. Not starting SOGo." + exit $BOOTSTRAP_EXIT_CODE +fi + +echo "Bootstrap succeeded. Starting SOGo..." +exec gosu sogo /usr/sbin/sogod diff --git a/data/Dockerfiles/sogo/navMailcowBtns.diff b/data/Dockerfiles/sogo/navMailcowBtns.diff deleted file mode 100644 index 2107b5b1f..000000000 --- a/data/Dockerfiles/sogo/navMailcowBtns.diff +++ /dev/null @@ -1,15 +0,0 @@ -60,65d58 -< var:ng-click="navButtonClick" -< ng-href="/user"> -< build -< mailcow -< -< ng-show="::activeUser.path.logoff.length" -85c78 -< ng-href="#"> ---- -> ng-href="{{::activeUser.path.logoff}}"> diff --git a/data/Dockerfiles/sogo/supervisord.conf b/data/Dockerfiles/sogo/supervisord.conf index 4946d98cc..63b4869cf 100644 --- a/data/Dockerfiles/sogo/supervisord.conf +++ b/data/Dockerfiles/sogo/supervisord.conf @@ -12,7 +12,7 @@ autostart=true priority=1 [program:bootstrap-sogo] -command=/bootstrap-sogo.sh +command=/docker-entrypoint.sh stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr diff --git a/data/conf/sogo/config_templates/UIxTopnavToolbar.wox.j2 b/data/conf/sogo/config_templates/UIxTopnavToolbar.wox.j2 new file mode 100644 index 000000000..72b2f0843 --- /dev/null +++ b/data/conf/sogo/config_templates/UIxTopnavToolbar.wox.j2 @@ -0,0 +1,102 @@ + + + +
+ + {% raw %} + {{ ::'Reduce' | loc }} + {{ ::'Expand' | loc }} + {{ leftIsClose ? 'fullscreen_exit' : 'fullscreen' }} + {% endraw %} + + + menu + +
+

+

+

+
+

+
+
+ + {% endraw %} + + event + + + {% endraw %} + contacts + + + + {% endraw %} + email + + + + + forward + + + + + build + mailcow + + + {% endraw %} + settings_applications + + +
+ + help_outline + + + + settings_power + + +
+ +
\ No newline at end of file diff --git a/data/conf/sogo/config_templates/sogod.plist.j2 b/data/conf/sogo/config_templates/sogod.plist.j2 new file mode 100644 index 000000000..458ae943f --- /dev/null +++ b/data/conf/sogo/config_templates/sogod.plist.j2 @@ -0,0 +1,107 @@ + + + + + OCSAclURL + mysql://{{DBUSER}}:{{DBPASS}}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/{{DBNAME}}/sogo_acl + SOGoIMAPServer + imap://{{IPV4_NETWORK}}.250:143/?TLS=YES&tlsVerifyMode=none + SOGoSieveServer + sieve://{{IPV4_NETWORK}}.250:4190/?TLS=YES&tlsVerifyMode=none + SOGoSMTPServer + smtp://{{IPV4_NETWORK}}.253:588/?TLS=YES&tlsVerifyMode=none + SOGoTrustProxyAuthentication + YES + SOGoEncryptionKey + {{RAND_PASS}} + OCSAdminURL + mysql://{{DBUSER}}:{{DBPASS}}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/{{DBNAME}}/sogo_admin + OCSCacheFolderURL + mysql://{{DBUSER}}:{{DBPASS}}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/{{DBNAME}}/sogo_cache_folder + OCSEMailAlarmsFolderURL + mysql://{{DBUSER}}:{{DBPASS}}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/{{DBNAME}}/sogo_alarms_folder + OCSFolderInfoURL + mysql://{{DBUSER}}:{{DBPASS}}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/{{DBNAME}}/sogo_folder_info + OCSSessionsFolderURL + mysql://{{DBUSER}}:{{DBPASS}}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/{{DBNAME}}/sogo_sessions_folder + OCSStoreURL + mysql://{{DBUSER}}:{{DBPASS}}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/{{DBNAME}}/sogo_store + SOGoProfileURL + mysql://{{DBUSER}}:{{DBPASS}}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/{{DBNAME}}/sogo_user_profile + SOGoTimeZone + {{TZ}} + domains + + {% for domain in SQL_DOMAINS %} + {{ domain.domain }} + + SOGoMailDomain + {{ domain.domain }} + SOGoUserSources + + + MailFieldNames + + aliases + ad_aliases + ext_acl + + KindFieldName + kind + DomainFieldName + domain + MultipleBookingsFieldName + multiple_bookings + listRequiresDot + NO + canAuthenticate + YES + displayName + GAL {{ domain.domain }} + id + {{ domain.domain }} + isAddressBook + {{ domain.gal_status }} + type + sql + userPasswordAlgorithm + {{ MAILCOW_PASS_SCHEME }} + prependPasswordScheme + YES + viewURL + mysql://{{ DBUSER }}:{{ DBPASS }}@%2Fvar%2Frun%2Fmysqld%2Fmysqld.sock/{{ DBNAME }}/_sogo_static_view + + {% if IAM_SETTINGS.authsource == "ldap" and domain.ldap_gal %} + + canAuthenticate + YES + id + {{ domain.domain }}_ldap + isAddressBook + "{{ domain.gal_status }}" + IDFieldName + mail + UIDFieldName + uid + bindFields + + mail + + type + ldap + bindDN + {{ IAM_SETTINGS.binddn }} + bindPassword + {{ IAM_SETTINGS.bindpass }} + baseDN + {{ IAM_SETTINGS.basedn }} + hostname + {{ IAM_SETTINGS.ldap_url }} + + {% endif%} + + + {% endfor %} + + + \ No newline at end of file diff --git a/data/web/inc/functions.mailbox.inc.php b/data/web/inc/functions.mailbox.inc.php index d5daeddcd..85c638c8a 100644 --- a/data/web/inc/functions.mailbox.inc.php +++ b/data/web/inc/functions.mailbox.inc.php @@ -538,6 +538,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $relay_unknown_only = (isset($_data['relay_unknown_only'])) ? intval($_data['relay_unknown_only']) : $DOMAIN_DEFAULT_ATTRIBUTES['relay_unknown_only']; $backupmx = (isset($_data['backupmx'])) ? intval($_data['backupmx']) : $DOMAIN_DEFAULT_ATTRIBUTES['backupmx']; $gal = (isset($_data['gal'])) ? intval($_data['gal']) : $DOMAIN_DEFAULT_ATTRIBUTES['gal']; + $ldap_gal = (isset($_data['gal'])) ? intval($_data['ldap_gal']) : $DOMAIN_DEFAULT_ATTRIBUTES['ldap_gal']; if ($relay_all_recipients == 1) { $backupmx = '1'; } @@ -593,8 +594,8 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ':domain' => '%@' . $domain )); // save domain - $stmt = $pdo->prepare("INSERT INTO `domain` (`domain`, `description`, `aliases`, `mailboxes`, `defquota`, `maxquota`, `quota`, `backupmx`, `gal`, `active`, `relay_unknown_only`, `relay_all_recipients`) - VALUES (:domain, :description, :aliases, :mailboxes, :defquota, :maxquota, :quota, :backupmx, :gal, :active, :relay_unknown_only, :relay_all_recipients)"); + $stmt = $pdo->prepare("INSERT INTO `domain` (`domain`, `description`, `aliases`, `mailboxes`, `defquota`, `maxquota`, `quota`, `backupmx`, `gal`, `ldap_gal`, `active`, `relay_unknown_only`, `relay_all_recipients`) + VALUES (:domain, :description, :aliases, :mailboxes, :defquota, :maxquota, :quota, :backupmx, :gal, :ldap_gal, :active, :relay_unknown_only, :relay_all_recipients)"); $stmt->execute(array( ':domain' => $domain, ':description' => $description, @@ -605,6 +606,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ':quota' => $quota, ':backupmx' => $backupmx, ':gal' => $gal, + ':ldap_gal' => $ldap_gal, ':active' => $active, ':relay_unknown_only' => $relay_unknown_only, ':relay_all_recipients' => $relay_all_recipients @@ -1551,9 +1553,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $attr['rl_value'] = (!empty($_data['rl_value'])) ? $_data['rl_value'] : ""; $attr['active'] = isset($_data['active']) ? intval($_data['active']) : 1; $attr['gal'] = (isset($_data['gal'])) ? intval($_data['gal']) : 1; + $attr['ldap_gal'] = (isset($_data['ldap_gal'])) ? intval($_data['ldap_gal']) : 1; $attr['backupmx'] = (isset($_data['backupmx'])) ? intval($_data['backupmx']) : 0; $attr['relay_all_recipients'] = (isset($_data['relay_all_recipients'])) ? intval($_data['relay_all_recipients']) : 0; - $attr['relay_unknown_only'] = (isset($_data['relay_unknown_only'])) ? intval($_data['relay_unknown_only']) : 0; + $attr['relay_unknown_only'] = (isset($_data['relay_unknown_only'])) ? intval($_data['relay_unknown_only']) : 0; $attr['dkim_selector'] = (isset($_data['dkim_selector'])) ? $_data['dkim_selector'] : "dkim"; $attr['key_size'] = isset($_data['key_size']) ? intval($_data['key_size']) : 2048; @@ -2626,6 +2629,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $is_now = mailbox('get', 'domain_details', $domain); if (!empty($is_now)) { $gal = (isset($_data['gal'])) ? intval($_data['gal']) : $is_now['gal']; + $ldap_gal = (isset($_data['ldap_gal'])) ? intval($_data['ldap_gal']) : $is_now['ldap_gal']; $description = (!empty($_data['description']) && isset($_SESSION['acl']['domain_desc']) && $_SESSION['acl']['domain_desc'] == "1") ? $_data['description'] : $is_now['description']; (int)$relayhost = (isset($_data['relayhost']) && isset($_SESSION['acl']['domain_relayhost']) && $_SESSION['acl']['domain_relayhost'] == "1") ? intval($_data['relayhost']) : intval($is_now['relayhost']); $tags = (is_array($_data['tags']) ? $_data['tags'] : array()); @@ -2642,10 +2646,12 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $stmt = $pdo->prepare("UPDATE `domain` SET `description` = :description, `gal` = :gal + `ldap_gal` = :ldap_gal WHERE `domain` = :domain"); $stmt->execute(array( ':description' => $description, ':gal' => $gal, + ':ldap_gal' => $ldap_gal, ':domain' => $domain )); // save tags @@ -2678,6 +2684,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $active = (isset($_data['active'])) ? intval($_data['active']) : $is_now['active']; $backupmx = (isset($_data['backupmx'])) ? intval($_data['backupmx']) : $is_now['backupmx']; $gal = (isset($_data['gal'])) ? intval($_data['gal']) : $is_now['gal']; + $ldap_gal = (isset($_data['ldap_gal'])) ? intval($_data['ldap_gal']) : $is_now['ldap_gal']; $relay_all_recipients = (isset($_data['relay_all_recipients'])) ? intval($_data['relay_all_recipients']) : $is_now['relay_all_recipients']; $relay_unknown_only = (isset($_data['relay_unknown_only'])) ? intval($_data['relay_unknown_only']) : $is_now['relay_unknown_only']; $relayhost = (isset($_data['relayhost'])) ? intval($_data['relayhost']) : $is_now['relayhost']; @@ -2792,6 +2799,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { `relay_unknown_only` = :relay_unknown_only, `backupmx` = :backupmx, `gal` = :gal, + `ldap_gal` = :ldap_gal, `active` = :active, `quota` = :quota, `defquota` = :defquota, @@ -2806,6 +2814,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { ':relay_unknown_only' => $relay_unknown_only, ':backupmx' => $backupmx, ':gal' => $gal, + ':ldap_gal' => $ldap_gal, ':active' => $active, ':quota' => $quota, ':defquota' => $defquota, @@ -2890,9 +2899,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $attr['rl_value'] = (!empty($_data['rl_value'])) ? $_data['rl_value'] : ""; $attr['active'] = isset($_data['active']) ? intval($_data['active']) : 1; $attr['gal'] = (isset($_data['gal'])) ? intval($_data['gal']) : 1; + $attr['ldap_gal'] = (isset($_data['ldap_gal'])) ? intval($_data['ldap_gal']) : 0; $attr['backupmx'] = (isset($_data['backupmx'])) ? intval($_data['backupmx']) : 0; $attr['relay_all_recipients'] = (isset($_data['relay_all_recipients'])) ? intval($_data['relay_all_recipients']) : 0; - $attr['relay_unknown_only'] = (isset($_data['relay_unknown_only'])) ? intval($_data['relay_unknown_only']) : 0; + $attr['relay_unknown_only'] = (isset($_data['relay_unknown_only'])) ? intval($_data['relay_unknown_only']) : 0; $attr['dkim_selector'] = (isset($_data['dkim_selector'])) ? $_data['dkim_selector'] : "dkim"; $attr['key_size'] = isset($_data['key_size']) ? intval($_data['key_size']) : 2048; @@ -4673,6 +4683,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { `relay_unknown_only`, `backupmx`, `gal`, + `ldap_gal`, `active` FROM `domain` WHERE `domain`= :domain"); $stmt->execute(array( @@ -4733,6 +4744,8 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) { $domaindata['backupmx_int'] = $row['backupmx']; $domaindata['gal'] = $row['gal']; $domaindata['gal_int'] = $row['gal']; + $domaindata['ldap_gal'] = $row['ldap_gal']; + $domaindata['ldap_gal_int'] = $row['ldap_gal']; $domaindata['rl'] = $rl; $domaindata['active'] = $row['active']; $domaindata['active_int'] = $row['active']; diff --git a/data/web/inc/init_db.inc.php b/data/web/inc/init_db.inc.php index 767a0024e..d0f7b6ed2 100644 --- a/data/web/inc/init_db.inc.php +++ b/data/web/inc/init_db.inc.php @@ -4,7 +4,7 @@ function init_db_schema() try { global $pdo; - $db_version = "27012025_1555"; + $db_version = "16052025_1245"; $stmt = $pdo->query("SHOW TABLES LIKE 'versions'"); $num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC)); @@ -259,6 +259,7 @@ function init_db_schema() "relayhost" => "VARCHAR(255) NOT NULL DEFAULT '0'", "backupmx" => "TINYINT(1) NOT NULL DEFAULT '0'", "gal" => "TINYINT(1) NOT NULL DEFAULT '1'", + "ldap_gal" => "TINYINT(1) NOT NULL DEFAULT '0'", "relay_all_recipients" => "TINYINT(1) NOT NULL DEFAULT '0'", "relay_unknown_only" => "TINYINT(1) NOT NULL DEFAULT '0'", "created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)", @@ -560,6 +561,21 @@ function init_db_schema() ), "attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC" ), + "service_settings" => array( + "cols" => array( + "key" => "VARCHAR(255) NOT NULL", + "value" => "LONGTEXT NOT NULL", + "type" => "DATETIME(0) NOT NULL DEFAULT NOW(0)", + "created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)", + "modified" => "DATETIME ON UPDATE CURRENT_TIMESTAMP", + ), + "keys" => array( + "primary" => array( + "" => array("key") + ) + ), + "attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC" + ), "settingsmap" => array( "cols" => array( "id" => "INT NOT NULL AUTO_INCREMENT", diff --git a/data/web/lang/lang.en-gb.json b/data/web/lang/lang.en-gb.json index fb8fbb6e4..9105172b3 100644 --- a/data/web/lang/lang.en-gb.json +++ b/data/web/lang/lang.en-gb.json @@ -65,6 +65,8 @@ "full_name": "Full name", "gal": "Global Address List", "gal_info": "The GAL contains all objects of a domain and cannot be edited by any user. Free/busy information in SOGo is missing, if disabled! Restart SOGo to apply changes.", + "ldap_gal": "Global LDAP Address List", + "ldap_gal_info": "", "generate": "generate", "goto_ham": "Learn as ham", "goto_null": "Silently discard mail", @@ -681,6 +683,8 @@ "full_name": "Full name", "gal": "Global Address List", "gal_info": "The GAL contains all objects of a domain and cannot be edited by any user. Free/busy information in SOGo is missing, if disabled! Restart SOGo to apply changes.", + "ldap_gal": "Global LDAP Address List", + "ldap_gal_info": "", "generate": "generate", "grant_types": "Grant types", "hostname": "Hostname", diff --git a/data/web/templates/edit/domain.twig b/data/web/templates/edit/domain.twig index 6d1d85c73..96fa3cc94 100644 --- a/data/web/templates/edit/domain.twig +++ b/data/web/templates/edit/domain.twig @@ -24,6 +24,7 @@ +
@@ -130,6 +131,14 @@
+
+
+
+ + {{ lang.edit.ldap_gal_info|raw }} +
+
+

diff --git a/data/web/templates/modals/mailbox.twig b/data/web/templates/modals/mailbox.twig index 85091da41..3f03b070f 100644 --- a/data/web/templates/modals/mailbox.twig +++ b/data/web/templates/modals/mailbox.twig @@ -387,6 +387,7 @@
+
+
+
+ + {{ lang.edit.ldap_gal_info|raw }} +
+
+
{% endif %}
@@ -600,6 +609,14 @@
+
+
+
+ + {{ lang.add.ldap_gal_info|raw }} +
+
+