Compare commits
75 Commits
2023-01a
...
feature/ft
Author | SHA1 | Date | |
---|---|---|---|
|
f09c8534f5 | ||
|
d20df7d73e | ||
|
a8c61daeaf | ||
|
1a4f11209a | ||
|
04403aaf70 | ||
|
7f0dd7d0d7 | ||
|
cd29ad883e | ||
|
e1cd719a17 | ||
|
15bb331a7d | ||
|
6f3179bb8d | ||
|
29e5b87207 | ||
|
4403bc2d18 | ||
|
63e92e0897 | ||
|
aa4d8b1f47 | ||
|
9054ca18be | ||
|
38291d123f | ||
|
ca64ff2c0b | ||
|
dc85f49961 | ||
|
5dca4dac81 | ||
|
df8775d4c9 | ||
|
2bc663dcd5 | ||
|
1071bb8230 | ||
|
e437810eca | ||
|
e8fd34d31f | ||
|
6aebb8352e | ||
|
d684e0efc0 | ||
|
64ac6a8891 | ||
|
72e8180c6b | ||
|
d62c275004 | ||
|
aa7f562761 | ||
|
a1f033e4c1 | ||
|
58ddc31db6 | ||
|
5bf62481d5 | ||
|
6ff3f3f044 | ||
|
0408bbf57f | ||
|
eb4a33dc27 | ||
|
a0ae59f8bf | ||
|
60871fa7d0 | ||
|
59a4031e24 | ||
|
04f55fc748 | ||
|
3ba3f1c2bd | ||
|
b0fd9787b5 | ||
|
df3de09050 | ||
|
86079429b3 | ||
|
ed476aae6b | ||
|
f0e27312f9 | ||
|
3425bcfbf0 | ||
|
bfa81b318d | ||
|
8dba0ca7dd | ||
|
5bd3394ed9 | ||
|
c0e66254b9 | ||
|
aec2dd1252 | ||
|
d86e9a22f4 | ||
|
db73f83c4e | ||
|
28582c5842 | ||
|
3d637aca25 | ||
|
d079ff49c6 | ||
|
2d6ce926e1 | ||
|
60ddfe3be2 | ||
|
30e2d944cd | ||
|
99ea569288 | ||
|
c98ef0d0c5 | ||
|
f09ca0a36a | ||
|
cdce97bd59 | ||
|
ed8941440a | ||
|
570170a5b1 | ||
|
df2c33d323 | ||
|
f2e0e50f87 | ||
|
26c5ed73e2 | ||
|
148b511f9d | ||
|
311007700b | ||
|
3a9177bd4c | ||
|
bca09e3afa | ||
|
cfba96f7e0 | ||
|
c82f38a025 |
2
.github/workflows/pr_to_nightly.yml
vendored
2
.github/workflows/pr_to_nightly.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Run the Action
|
- name: Run the Action
|
||||||
uses: devops-infra/action-pull-request@v0.5.3
|
uses: devops-infra/action-pull-request@v0.5.5
|
||||||
with:
|
with:
|
||||||
github_token: ${{ secrets.PRTONIGHTLY_ACTION_PAT }}
|
github_token: ${{ secrets.PRTONIGHTLY_ACTION_PAT }}
|
||||||
title: Automatic PR to nightly from ${{ github.event.repository.updated_at}}
|
title: Automatic PR to nightly from ${{ github.event.repository.updated_at}}
|
||||||
|
2
.github/workflows/rebuild_backup_image.yml
vendored
2
.github/workflows/rebuild_backup_image.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
|||||||
password: ${{ secrets.BACKUPIMAGEBUILD_ACTION_DOCKERHUB_TOKEN }}
|
password: ${{ secrets.BACKUPIMAGEBUILD_ACTION_DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Build and push
|
- name: Build and push
|
||||||
uses: docker/build-push-action@v3
|
uses: docker/build-push-action@v4
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
file: data/Dockerfiles/backup/Dockerfile
|
file: data/Dockerfiles/backup/Dockerfile
|
||||||
|
@@ -1,20 +0,0 @@
|
|||||||
name: "Tweet trigger release"
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [published]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
tweet:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: "Get Release Tag"
|
|
||||||
run: |
|
|
||||||
RELEASE_TAG=$(curl https://api.github.com/repos/mailcow/mailcow-dockerized/releases/latest | jq -r '.tag_name')
|
|
||||||
- name: Tweet-trigger-publish-release
|
|
||||||
uses: mugi111/tweet-trigger-release@v1.2
|
|
||||||
with:
|
|
||||||
consumer_key: ${{ secrets.CONSUMER_KEY }}
|
|
||||||
consumer_secret: ${{ secrets.CONSUMER_SECRET }}
|
|
||||||
access_token_key: ${{ secrets.ACCESS_TOKEN_KEY }}
|
|
||||||
access_token_secret: ${{ secrets.ACCESS_TOKEN_SECRET }}
|
|
||||||
tweet_body: 'A new mailcow update has just been released! Checkout the GitHub Page for changelog and more informations: https://github.com/mailcow/mailcow-dockerized/releases/latest'
|
|
1
.gitignore
vendored
1
.gitignore
vendored
@@ -13,6 +13,7 @@ data/conf/dovecot/acl_anyone
|
|||||||
data/conf/dovecot/dovecot-master.passwd
|
data/conf/dovecot/dovecot-master.passwd
|
||||||
data/conf/dovecot/dovecot-master.userdb
|
data/conf/dovecot/dovecot-master.userdb
|
||||||
data/conf/dovecot/extra.conf
|
data/conf/dovecot/extra.conf
|
||||||
|
data/conf/dovecot/dovecot-fts-flatcurve.conf
|
||||||
data/conf/dovecot/global_sieve_*
|
data/conf/dovecot/global_sieve_*
|
||||||
data/conf/dovecot/last_login
|
data/conf/dovecot/last_login
|
||||||
data/conf/dovecot/lua
|
data/conf/dovecot/lua
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
FROM clamav/clamav:1.0_base
|
FROM clamav/clamav:1.0.1-1_base
|
||||||
|
|
||||||
LABEL maintainer "André Peters <andre.peters@servercow.de>"
|
LABEL maintainer "André Peters <andre.peters@servercow.de>"
|
||||||
|
|
||||||
|
@@ -1,24 +1,15 @@
|
|||||||
FROM debian:bullseye-slim
|
FROM debian:bullseye-slim as build
|
||||||
LABEL maintainer "Andre Peters <andre.peters@servercow.de>"
|
LABEL maintainer "Andre Peters <andre.peters@servercow.de>"
|
||||||
|
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
# renovate: datasource=github-tags depName=dovecot/core versioning=semver-coerced
|
ARG DOVECOT=2.3.19.1
|
||||||
ARG DOVECOT=2.3.20
|
ARG FLATCURVE=v0.3.2
|
||||||
# renovate: datasource=github-releases depName=tianon/gosu versioning=semver-coerced
|
ARG XAPIAN=1.4.21
|
||||||
ARG GOSU_VERSION=1.16
|
|
||||||
ENV LC_ALL C
|
ENV LC_ALL C
|
||||||
|
|
||||||
|
|
||||||
# Add groups and users before installing Dovecot to not break compatibility
|
# Add groups and users before installing Dovecot to not break compatibility
|
||||||
RUN groupadd -g 5000 vmail \
|
RUN touch /etc/default/locale \
|
||||||
&& groupadd -g 401 dovecot \
|
|
||||||
&& groupadd -g 402 dovenull \
|
|
||||||
&& groupadd -g 999 sogo \
|
|
||||||
&& usermod -a -G sogo nobody \
|
|
||||||
&& useradd -g vmail -u 5000 vmail -d /var/vmail \
|
|
||||||
&& useradd -c "Dovecot unprivileged user" -d /dev/null -u 401 -g dovecot -s /bin/false dovecot \
|
|
||||||
&& useradd -c "Dovecot login user" -d /dev/null -u 402 -g dovenull -s /bin/false dovenull \
|
|
||||||
&& touch /etc/default/locale \
|
|
||||||
&& apt-get update \
|
&& apt-get update \
|
||||||
&& apt-get -y --no-install-recommends install \
|
&& apt-get -y --no-install-recommends install \
|
||||||
apt-transport-https \
|
apt-transport-https \
|
||||||
@@ -76,7 +67,13 @@ RUN groupadd -g 5000 vmail \
|
|||||||
libunicode-string-perl \
|
libunicode-string-perl \
|
||||||
liburi-perl \
|
liburi-perl \
|
||||||
libwww-perl \
|
libwww-perl \
|
||||||
|
libstemmer-dev \
|
||||||
|
libexttextcat-dev \
|
||||||
|
libldap-dev \
|
||||||
|
libghc-bzlib-dev \
|
||||||
lua-sql-mysql \
|
lua-sql-mysql \
|
||||||
|
liblz4-dev \
|
||||||
|
libzstd-dev \
|
||||||
lua-socket \
|
lua-socket \
|
||||||
mariadb-client \
|
mariadb-client \
|
||||||
procps \
|
procps \
|
||||||
@@ -87,30 +84,152 @@ RUN groupadd -g 5000 vmail \
|
|||||||
syslog-ng-core \
|
syslog-ng-core \
|
||||||
syslog-ng-mod-redis \
|
syslog-ng-mod-redis \
|
||||||
wget \
|
wget \
|
||||||
|
git \
|
||||||
|
bison \
|
||||||
|
flex \
|
||||||
|
build-essential \
|
||||||
|
autoconf \
|
||||||
|
automake \
|
||||||
|
libtool \
|
||||||
|
make \
|
||||||
|
libxapian-dev \
|
||||||
|
default-libmysqlclient-dev \
|
||||||
|
libicu-dev \
|
||||||
|
zlib1g-dev \
|
||||||
|
pkg-config \
|
||||||
|
libsqlite3-dev \
|
||||||
|
liblua5.3-dev \
|
||||||
&& dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \
|
&& 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" \
|
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" \
|
||||||
&& chmod +x /usr/local/bin/gosu \
|
&& chmod +x /usr/local/bin/gosu \
|
||||||
&& gosu nobody true \
|
&& gosu nobody true
|
||||||
&& apt-key adv --fetch-keys https://repo.dovecot.org/DOVECOT-REPO-GPG \
|
# && apt-key adv --fetch-keys https://repo.dovecot.org/DOVECOT-REPO-GPG \
|
||||||
&& echo "deb https://repo.dovecot.org/ce-${DOVECOT}/debian/bullseye bullseye main" > /etc/apt/sources.list.d/dovecot.list \
|
# && echo "deb https://repo.dovecot.org/ce-${DOVECOT}/debian/bullseye bullseye main" > /etc/apt/sources.list.d/dovecot.list \
|
||||||
&& apt-get update \
|
# && apt-get update \
|
||||||
&& apt-get -y --no-install-recommends install \
|
# && apt-get -y --no-install-recommends install \
|
||||||
dovecot-lua \
|
# dovecot-lua \
|
||||||
dovecot-managesieved \
|
# dovecot-managesieved \
|
||||||
dovecot-sieve \
|
# dovecot-sieve \
|
||||||
dovecot-lmtpd \
|
# dovecot-lmtpd \
|
||||||
dovecot-ldap \
|
# dovecot-ldap \
|
||||||
dovecot-mysql \
|
# dovecot-mysql \
|
||||||
dovecot-core \
|
# dovecot-core \
|
||||||
dovecot-pop3d \
|
# dovecot-pop3d \
|
||||||
dovecot-imapd \
|
# dovecot-imapd \
|
||||||
dovecot-solr \
|
# dovecot-dev
|
||||||
&& pip3 install mysql-connector-python html2text jinja2 redis \
|
|
||||||
&& apt-get autoremove --purge -y \
|
|
||||||
&& apt-get autoclean \
|
|
||||||
&& rm -rf /var/lib/apt/lists/* \
|
|
||||||
&& rm -rf /tmp/* /var/tmp/* /root/.cache/
|
|
||||||
|
|
||||||
|
RUN cd /tmp && git clone --depth 1 --branch ${DOVECOT} https://github.com/dovecot/core.git dovecot/core && cd dovecot/core \
|
||||||
|
&& ./autogen.sh \
|
||||||
|
&& PANDOC=false ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --with-ssldir=/etc/ssl --enable-maintainer-mode --with-sql=yes --with-lua=yes --with-mysql --with-ldap --with-zstd --with-lz4 --with-ssl=openssl --with-notify=inotify --with-bzlib --with-zlib --enable-hardening --with-stemmer --with-textcat --with-icu \
|
||||||
|
&& make -j6 \
|
||||||
|
&& make install \
|
||||||
|
&& make clean
|
||||||
|
|
||||||
|
RUN cd /tmp && git clone --depth 1 --branch release-0.5 https://github.com/dovecot/pigeonhole dovecot/pigeonhole && cd dovecot/pigeonhole \
|
||||||
|
&& ./autogen.sh \
|
||||||
|
&& ./configure --with-dovecot=/usr/lib/dovecot --with-managesieve\
|
||||||
|
&& make -j6 \
|
||||||
|
&& make install \
|
||||||
|
&& make clean
|
||||||
|
|
||||||
|
RUN cd /tmp && wget https://oligarchy.co.uk/xapian/${XAPIAN}/xapian-core-${XAPIAN}.tar.xz && tar xf xapian-core-${XAPIAN}.tar.xz && cd xapian-core-${XAPIAN} \
|
||||||
|
&& ./configure --prefix=/usr/local/xapian \
|
||||||
|
&& make -j6 \
|
||||||
|
&& make install \
|
||||||
|
&& make clean
|
||||||
|
|
||||||
|
RUN cd /tmp && git clone --depth 1 --branch ${FLATCURVE} https://github.com/slusarz/dovecot-fts-flatcurve.git dovecot/flatcurve && cd dovecot/flatcurve \
|
||||||
|
&& ./autogen.sh \
|
||||||
|
&& ./configure --with-dovecot=/usr/lib/dovecot \
|
||||||
|
&& make -j6 \
|
||||||
|
&& make install \
|
||||||
|
&& make clean
|
||||||
|
|
||||||
|
FROM debian:bullseye-slim
|
||||||
|
RUN groupadd -g 5000 vmail \
|
||||||
|
&& groupadd -g 401 dovecot \
|
||||||
|
&& groupadd -g 402 dovenull \
|
||||||
|
&& groupadd -g 999 sogo \
|
||||||
|
&& usermod -a -G sogo nobody \
|
||||||
|
&& useradd -g vmail -u 5000 vmail -d /var/vmail \
|
||||||
|
&& useradd -c "Dovecot unprivileged user" -d /dev/null -u 401 -g dovecot -s /bin/false dovecot \
|
||||||
|
&& useradd -c "Dovecot login user" -d /dev/null -u 402 -g dovenull -s /bin/false dovenull \
|
||||||
|
&& apt update && apt install lua-socket \
|
||||||
|
mariadb-client \
|
||||||
|
libstemmer-dev \
|
||||||
|
libexttextcat-dev \
|
||||||
|
libicu-dev \
|
||||||
|
libxapian-dev \
|
||||||
|
libsqlite3-dev \
|
||||||
|
liblua5.3-dev \
|
||||||
|
lua-sql-mysql \
|
||||||
|
libldap-dev \
|
||||||
|
procps \
|
||||||
|
python3-pip \
|
||||||
|
redis-server \
|
||||||
|
supervisor \
|
||||||
|
syslog-ng \
|
||||||
|
syslog-ng-core \
|
||||||
|
syslog-ng-mod-redis \
|
||||||
|
cpanminus \
|
||||||
|
curl \
|
||||||
|
libauthen-ntlm-perl \
|
||||||
|
libcgi-pm-perl \
|
||||||
|
libcrypt-openssl-rsa-perl \
|
||||||
|
libcrypt-ssleay-perl \
|
||||||
|
libdata-uniqid-perl \
|
||||||
|
libdbd-mysql-perl \
|
||||||
|
libdbi-perl \
|
||||||
|
libdigest-hmac-perl \
|
||||||
|
libdist-checkconflicts-perl \
|
||||||
|
libencode-imaputf7-perl \
|
||||||
|
libfile-copy-recursive-perl \
|
||||||
|
libfile-tail-perl \
|
||||||
|
libhtml-parser-perl \
|
||||||
|
libio-compress-perl \
|
||||||
|
libio-socket-inet6-perl \
|
||||||
|
libio-socket-ssl-perl \
|
||||||
|
libio-tee-perl \
|
||||||
|
libipc-run-perl \
|
||||||
|
libjson-webtoken-perl \
|
||||||
|
liblockfile-simple-perl \
|
||||||
|
libmail-imapclient-perl \
|
||||||
|
libmodule-implementation-perl \
|
||||||
|
libmodule-scandeps-perl \
|
||||||
|
libnet-ssleay-perl \
|
||||||
|
libpackage-stash-perl \
|
||||||
|
libpackage-stash-xs-perl \
|
||||||
|
libpar-packer-perl \
|
||||||
|
libparse-recdescent-perl \
|
||||||
|
libproc-processtable-perl \
|
||||||
|
libreadonly-perl \
|
||||||
|
libregexp-common-perl \
|
||||||
|
libsys-meminfo-perl \
|
||||||
|
libterm-readkey-perl \
|
||||||
|
libtest-deep-perl \
|
||||||
|
libtest-fatal-perl \
|
||||||
|
libtest-mock-guard-perl \
|
||||||
|
libtest-mockobject-perl \
|
||||||
|
libtest-nowarnings-perl \
|
||||||
|
libtest-pod-perl \
|
||||||
|
libtest-requires-perl \
|
||||||
|
libtest-simple-perl \
|
||||||
|
libtest-warn-perl \
|
||||||
|
libtry-tiny-perl \
|
||||||
|
libunicode-string-perl \
|
||||||
|
liburi-perl \
|
||||||
|
libwww-perl \
|
||||||
|
dnsutils \
|
||||||
|
gettext-base -y --no-install-recommends \
|
||||||
|
&& pip3 install mysql-connector-python html2text jinja2 redis
|
||||||
|
COPY --from=build /usr/lib/dovecot /usr/lib/dovecot
|
||||||
|
COPY --from=build /usr/bin/doveconf /usr/bin/doveconf
|
||||||
|
COPY --from=build /usr/bin/doveadm /usr/bin/doveadm
|
||||||
|
COPY --from=build /usr/bin/dovecot-sysreport /usr/bin/dovecot-sysreport
|
||||||
|
COPY --from=build /usr/sbin/dovecot /usr/sbin/dovecot
|
||||||
|
COPY --from=build /usr/libexec/dovecot/ /usr/libexec/dovecot/
|
||||||
|
COPY --from=build /usr/local/bin /usr/local/bin
|
||||||
|
COPY --from=build /usr/local/xapian/ /usr/local/xapian
|
||||||
COPY trim_logs.sh /usr/local/bin/trim_logs.sh
|
COPY trim_logs.sh /usr/local/bin/trim_logs.sh
|
||||||
COPY clean_q_aged.sh /usr/local/bin/clean_q_aged.sh
|
COPY clean_q_aged.sh /usr/local/bin/clean_q_aged.sh
|
||||||
COPY syslog-ng.conf /etc/syslog-ng/syslog-ng.conf
|
COPY syslog-ng.conf /etc/syslog-ng/syslog-ng.conf
|
||||||
|
@@ -109,17 +109,19 @@ EOF
|
|||||||
|
|
||||||
echo -n ${ACL_ANYONE} > /etc/dovecot/acl_anyone
|
echo -n ${ACL_ANYONE} > /etc/dovecot/acl_anyone
|
||||||
|
|
||||||
if [[ "${SKIP_SOLR}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
|
if [[ "${SKIP_XAPIAN}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
|
||||||
echo -n 'quota acl zlib mail_crypt mail_crypt_acl mail_log notify listescape replication' > /etc/dovecot/mail_plugins
|
echo -n 'quota acl zlib mail_crypt mail_crypt_acl mail_log notify listescape replication' > /etc/dovecot/mail_plugins
|
||||||
echo -n 'quota imap_quota imap_acl acl zlib imap_zlib imap_sieve mail_crypt mail_crypt_acl notify listescape replication mail_log' > /etc/dovecot/mail_plugins_imap
|
echo -n 'quota imap_quota imap_acl acl zlib imap_zlib imap_sieve mail_crypt mail_crypt_acl notify listescape replication mail_log' > /etc/dovecot/mail_plugins_imap
|
||||||
echo -n 'quota sieve acl zlib mail_crypt mail_crypt_acl notify listescape replication' > /etc/dovecot/mail_plugins_lmtp
|
echo -n 'quota sieve acl zlib mail_crypt mail_crypt_acl notify listescape replication' > /etc/dovecot/mail_plugins_lmtp
|
||||||
else
|
else
|
||||||
echo -n 'quota acl zlib mail_crypt mail_crypt_acl mail_log notify fts fts_solr listescape replication' > /etc/dovecot/mail_plugins
|
echo -n 'quota acl zlib mail_crypt mail_crypt_acl mail_log notify fts fts_flatcurve listescape replication' > /etc/dovecot/mail_plugins
|
||||||
echo -n 'quota imap_quota imap_acl acl zlib imap_zlib imap_sieve mail_crypt mail_crypt_acl notify mail_log fts fts_solr listescape replication' > /etc/dovecot/mail_plugins_imap
|
echo -n 'quota imap_quota imap_acl acl zlib imap_zlib imap_sieve mail_crypt mail_crypt_acl notify mail_log fts fts_flatcurve listescape replication' > /etc/dovecot/mail_plugins_imap
|
||||||
echo -n 'quota sieve acl zlib mail_crypt mail_crypt_acl fts fts_solr notify listescape replication' > /etc/dovecot/mail_plugins_lmtp
|
echo -n 'quota sieve acl zlib mail_crypt mail_crypt_acl fts fts_flatcurve notify listescape replication' > /etc/dovecot/mail_plugins_lmtp
|
||||||
fi
|
fi
|
||||||
chmod 644 /etc/dovecot/mail_plugins /etc/dovecot/mail_plugins_imap /etc/dovecot/mail_plugins_lmtp /templates/quarantine.tpl
|
chmod 644 /etc/dovecot/mail_plugins /etc/dovecot/mail_plugins_imap /etc/dovecot/mail_plugins_lmtp /templates/quarantine.tpl
|
||||||
|
|
||||||
|
sed -i 's/vsz_limit.*/vsz_limit = '${XAPIAN_HEAP}m/g /etc/dovecot/dovecot-fts-flatcurve.conf
|
||||||
|
|
||||||
cat <<EOF > /etc/dovecot/sql/dovecot-dict-sql-userdb.conf
|
cat <<EOF > /etc/dovecot/sql/dovecot-dict-sql-userdb.conf
|
||||||
# Autogenerated by mailcow
|
# Autogenerated by mailcow
|
||||||
driver = mysql
|
driver = mysql
|
||||||
|
@@ -359,21 +359,28 @@ def snat4(snat_target):
|
|||||||
chain = iptc.Chain(table, 'POSTROUTING')
|
chain = iptc.Chain(table, 'POSTROUTING')
|
||||||
table.autocommit = False
|
table.autocommit = False
|
||||||
new_rule = get_snat4_rule()
|
new_rule = get_snat4_rule()
|
||||||
for position, rule in enumerate(chain.rules):
|
|
||||||
match = all((
|
if not chain.rules:
|
||||||
new_rule.get_src() == rule.get_src(),
|
# if there are no rules in the chain, insert the new rule directly
|
||||||
new_rule.get_dst() == rule.get_dst(),
|
logInfo(f'Added POSTROUTING rule for source network {new_rule.src} to SNAT target {snat_target}')
|
||||||
new_rule.target.parameters == rule.target.parameters,
|
chain.insert_rule(new_rule)
|
||||||
new_rule.target.name == rule.target.name
|
else:
|
||||||
))
|
for position, rule in enumerate(chain.rules):
|
||||||
if position == 0:
|
match = all((
|
||||||
if not match:
|
new_rule.get_src() == rule.get_src(),
|
||||||
logInfo(f'Added POSTROUTING rule for source network {new_rule.src} to SNAT target {snat_target}')
|
new_rule.get_dst() == rule.get_dst(),
|
||||||
chain.insert_rule(new_rule)
|
new_rule.target.parameters == rule.target.parameters,
|
||||||
else:
|
new_rule.target.name == rule.target.name
|
||||||
if match:
|
))
|
||||||
logInfo(f'Remove rule for source network {new_rule.src} to SNAT target {snat_target} from POSTROUTING chain at position {position}')
|
if position == 0:
|
||||||
chain.delete_rule(rule)
|
if not match:
|
||||||
|
logInfo(f'Added POSTROUTING rule for source network {new_rule.src} to SNAT target {snat_target}')
|
||||||
|
chain.insert_rule(new_rule)
|
||||||
|
else:
|
||||||
|
if match:
|
||||||
|
logInfo(f'Remove rule for source network {new_rule.src} to SNAT target {snat_target} from POSTROUTING chain at position {position}')
|
||||||
|
chain.delete_rule(rule)
|
||||||
|
|
||||||
table.commit()
|
table.commit()
|
||||||
table.autocommit = True
|
table.autocommit = True
|
||||||
except:
|
except:
|
||||||
|
@@ -12,7 +12,7 @@ ARG MEMCACHED_PECL_VERSION=3.2.0
|
|||||||
# renovate: datasource=github-tags depName=phpredis/phpredis versioning=semver-coerced
|
# renovate: datasource=github-tags depName=phpredis/phpredis versioning=semver-coerced
|
||||||
ARG REDIS_PECL_VERSION=5.3.7
|
ARG REDIS_PECL_VERSION=5.3.7
|
||||||
# renovate: datasource=github-tags depName=composer/composer versioning=semver-coerced
|
# renovate: datasource=github-tags depName=composer/composer versioning=semver-coerced
|
||||||
ARG COMPOSER_VERSION=2.5.1
|
ARG COMPOSER_VERSION=2.5.4
|
||||||
|
|
||||||
RUN apk add -U --no-cache autoconf \
|
RUN apk add -U --no-cache autoconf \
|
||||||
aspell-dev \
|
aspell-dev \
|
||||||
|
23
data/conf/dovecot/dovecot-fts-flatcurve.conf
Normal file
23
data/conf/dovecot/dovecot-fts-flatcurve.conf
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
plugin {
|
||||||
|
fts = flatcurve
|
||||||
|
fts_autoindex = yes
|
||||||
|
|
||||||
|
fts_languages = en de
|
||||||
|
|
||||||
|
fts_tokenizers = generic email-address
|
||||||
|
fts_tokenizer_generic = algorithm=simple
|
||||||
|
# All of these are optional, and indicate the default values.
|
||||||
|
# They are listed here for documentation purposes; most people should
|
||||||
|
# not need to define/override in their config.
|
||||||
|
fts_flatcurve_commit_limit = 500
|
||||||
|
fts_flatcurve_max_term_size = 30
|
||||||
|
fts_flatcurve_min_term_size = 2
|
||||||
|
fts_flatcurve_optimize_limit = 10
|
||||||
|
fts_flatcurve_rotate_size = 5000
|
||||||
|
fts_flatcurve_rotate_time = 5000
|
||||||
|
fts_flatcurve_substring_search = yes
|
||||||
|
}
|
||||||
|
|
||||||
|
service indexer-worker {
|
||||||
|
vsz_limit = 1024m
|
||||||
|
}
|
@@ -11,6 +11,7 @@ auth_mechanisms = plain login
|
|||||||
#mail_debug = yes
|
#mail_debug = yes
|
||||||
#auth_debug = yes
|
#auth_debug = yes
|
||||||
log_path = syslog
|
log_path = syslog
|
||||||
|
log_debug = category=fts-flatcurve
|
||||||
disable_plaintext_auth = yes
|
disable_plaintext_auth = yes
|
||||||
# Uncomment on NFS share
|
# Uncomment on NFS share
|
||||||
#mmap_disable = yes
|
#mmap_disable = yes
|
||||||
@@ -189,9 +190,6 @@ plugin {
|
|||||||
acl_shared_dict = file:/var/vmail/shared-mailboxes.db
|
acl_shared_dict = file:/var/vmail/shared-mailboxes.db
|
||||||
acl = vfile
|
acl = vfile
|
||||||
acl_user = %u
|
acl_user = %u
|
||||||
fts = solr
|
|
||||||
fts_autoindex = yes
|
|
||||||
fts_solr = url=http://solr:8983/solr/dovecot-fts/
|
|
||||||
quota = dict:Userquota::proxy::sqlquota
|
quota = dict:Userquota::proxy::sqlquota
|
||||||
quota_rule2 = Trash:storage=+100%%
|
quota_rule2 = Trash:storage=+100%%
|
||||||
sieve = /var/vmail/sieve/%u.sieve
|
sieve = /var/vmail/sieve/%u.sieve
|
||||||
@@ -242,6 +240,7 @@ plugin {
|
|||||||
mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename
|
mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename
|
||||||
mail_log_fields = uid box msgid size
|
mail_log_fields = uid box msgid size
|
||||||
mail_log_cached_only = yes
|
mail_log_cached_only = yes
|
||||||
|
|
||||||
}
|
}
|
||||||
service quota-warning {
|
service quota-warning {
|
||||||
executable = script /usr/local/bin/quota_notify.py
|
executable = script /usr/local/bin/quota_notify.py
|
||||||
@@ -297,6 +296,7 @@ replication_dsync_parameters = -d -l 30 -U -n INBOX
|
|||||||
!include_try /etc/dovecot/extra.conf
|
!include_try /etc/dovecot/extra.conf
|
||||||
!include_try /etc/dovecot/sogo-sso.conf
|
!include_try /etc/dovecot/sogo-sso.conf
|
||||||
!include_try /etc/dovecot/shared_namespace.conf
|
!include_try /etc/dovecot/shared_namespace.conf
|
||||||
|
!include_try /etc/dovecot/dovecot-fts-flatcurve.conf
|
||||||
# </Includes>
|
# </Includes>
|
||||||
default_client_limit = 10400
|
default_client_limit = 10400
|
||||||
default_vsz_limit = 1024 M
|
default_vsz_limit = 1024 M
|
||||||
|
@@ -699,6 +699,38 @@ paths:
|
|||||||
type: string
|
type: string
|
||||||
type: object
|
type: object
|
||||||
summary: Create Domain Admin user
|
summary: Create Domain Admin user
|
||||||
|
/api/v1/add/sso/domain-admin:
|
||||||
|
post:
|
||||||
|
responses:
|
||||||
|
"401":
|
||||||
|
$ref: "#/components/responses/Unauthorized"
|
||||||
|
"200":
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
examples:
|
||||||
|
response:
|
||||||
|
value:
|
||||||
|
token: "591F6D-5C3DD2-7455CD-DAF1C1-AA4FCC"
|
||||||
|
description: OK
|
||||||
|
headers: { }
|
||||||
|
tags:
|
||||||
|
- Single Sign-On
|
||||||
|
description: >-
|
||||||
|
Using this endpoint you can issue a token for Domain Admin user. This token can be used for
|
||||||
|
autologin Domain Admin user by using query_string var sso_token={token}. Token expiration time is 30s
|
||||||
|
operationId: Issue Domain Admin SSO token
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
example:
|
||||||
|
username: testadmin
|
||||||
|
properties:
|
||||||
|
username:
|
||||||
|
description: the username for the admin user
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
summary: Issue Domain Admin SSO token
|
||||||
/api/v1/edit/da-acl:
|
/api/v1/edit/da-acl:
|
||||||
post:
|
post:
|
||||||
responses:
|
responses:
|
||||||
@@ -5586,6 +5618,8 @@ tags:
|
|||||||
description: Manage DKIM keys
|
description: Manage DKIM keys
|
||||||
- name: Domain admin
|
- name: Domain admin
|
||||||
description: Create or udpdate domain admin users
|
description: Create or udpdate domain admin users
|
||||||
|
- name: Single Sign-On
|
||||||
|
description: Issue tokens for users
|
||||||
- name: Address Rewriting
|
- name: Address Rewriting
|
||||||
description: Create BCC maps or recipient maps
|
description: Create BCC maps or recipient maps
|
||||||
- name: Outgoing TLS Policy Map Overrides
|
- name: Outgoing TLS Policy Map Overrides
|
||||||
|
@@ -78,3 +78,21 @@ table.dataTable>tbody>tr.child span.dtr-title {
|
|||||||
width: 30%;
|
width: 30%;
|
||||||
max-width: 250px;
|
max-width: 250px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
div.dataTables_wrapper div.dataTables_filter {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
div.dataTables_wrapper div.dataTables_length {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.dataTables_paginate, .dataTables_length, .dataTables_filter {
|
||||||
|
margin: 10px 0!important;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.dt-text-right {
|
||||||
|
text-align: end !important;
|
||||||
|
}
|
||||||
|
th.dt-text-right {
|
||||||
|
text-align: end !important;
|
||||||
|
}
|
||||||
|
@@ -370,14 +370,3 @@ button[aria-expanded='true'] > .caret {
|
|||||||
.btn-check:checked+.btn-outline-secondary, .btn-check:active+.btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show {
|
.btn-check:checked+.btn-outline-secondary, .btn-check:active+.btn-outline-secondary, .btn-outline-secondary:active, .btn-outline-secondary.active, .btn-outline-secondary.dropdown-toggle.show {
|
||||||
background-color: #f0f0f0 !important;
|
background-color: #f0f0f0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
div.dataTables_wrapper div.dataTables_filter {
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
div.dataTables_wrapper div.dataTables_length {
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
.dataTables_paginate, .dataTables_length, .dataTables_filter {
|
|
||||||
margin: 10px 0!important;
|
|
||||||
}
|
|
@@ -203,6 +203,9 @@
|
|||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.senders-mw220 {
|
||||||
|
max-width: 100% !important;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 350px) {
|
@media (max-width: 350px) {
|
||||||
|
@@ -99,4 +99,6 @@ table tbody tr td input[type="checkbox"] {
|
|||||||
font-size:110%;
|
font-size:110%;
|
||||||
margin:20px;
|
margin:20px;
|
||||||
}
|
}
|
||||||
|
.senders-mw220 {
|
||||||
|
max-width: 220px;
|
||||||
|
}
|
||||||
|
@@ -405,3 +405,64 @@ function domain_admin($_action, $_data = null) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function domain_admin_sso($_action, $_data) {
|
||||||
|
global $pdo;
|
||||||
|
|
||||||
|
switch ($_action) {
|
||||||
|
case 'check':
|
||||||
|
$token = $_data;
|
||||||
|
|
||||||
|
$stmt = $pdo->prepare("SELECT `t1`.`username` FROM `da_sso` AS `t1` JOIN `admin` AS `t2` ON `t1`.`username` = `t2`.`username` WHERE `t1`.`token` = :token AND `t1`.`created` > DATE_SUB(NOW(), INTERVAL '30' SECOND) AND `t2`.`active` = 1 AND `t2`.`superadmin` = 0;");
|
||||||
|
$stmt->execute(array(
|
||||||
|
':token' => preg_replace('/[^a-zA-Z0-9-]/', '', $token)
|
||||||
|
));
|
||||||
|
$return = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
return empty($return['username']) ? false : $return['username'];
|
||||||
|
case 'issue':
|
||||||
|
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
|
'msg' => 'access_denied'
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$username = $_data['username'];
|
||||||
|
|
||||||
|
$stmt = $pdo->prepare("SELECT `username` FROM `domain_admins`
|
||||||
|
WHERE `username` = :username");
|
||||||
|
$stmt->execute(array(':username' => $username));
|
||||||
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
|
|
||||||
|
if ($num_results < 1) {
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__, $_action, $_data),
|
||||||
|
'msg' => array('object_doesnt_exist', htmlspecialchars($username))
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$token = implode('-', array(
|
||||||
|
strtoupper(bin2hex(random_bytes(3))),
|
||||||
|
strtoupper(bin2hex(random_bytes(3))),
|
||||||
|
strtoupper(bin2hex(random_bytes(3))),
|
||||||
|
strtoupper(bin2hex(random_bytes(3))),
|
||||||
|
strtoupper(bin2hex(random_bytes(3)))
|
||||||
|
));
|
||||||
|
|
||||||
|
$stmt = $pdo->prepare("INSERT INTO `da_sso` (`username`, `token`)
|
||||||
|
VALUES (:username, :token)");
|
||||||
|
$stmt->execute(array(
|
||||||
|
':username' => $username,
|
||||||
|
':token' => $token
|
||||||
|
));
|
||||||
|
|
||||||
|
// perform cleanup
|
||||||
|
$pdo->query("DELETE FROM `da_sso` WHERE created < DATE_SUB(NOW(), INTERVAL '30' SECOND);");
|
||||||
|
|
||||||
|
return ['token' => $token];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -1739,7 +1739,7 @@ function verify_tfa_login($username, $_data) {
|
|||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
'msg' => array('webauthn_verification_failed', 'authenticator not found')
|
'msg' => array('webauthn_authenticator_failed')
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1748,11 +1748,20 @@ function verify_tfa_login($username, $_data) {
|
|||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
'msg' => array('webauthn_verification_failed', 'publicKey not found')
|
'msg' => array('webauthn_publickey_failed')
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($process_webauthn['username'] != $_SESSION['pending_mailcow_cc_username']){
|
||||||
|
$_SESSION['return'][] = array(
|
||||||
|
'type' => 'danger',
|
||||||
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
|
'msg' => array('webauthn_username_failed')
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$WebAuthn->processGet($clientDataJSON, $authenticatorData, $signature, $process_webauthn['publicKey'], $challenge, null, $GLOBALS['WEBAUTHN_UV_FLAG_LOGIN'], $GLOBALS['WEBAUTHN_USER_PRESENT_FLAG']);
|
$WebAuthn->processGet($clientDataJSON, $authenticatorData, $signature, $process_webauthn['publicKey'], $challenge, null, $GLOBALS['WEBAUTHN_UV_FLAG_LOGIN'], $GLOBALS['WEBAUTHN_USER_PRESENT_FLAG']);
|
||||||
}
|
}
|
||||||
@@ -1784,21 +1793,12 @@ function verify_tfa_login($username, $_data) {
|
|||||||
$_SESSION['return'][] = array(
|
$_SESSION['return'][] = array(
|
||||||
'type' => 'danger',
|
'type' => 'danger',
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
'log' => array(__FUNCTION__, $username, '*'),
|
||||||
'msg' => array('webauthn_verification_failed', 'could not determine user role')
|
'msg' => array('webauthn_role_failed')
|
||||||
);
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($process_webauthn['username'] != $_SESSION['pending_mailcow_cc_username']){
|
|
||||||
$_SESSION['return'][] = array(
|
|
||||||
'type' => 'danger',
|
|
||||||
'log' => array(__FUNCTION__, $username, '*'),
|
|
||||||
'msg' => array('webauthn_verification_failed', 'user who requests does not match with sql entry')
|
|
||||||
);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$_SESSION["mailcow_cc_username"] = $process_webauthn['username'];
|
$_SESSION["mailcow_cc_username"] = $process_webauthn['username'];
|
||||||
$_SESSION['tfa_id'] = $process_webauthn['id'];
|
$_SESSION['tfa_id'] = $process_webauthn['id'];
|
||||||
$_SESSION['authReq'] = null;
|
$_SESSION['authReq'] = null;
|
||||||
|
@@ -5264,7 +5264,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ($_action != 'get' && in_array($_type, array('domain', 'alias', 'alias_domain', 'mailbox', 'resource'))) {
|
if ($_action != 'get' && in_array($_type, array('domain', 'alias', 'alias_domain', 'mailbox', 'resource')) && getenv('SKIP_SOGO') != "y") {
|
||||||
update_sogo_static_view();
|
update_sogo_static_view();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,7 +3,7 @@ function init_db_schema() {
|
|||||||
try {
|
try {
|
||||||
global $pdo;
|
global $pdo;
|
||||||
|
|
||||||
$db_version = "23122022_1445";
|
$db_version = "14022023_1000";
|
||||||
|
|
||||||
$stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
|
$stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
|
||||||
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
@@ -664,6 +664,19 @@ function init_db_schema() {
|
|||||||
),
|
),
|
||||||
"attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC"
|
"attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC"
|
||||||
),
|
),
|
||||||
|
"da_sso" => array(
|
||||||
|
"cols" => array(
|
||||||
|
"username" => "VARCHAR(255) NOT NULL",
|
||||||
|
"token" => "VARCHAR(255) NOT NULL",
|
||||||
|
"created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)",
|
||||||
|
),
|
||||||
|
"keys" => array(
|
||||||
|
"primary" => array(
|
||||||
|
"" => array("token", "created")
|
||||||
|
),
|
||||||
|
),
|
||||||
|
"attr" => "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC"
|
||||||
|
),
|
||||||
"imapsync" => array(
|
"imapsync" => array(
|
||||||
"cols" => array(
|
"cols" => array(
|
||||||
"id" => "INT NOT NULL AUTO_INCREMENT",
|
"id" => "INT NOT NULL AUTO_INCREMENT",
|
||||||
@@ -1083,7 +1096,7 @@ function init_db_schema() {
|
|||||||
$stmt = $pdo->query("SHOW TABLES LIKE '" . $table . "'");
|
$stmt = $pdo->query("SHOW TABLES LIKE '" . $table . "'");
|
||||||
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
if ($num_results != 0) {
|
if ($num_results != 0) {
|
||||||
$stmt = $pdo->prepare("SELECT CONCAT('ALTER TABLE ', `table_schema`, '.', `table_name`, ' DROP FOREIGN KEY ', `constraint_name`, ';') AS `FKEY_DROP` FROM `information_schema`.`table_constraints`
|
$stmt = $pdo->prepare("SELECT CONCAT('ALTER TABLE `', `table_schema`, '`.', `table_name`, ' DROP FOREIGN KEY ', `constraint_name`, ';') AS `FKEY_DROP` FROM `information_schema`.`table_constraints`
|
||||||
WHERE `constraint_type` = 'FOREIGN KEY' AND `table_name` = :table;");
|
WHERE `constraint_type` = 'FOREIGN KEY' AND `table_name` = :table;");
|
||||||
$stmt->execute(array(':table' => $table));
|
$stmt->execute(array(':table' => $table));
|
||||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
@@ -1,4 +1,15 @@
|
|||||||
<?php
|
<?php
|
||||||
|
// SSO Domain Admin
|
||||||
|
if (!empty($_GET['sso_token'])) {
|
||||||
|
$username = domain_admin_sso('check', $_GET['sso_token']);
|
||||||
|
|
||||||
|
if ($username !== false) {
|
||||||
|
$_SESSION['mailcow_cc_username'] = $username;
|
||||||
|
$_SESSION['mailcow_cc_role'] = 'domainadmin';
|
||||||
|
header('Location: /mailbox');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (isset($_POST["verify_tfa_login"])) {
|
if (isset($_POST["verify_tfa_login"])) {
|
||||||
if (verify_tfa_login($_SESSION['pending_mailcow_cc_username'], $_POST)) {
|
if (verify_tfa_login($_SESSION['pending_mailcow_cc_username'], $_POST)) {
|
||||||
$_SESSION['mailcow_cc_username'] = $_SESSION['pending_mailcow_cc_username'];
|
$_SESSION['mailcow_cc_username'] = $_SESSION['pending_mailcow_cc_username'];
|
||||||
|
@@ -124,7 +124,7 @@ $MAILCOW_APPS = array(
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Rows until pagination begins
|
// Rows until pagination begins
|
||||||
$PAGINATION_SIZE = 20;
|
$PAGINATION_SIZE = 25;
|
||||||
|
|
||||||
// Default number of rows/lines to display (log table)
|
// Default number of rows/lines to display (log table)
|
||||||
$LOG_LINES = 1000;
|
$LOG_LINES = 1000;
|
||||||
|
@@ -47,9 +47,9 @@ jQuery(function($){
|
|||||||
$('button[data-id="' + regex_map_id + '"]').attr({"disabled": false});
|
$('button[data-id="' + regex_map_id + '"]').attr({"disabled": false});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
$('.textarea-code').on('keyup', function() {
|
$('.textarea-code').on('keyup', function() {
|
||||||
$('.submit_rspamd_regex').attr({"disabled": true});
|
$('.submit_rspamd_regex').attr({"disabled": true});
|
||||||
});
|
});
|
||||||
$("#show_rspamd_global_filters").click(function() {
|
$("#show_rspamd_global_filters").click(function() {
|
||||||
$.get("inc/ajax/show_rspamd_global_filters.php");
|
$.get("inc/ajax/show_rspamd_global_filters.php");
|
||||||
$("#confirm_show_rspamd_global_filters").hide();
|
$("#confirm_show_rspamd_global_filters").hide();
|
||||||
@@ -70,10 +70,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$('#domainadminstable').DataTable({
|
$('#domainadminstable').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -86,55 +87,55 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
// placeholder, so checkbox will not block child row toggle
|
// placeholder, so checkbox will not block child row toggle
|
||||||
title: '',
|
title: '',
|
||||||
data: null,
|
data: null,
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '',
|
title: '',
|
||||||
data: 'chkbox',
|
data: 'chkbox',
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.username,
|
title: lang.username,
|
||||||
data: 'username',
|
data: 'username',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.admin_domains,
|
title: lang.admin_domains,
|
||||||
data: 'selected_domains',
|
data: 'selected_domains',
|
||||||
defaultContent: '',
|
defaultContent: '',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "TFA",
|
title: "TFA",
|
||||||
data: 'tfa_active',
|
data: 'tfa_active',
|
||||||
defaultContent: '',
|
defaultContent: '',
|
||||||
render: function (data, type) {
|
render: function (data, type) {
|
||||||
if(data == 1) return '<i class="bi bi-check-lg"></i>';
|
if(data == 1) return '<i class="bi bi-check-lg"></i>';
|
||||||
else return '<i class="bi bi-x-lg"></i>'
|
else return '<i class="bi bi-x-lg"></i>';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.active,
|
title: lang.active,
|
||||||
data: 'active',
|
data: 'active',
|
||||||
defaultContent: '',
|
defaultContent: '',
|
||||||
render: function (data, type) {
|
render: function (data, type) {
|
||||||
if(data == 1) return '<i class="bi bi-check-lg"></i>';
|
if(data == 1) return '<i class="bi bi-check-lg"></i>';
|
||||||
else return '<i class="bi bi-x-lg"></i>'
|
else return '<i class="bi bi-x-lg"></i>';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.action,
|
title: lang.action,
|
||||||
data: 'action',
|
data: 'action',
|
||||||
className: 'text-md-end dt-sm-head-hidden dt-body-right',
|
className: 'dt-sm-head-hidden dt-text-right',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
initComplete: function(settings, json){
|
initComplete: function(settings, json){
|
||||||
}
|
}
|
||||||
@@ -148,10 +149,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$('#oauth2clientstable').DataTable({
|
$('#oauth2clientstable').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -164,47 +166,47 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
// placeholder, so checkbox will not block child row toggle
|
// placeholder, so checkbox will not block child row toggle
|
||||||
title: '',
|
title: '',
|
||||||
data: null,
|
data: null,
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '',
|
title: '',
|
||||||
data: 'chkbox',
|
data: 'chkbox',
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'ID',
|
title: 'ID',
|
||||||
data: 'id',
|
data: 'id',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.oauth2_client_id,
|
title: lang.oauth2_client_id,
|
||||||
data: 'client_id',
|
data: 'client_id',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.oauth2_client_secret,
|
title: lang.oauth2_client_secret,
|
||||||
data: 'client_secret',
|
data: 'client_secret',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.oauth2_redirect_uri,
|
title: lang.oauth2_redirect_uri,
|
||||||
data: 'redirect_uri',
|
data: 'redirect_uri',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.action,
|
title: lang.action,
|
||||||
data: 'action',
|
data: 'action',
|
||||||
className: 'text-md-end dt-sm-head-hidden dt-body-right',
|
className: 'dt-sm-head-hidden dt-text-right',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -216,10 +218,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$('#adminstable').DataTable({
|
$('#adminstable').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -232,50 +235,50 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
// placeholder, so checkbox will not block child row toggle
|
// placeholder, so checkbox will not block child row toggle
|
||||||
title: '',
|
title: '',
|
||||||
data: null,
|
data: null,
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '',
|
title: '',
|
||||||
data: 'chkbox',
|
data: 'chkbox',
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.username,
|
title: lang.username,
|
||||||
data: 'username',
|
data: 'username',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: "TFA",
|
title: "TFA",
|
||||||
data: 'tfa_active',
|
data: 'tfa_active',
|
||||||
defaultContent: '',
|
defaultContent: '',
|
||||||
render: function (data, type) {
|
render: function (data, type) {
|
||||||
if(data == 1) return '<i class="bi bi-check-lg"></i>';
|
if(data == 1) return '<i class="bi bi-check-lg"></i>';
|
||||||
else return '<i class="bi bi-x-lg"></i>'
|
else return '<i class="bi bi-x-lg"></i>';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.active,
|
title: lang.active,
|
||||||
data: 'active',
|
data: 'active',
|
||||||
defaultContent: '',
|
defaultContent: '',
|
||||||
render: function (data, type) {
|
render: function (data, type) {
|
||||||
if(data == 1) return '<i class="bi bi-check-lg"></i>';
|
if(data == 1) return '<i class="bi bi-check-lg"></i>';
|
||||||
else return '<i class="bi bi-x-lg"></i>'
|
else return '<i class="bi bi-x-lg"></i>';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.action,
|
title: lang.action,
|
||||||
data: 'action',
|
data: 'action',
|
||||||
defaultContent: '',
|
defaultContent: '',
|
||||||
className: 'text-md-end dt-sm-head-hidden dt-body-right'
|
className: 'dt-sm-head-hidden dt-text-right'
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -287,10 +290,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$('#forwardinghoststable').DataTable({
|
$('#forwardinghoststable').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -303,45 +307,45 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
// placeholder, so checkbox will not block child row toggle
|
// placeholder, so checkbox will not block child row toggle
|
||||||
title: '',
|
title: '',
|
||||||
data: null,
|
data: null,
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '',
|
title: '',
|
||||||
data: 'chkbox',
|
data: 'chkbox',
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.host,
|
title: lang.host,
|
||||||
data: 'host',
|
data: 'host',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.source,
|
title: lang.source,
|
||||||
data: 'source',
|
data: 'source',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.spamfilter,
|
title: lang.spamfilter,
|
||||||
data: 'keep_spam',
|
data: 'keep_spam',
|
||||||
defaultContent: '',
|
defaultContent: '',
|
||||||
render: function(data, type){
|
render: function(data, type){
|
||||||
return 'yes'==data?'<i class="bi bi-x-lg"></i>':'no'==data&&'<i class="bi bi-check-lg"></i>';
|
return 'yes'==data?'<i class="bi bi-x-lg"></i>':'no'==data&&'<i class="bi bi-check-lg"></i>';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.action,
|
title: lang.action,
|
||||||
data: 'action',
|
data: 'action',
|
||||||
className: 'text-md-end dt-sm-head-hidden dt-body-right',
|
className: 'dt-sm-head-hidden dt-text-right',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -353,10 +357,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$('#relayhoststable').DataTable({
|
$('#relayhoststable').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -369,56 +374,56 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
// placeholder, so checkbox will not block child row toggle
|
// placeholder, so checkbox will not block child row toggle
|
||||||
title: '',
|
title: '',
|
||||||
data: null,
|
data: null,
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '',
|
title: '',
|
||||||
data: 'chkbox',
|
data: 'chkbox',
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'ID',
|
title: 'ID',
|
||||||
data: 'id',
|
data: 'id',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.host,
|
title: lang.host,
|
||||||
data: 'hostname',
|
data: 'hostname',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.username,
|
title: lang.username,
|
||||||
data: 'username',
|
data: 'username',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.in_use_by,
|
title: lang.in_use_by,
|
||||||
data: 'in_use_by',
|
data: 'in_use_by',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.active,
|
title: lang.active,
|
||||||
data: 'active',
|
data: 'active',
|
||||||
defaultContent: '',
|
defaultContent: '',
|
||||||
render: function (data, type) {
|
render: function (data, type) {
|
||||||
if(data == 1) return '<i class="bi bi-check-lg"></i>';
|
if(data == 1) return '<i class="bi bi-check-lg"></i>';
|
||||||
else return '<i class="bi bi-x-lg"></i>'
|
else return '<i class="bi bi-x-lg"></i>';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.action,
|
title: lang.action,
|
||||||
data: 'action',
|
data: 'action',
|
||||||
className: 'text-md-end dt-sm-head-hidden dt-body-right',
|
className: 'dt-sm-head-hidden dt-text-right',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -430,10 +435,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$('#transportstable').DataTable({
|
$('#transportstable').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -446,56 +452,56 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
// placeholder, so checkbox will not block child row toggle
|
// placeholder, so checkbox will not block child row toggle
|
||||||
title: '',
|
title: '',
|
||||||
data: null,
|
data: null,
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '',
|
title: '',
|
||||||
data: 'chkbox',
|
data: 'chkbox',
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'ID',
|
title: 'ID',
|
||||||
data: 'id',
|
data: 'id',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.destination,
|
title: lang.destination,
|
||||||
data: 'destination',
|
data: 'destination',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.nexthop,
|
title: lang.nexthop,
|
||||||
data: 'nexthop',
|
data: 'nexthop',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.username,
|
title: lang.username,
|
||||||
data: 'username',
|
data: 'username',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.active,
|
title: lang.active,
|
||||||
data: 'active',
|
data: 'active',
|
||||||
defaultContent: '',
|
defaultContent: '',
|
||||||
render: function (data, type) {
|
render: function (data, type) {
|
||||||
if(data == 1) return '<i class="bi bi-check-lg"></i>';
|
if(data == 1) return '<i class="bi bi-check-lg"></i>';
|
||||||
else return '<i class="bi bi-x-lg"></i>'
|
else return '<i class="bi bi-x-lg"></i>';
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.action,
|
title: lang.action,
|
||||||
data: 'action',
|
data: 'action',
|
||||||
className: 'text-md-end dt-sm-head-hidden dt-body-right',
|
className: 'dt-sm-head-hidden dt-text-right',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -645,15 +651,15 @@ jQuery(function($){
|
|||||||
$(this).prop("disabled",true);
|
$(this).prop("disabled",true);
|
||||||
$(this).html('<i class="bi bi-arrow-repeat icon-spin"></i> ');
|
$(this).html('<i class="bi bi-arrow-repeat icon-spin"></i> ');
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: 'GET',
|
type: 'GET',
|
||||||
url: 'inc/ajax/relay_check.php',
|
url: 'inc/ajax/relay_check.php',
|
||||||
dataType: 'text',
|
dataType: 'text',
|
||||||
data: $('#test_relayhost_form').serialize(),
|
data: $('#test_relayhost_form').serialize(),
|
||||||
complete: function (data) {
|
complete: function (data) {
|
||||||
$('#test_relayhost_result').html(data.responseText);
|
$('#test_relayhost_result').html(data.responseText);
|
||||||
$('#test_relayhost').prop("disabled",false);
|
$('#test_relayhost').prop("disabled",false);
|
||||||
$('#test_relayhost').text(prev);
|
$('#test_relayhost').text(prev);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
// Transport
|
// Transport
|
||||||
@@ -671,15 +677,15 @@ jQuery(function($){
|
|||||||
$(this).prop("disabled",true);
|
$(this).prop("disabled",true);
|
||||||
$(this).html('<div class="spinner-border" role="status"><span class="visually-hidden">Loading...</span></div> ');
|
$(this).html('<div class="spinner-border" role="status"><span class="visually-hidden">Loading...</span></div> ');
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: 'GET',
|
type: 'GET',
|
||||||
url: 'inc/ajax/transport_check.php',
|
url: 'inc/ajax/transport_check.php',
|
||||||
dataType: 'text',
|
dataType: 'text',
|
||||||
data: $('#test_transport_form').serialize(),
|
data: $('#test_transport_form').serialize(),
|
||||||
complete: function (data) {
|
complete: function (data) {
|
||||||
$('#test_transport_result').html(data.responseText);
|
$('#test_transport_result').html(data.responseText);
|
||||||
$('#test_transport').prop("disabled",false);
|
$('#test_transport').prop("disabled",false);
|
||||||
$('#test_transport').text(prev);
|
$('#test_transport').text(prev);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
// DKIM private key modal
|
// DKIM private key modal
|
||||||
@@ -723,9 +729,9 @@ jQuery(function($){
|
|||||||
$(this).parents('tr').remove();
|
$(this).parents('tr').remove();
|
||||||
});
|
});
|
||||||
$('#add_app_link_row').click(function() {
|
$('#add_app_link_row').click(function() {
|
||||||
add_table_row($('#app_link_table'), "app_link");
|
add_table_row($('#app_link_table'), "app_link");
|
||||||
});
|
});
|
||||||
$('#add_f2b_regex_row').click(function() {
|
$('#add_f2b_regex_row').click(function() {
|
||||||
add_table_row($('#f2b_regex_table'), "f2b_regex");
|
add_table_row($('#f2b_regex_table'), "f2b_regex");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -34,7 +34,7 @@ $(document).ready(function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// set update loop container list
|
// set update loop container list
|
||||||
containersToUpdate = {}
|
containersToUpdate = {};
|
||||||
// set default ChartJs Font Color
|
// set default ChartJs Font Color
|
||||||
Chart.defaults.color = '#999';
|
Chart.defaults.color = '#999';
|
||||||
// create host cpu and mem charts
|
// create host cpu and mem charts
|
||||||
@@ -44,8 +44,7 @@ $(document).ready(function() {
|
|||||||
check_update(mailcow_info.version_tag, mailcow_info.project_url);
|
check_update(mailcow_info.version_tag, mailcow_info.project_url);
|
||||||
}
|
}
|
||||||
$("#maiclow_version").click(function(){
|
$("#maiclow_version").click(function(){
|
||||||
if (mailcow_cc_role !== "admin" && mailcow_cc_role !== "domainadmin" ||
|
if (mailcow_cc_role !== "admin" && mailcow_cc_role !== "domainadmin" || mailcow_info.branch !== "master")
|
||||||
mailcow_info.branch !== "master")
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
showVersionModal("Version " + mailcow_info.version_tag, mailcow_info.version_tag);
|
showVersionModal("Version " + mailcow_info.version_tag, mailcow_info.version_tag);
|
||||||
@@ -119,10 +118,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var table = $('#autodiscover_log').DataTable({
|
var table = $('#autodiscover_log').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: log_pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -188,10 +188,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var table = $('#postfix_log').DataTable({
|
var table = $('#postfix_log').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: log_pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -242,10 +243,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var table = $('#watchdog_log').DataTable({
|
var table = $('#watchdog_log').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: log_pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -300,10 +302,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var table = $('#api_log').DataTable({
|
var table = $('#api_log').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: log_pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -365,10 +368,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var table = $('#rl_log').DataTable({
|
var table = $('#rl_log').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: log_pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -468,10 +472,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var table = $('#ui_logs').DataTable({
|
var table = $('#ui_logs').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: log_pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -551,10 +556,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var table = $('#sasl_logs').DataTable({
|
var table = $('#sasl_logs').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: log_pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -611,10 +617,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var table = $('#acme_log').DataTable({
|
var table = $('#acme_log').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: log_pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -660,10 +667,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var table = $('#netfilter_log').DataTable({
|
var table = $('#netfilter_log').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: log_pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -714,10 +722,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var table = $('#sogo_log').DataTable({
|
var table = $('#sogo_log').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: log_pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -768,10 +777,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var table = $('#dovecot_log').DataTable({
|
var table = $('#dovecot_log').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: log_pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -883,10 +893,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
var table = $('#rspamd_history').DataTable({
|
var table = $('#rspamd_history').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: log_pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -998,31 +1009,31 @@ jQuery(function($){
|
|||||||
item.rcpt = escapeHtml(item.rcpt_smtp.join(", "));
|
item.rcpt = escapeHtml(item.rcpt_smtp.join(", "));
|
||||||
}
|
}
|
||||||
item.symbols = Object.keys(item.symbols).sort(function (a, b) {
|
item.symbols = Object.keys(item.symbols).sort(function (a, b) {
|
||||||
if (item.symbols[a].score === 0) return 1
|
if (item.symbols[a].score === 0) return 1;
|
||||||
if (item.symbols[b].score === 0) return -1
|
if (item.symbols[b].score === 0) return -1;
|
||||||
if (item.symbols[b].score < 0 && item.symbols[a].score < 0) {
|
if (item.symbols[b].score < 0 && item.symbols[a].score < 0) {
|
||||||
return item.symbols[a].score - item.symbols[b].score
|
return item.symbols[a].score - item.symbols[b].score;
|
||||||
}
|
}
|
||||||
if (item.symbols[b].score > 0 && item.symbols[a].score > 0) {
|
if (item.symbols[b].score > 0 && item.symbols[a].score > 0) {
|
||||||
return item.symbols[b].score - item.symbols[a].score
|
return item.symbols[b].score - item.symbols[a].score;
|
||||||
}
|
}
|
||||||
return item.symbols[b].score - item.symbols[a].score
|
return item.symbols[b].score - item.symbols[a].score;
|
||||||
}).map(function(key) {
|
}).map(function(key) {
|
||||||
var sym = item.symbols[key];
|
var sym = item.symbols[key];
|
||||||
if (sym.score < 0) {
|
if (sym.score < 0) {
|
||||||
sym.score_formatted = '(<span class="text-success"><b>' + sym.score + '</b></span>)'
|
sym.score_formatted = '(<span class="text-success"><b>' + sym.score + '</b></span>)';
|
||||||
}
|
}
|
||||||
else if (sym.score === 0) {
|
else if (sym.score === 0) {
|
||||||
sym.score_formatted = '(<span><b>' + sym.score + '</b></span>)'
|
sym.score_formatted = '(<span><b>' + sym.score + '</b></span>)';
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sym.score_formatted = '(<span class="text-danger"><b>' + sym.score + '</b></span>)'
|
sym.score_formatted = '(<span class="text-danger"><b>' + sym.score + '</b></span>)';
|
||||||
}
|
}
|
||||||
var str = '<strong>' + key + '</strong> ' + sym.score_formatted;
|
var str = '<strong>' + key + '</strong> ' + sym.score_formatted;
|
||||||
if (sym.options) {
|
if (sym.options) {
|
||||||
str += ' [' + escapeHtml(sym.options.join(", ")) + "]";
|
str += ' [' + escapeHtml(sym.options.join(", ")) + "]";
|
||||||
}
|
}
|
||||||
return str
|
return str;
|
||||||
}).join('<br>\n');
|
}).join('<br>\n');
|
||||||
item.subject = escapeHtml(item.subject);
|
item.subject = escapeHtml(item.subject);
|
||||||
var scan_time = item.time_real.toFixed(3);
|
var scan_time = item.time_real.toFixed(3);
|
||||||
@@ -1155,14 +1166,14 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return data
|
return data;
|
||||||
};
|
};
|
||||||
$('.add_log_lines').on('click', function (e) {
|
$('.add_log_lines').on('click', function (e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
var log_table= $(this).data("table")
|
var log_table= $(this).data("table");
|
||||||
var new_nrows = $(this).data("nrows")
|
var new_nrows = $(this).data("nrows");
|
||||||
var post_process = $(this).data("post-process")
|
var post_process = $(this).data("post-process");
|
||||||
var log_url = $(this).data("log-url")
|
var log_url = $(this).data("log-url");
|
||||||
if (log_table === undefined || new_nrows === undefined || post_process === undefined || log_url === undefined) {
|
if (log_table === undefined || new_nrows === undefined || post_process === undefined || log_url === undefined) {
|
||||||
console.log("no data-table or data-nrows or log_url or data-post-process attr found");
|
console.log("no data-table or data-nrows or log_url or data-post-process attr found");
|
||||||
return;
|
return;
|
||||||
@@ -1220,7 +1231,6 @@ jQuery(function($){
|
|||||||
onVisible("[id^=rspamd_donut]", () => rspamd_pie_graph());
|
onVisible("[id^=rspamd_donut]", () => rspamd_pie_graph());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// start polling host stats if tab is active
|
// start polling host stats if tab is active
|
||||||
onVisible("[id^=tab-containers]", () => update_stats());
|
onVisible("[id^=tab-containers]", () => update_stats());
|
||||||
// start polling container stats if collapse is active
|
// start polling container stats if collapse is active
|
||||||
@@ -1303,9 +1313,9 @@ function update_stats(timeout=5){
|
|||||||
if (mem_chart.data.labels.length > 30) mem_chart.data.labels.shift();
|
if (mem_chart.data.labels.length > 30) mem_chart.data.labels.shift();
|
||||||
|
|
||||||
cpu_chart.data.datasets[0].data.push(data.cpu.usage);
|
cpu_chart.data.datasets[0].data.push(data.cpu.usage);
|
||||||
if (cpu_chart.data.datasets[0].data.length > 30) cpu_chart.data.datasets[0].data.shift();
|
if (cpu_chart.data.datasets[0].data.length > 30) cpu_chart.data.datasets[0].data.shift();
|
||||||
mem_chart.data.datasets[0].data.push(data.memory.usage);
|
mem_chart.data.datasets[0].data.push(data.memory.usage);
|
||||||
if (mem_chart.data.datasets[0].data.length > 30) mem_chart.data.datasets[0].data.shift();
|
if (mem_chart.data.datasets[0].data.length > 30) mem_chart.data.datasets[0].data.shift();
|
||||||
|
|
||||||
cpu_chart.update();
|
cpu_chart.update();
|
||||||
mem_chart.update();
|
mem_chart.update();
|
||||||
@@ -1464,23 +1474,23 @@ function createReadWriteChart(chart_id, read_lable, write_lable){
|
|||||||
};
|
};
|
||||||
var optionsNet = {
|
var optionsNet = {
|
||||||
interaction: {
|
interaction: {
|
||||||
mode: 'index'
|
mode: 'index'
|
||||||
},
|
},
|
||||||
scales: {
|
scales: {
|
||||||
yAxis: {
|
yAxis: {
|
||||||
min: 0,
|
min: 0,
|
||||||
grid: {
|
grid: {
|
||||||
display: false
|
display: false
|
||||||
},
|
},
|
||||||
ticks: {
|
ticks: {
|
||||||
callback: function(i, index, ticks) {
|
callback: function(i, index, ticks) {
|
||||||
return formatBytes(i);
|
return formatBytes(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
xAxis: {
|
xAxis: {
|
||||||
grid: {
|
grid: {
|
||||||
display: false
|
display: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1528,13 +1538,13 @@ function createHostCpuAndMemChart(){
|
|||||||
};
|
};
|
||||||
var optionsCpu = {
|
var optionsCpu = {
|
||||||
interaction: {
|
interaction: {
|
||||||
mode: 'index'
|
mode: 'index'
|
||||||
},
|
},
|
||||||
scales: {
|
scales: {
|
||||||
yAxis: {
|
yAxis: {
|
||||||
min: 0,
|
min: 0,
|
||||||
grid: {
|
grid: {
|
||||||
display: false
|
display: false
|
||||||
},
|
},
|
||||||
ticks: {
|
ticks: {
|
||||||
callback: function(i, index, ticks) {
|
callback: function(i, index, ticks) {
|
||||||
@@ -1544,7 +1554,7 @@ function createHostCpuAndMemChart(){
|
|||||||
},
|
},
|
||||||
xAxis: {
|
xAxis: {
|
||||||
grid: {
|
grid: {
|
||||||
display: false
|
display: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1566,13 +1576,13 @@ function createHostCpuAndMemChart(){
|
|||||||
};
|
};
|
||||||
var optionsMem = {
|
var optionsMem = {
|
||||||
interaction: {
|
interaction: {
|
||||||
mode: 'index'
|
mode: 'index'
|
||||||
},
|
},
|
||||||
scales: {
|
scales: {
|
||||||
yAxis: {
|
yAxis: {
|
||||||
min: 0,
|
min: 0,
|
||||||
grid: {
|
grid: {
|
||||||
display: false
|
display: false
|
||||||
},
|
},
|
||||||
ticks: {
|
ticks: {
|
||||||
callback: function(i, index, ticks) {
|
callback: function(i, index, ticks) {
|
||||||
@@ -1582,7 +1592,7 @@ function createHostCpuAndMemChart(){
|
|||||||
},
|
},
|
||||||
xAxis: {
|
xAxis: {
|
||||||
grid: {
|
grid: {
|
||||||
display: false
|
display: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1678,22 +1688,22 @@ function parseGithubMarkdownLinks(inputText) {
|
|||||||
|
|
||||||
replacePattern1 = /(\b(https?):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim;
|
replacePattern1 = /(\b(https?):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim;
|
||||||
replacedText = inputText.replace(replacePattern1, (matched, index, original, input_string) => {
|
replacedText = inputText.replace(replacePattern1, (matched, index, original, input_string) => {
|
||||||
if (matched.includes('github.com')){
|
if (matched.includes('github.com')){
|
||||||
// return short link if it's github link
|
// return short link if it's github link
|
||||||
last_uri_path = matched.split('/');
|
last_uri_path = matched.split('/');
|
||||||
last_uri_path = last_uri_path[last_uri_path.length - 1];
|
last_uri_path = last_uri_path[last_uri_path.length - 1];
|
||||||
|
|
||||||
// adjust Full Changelog link to match last git version and new git version, if link is a compare link
|
// adjust Full Changelog link to match last git version and new git version, if link is a compare link
|
||||||
if (matched.includes('/compare/') && mailcow_info.last_version_tag !== ''){
|
if (matched.includes('/compare/') && mailcow_info.last_version_tag !== ''){
|
||||||
matched = matched.replace(last_uri_path, mailcow_info.last_version_tag + '...' + mailcow_info.version_tag);
|
matched = matched.replace(last_uri_path, mailcow_info.last_version_tag + '...' + mailcow_info.version_tag);
|
||||||
last_uri_path = mailcow_info.last_version_tag + '...' + mailcow_info.version_tag;
|
last_uri_path = mailcow_info.last_version_tag + '...' + mailcow_info.version_tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
return '<a href="' + matched + '" target="_blank">' + last_uri_path + '</a><br>';
|
return '<a href="' + matched + '" target="_blank">' + last_uri_path + '</a><br>';
|
||||||
};
|
};
|
||||||
|
|
||||||
// if it's not a github link, return complete link
|
// if it's not a github link, return complete link
|
||||||
return '<a href="' + matched + '" target="_blank">' + matched + '</a>';
|
return '<a href="' + matched + '" target="_blank">' + matched + '</a>';
|
||||||
});
|
});
|
||||||
|
|
||||||
return replacedText;
|
return replacedText;
|
||||||
|
@@ -2,7 +2,7 @@ $(document).ready(function() {
|
|||||||
$(".arrow-toggle").on('click', function(e) { e.preventDefault(); $(this).find('.arrow').toggleClass("animation"); });
|
$(".arrow-toggle").on('click', function(e) { e.preventDefault(); $(this).find('.arrow').toggleClass("animation"); });
|
||||||
$("#pushover_delete").click(function() { return confirm(lang.delete_ays); });
|
$("#pushover_delete").click(function() { return confirm(lang.delete_ays); });
|
||||||
$(".goto_checkbox").click(function( event ) {
|
$(".goto_checkbox").click(function( event ) {
|
||||||
$("form[data-id='editalias'] .goto_checkbox").not(this).prop('checked', false);
|
$("form[data-id='editalias'] .goto_checkbox").not(this).prop('checked', false);
|
||||||
if ($("form[data-id='editalias'] .goto_checkbox:checked").length > 0) {
|
if ($("form[data-id='editalias'] .goto_checkbox:checked").length > 0) {
|
||||||
$('#textarea_alias_goto').prop('disabled', true);
|
$('#textarea_alias_goto').prop('disabled', true);
|
||||||
}
|
}
|
||||||
@@ -78,10 +78,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
function draw_wl_policy_domain_table() {
|
function draw_wl_policy_domain_table() {
|
||||||
$('#wl_policy_domain_table').DataTable({
|
$('#wl_policy_domain_table').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -103,45 +104,46 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
// placeholder, so checkbox will not block child row toggle
|
// placeholder, so checkbox will not block child row toggle
|
||||||
title: '',
|
title: '',
|
||||||
data: null,
|
data: null,
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '',
|
title: '',
|
||||||
data: 'chkbox',
|
data: 'chkbox',
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'ID',
|
title: 'ID',
|
||||||
data: 'prefid',
|
data: 'prefid',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang_user.spamfilter_table_rule,
|
title: lang_user.spamfilter_table_rule,
|
||||||
data: 'value',
|
data: 'value',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Scope',
|
title: 'Scope',
|
||||||
data: 'object',
|
data: 'object',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function draw_bl_policy_domain_table() {
|
function draw_bl_policy_domain_table() {
|
||||||
$('#bl_policy_domain_table').DataTable({
|
$('#bl_policy_domain_table').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -163,36 +165,36 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
// placeholder, so checkbox will not block child row toggle
|
// placeholder, so checkbox will not block child row toggle
|
||||||
title: '',
|
title: '',
|
||||||
data: null,
|
data: null,
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '',
|
title: '',
|
||||||
data: 'chkbox',
|
data: 'chkbox',
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'ID',
|
title: 'ID',
|
||||||
data: 'prefid',
|
data: 'prefid',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang_user.spamfilter_table_rule,
|
title: lang_user.spamfilter_table_rule,
|
||||||
data: 'value',
|
data: 'value',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Scope',
|
title: 'Scope',
|
||||||
data: 'object',
|
data: 'object',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -25,24 +25,24 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
if (typeof data.symbols !== 'undefined') {
|
if (typeof data.symbols !== 'undefined') {
|
||||||
data.symbols.sort(function (a, b) {
|
data.symbols.sort(function (a, b) {
|
||||||
if (a.score === 0) return 1
|
if (a.score === 0) return 1;
|
||||||
if (b.score === 0) return -1
|
if (b.score === 0) return -1;
|
||||||
if (b.score < 0 && a.score < 0) {
|
if (b.score < 0 && a.score < 0) {
|
||||||
return a.score - b.score
|
return a.score - b.score;
|
||||||
}
|
}
|
||||||
if (b.score > 0 && a.score > 0) {
|
if (b.score > 0 && a.score > 0) {
|
||||||
return b.score - a.score
|
return b.score - a.score;
|
||||||
}
|
}
|
||||||
return b.score - a.score
|
return b.score - a.score;
|
||||||
})
|
})
|
||||||
$.each(data.symbols, function (index, value) {
|
$.each(data.symbols, function (index, value) {
|
||||||
var highlightClass = ''
|
var highlightClass = '';
|
||||||
if (value.score > 0) highlightClass = 'negative'
|
if (value.score > 0) highlightClass = 'negative';
|
||||||
else if (value.score < 0) highlightClass = 'positive'
|
else if (value.score < 0) highlightClass = 'positive';
|
||||||
else highlightClass = 'neutral'
|
else highlightClass = 'neutral';
|
||||||
$('#qid_detail_symbols').append('<span data-bs-toggle="tooltip" class="rspamd-symbol ' + highlightClass + '" title="' + (value.options ? value.options.join(', ') : '') + '">' + value.name + ' (<span class="score">' + value.score + '</span>)</span>');
|
$('#qid_detail_symbols').append('<span data-bs-toggle="tooltip" class="rspamd-symbol ' + highlightClass + '" title="' + (value.options ? value.options.join(', ') : '') + '">' + value.name + ' (<span class="score">' + value.score + '</span>)</span>');
|
||||||
});
|
});
|
||||||
$('[data-bs-toggle="tooltip"]').tooltip()
|
$('[data-bs-toggle="tooltip"]').tooltip();
|
||||||
}
|
}
|
||||||
if (typeof data.score !== 'undefined' && typeof data.action !== 'undefined') {
|
if (typeof data.score !== 'undefined' && typeof data.action !== 'undefined') {
|
||||||
if (data.action === "add header") {
|
if (data.action === "add header") {
|
||||||
|
@@ -14,10 +14,21 @@ jQuery(function($){
|
|||||||
});
|
});
|
||||||
function draw_quarantine_table() {
|
function draw_quarantine_table() {
|
||||||
var table = $('#quarantinetable').DataTable({
|
var table = $('#quarantinetable').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: pagination_size,
|
||||||
|
order: [[2, 'desc']],
|
||||||
|
lengthMenu: [
|
||||||
|
[10, 25, 50, 100, -1],
|
||||||
|
[10, 25, 50, 100, 'all']
|
||||||
|
],
|
||||||
|
pagingType: 'first_last_numbers',
|
||||||
|
aColumns: [
|
||||||
|
{ sWidth: '8.25%' },
|
||||||
|
{ sClass: 'classDataTable' }
|
||||||
|
],
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -73,87 +84,88 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
// placeholder, so checkbox will not block child row toggle
|
// placeholder, so checkbox will not block child row toggle
|
||||||
title: '',
|
title: '',
|
||||||
data: null,
|
data: null,
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '',
|
title: '',
|
||||||
data: 'chkbox',
|
data: 'chkbox',
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'ID',
|
title: 'ID',
|
||||||
data: 'id',
|
data: 'id',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.qid,
|
title: lang.qid,
|
||||||
data: 'qid',
|
data: 'qid',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.sender,
|
title: lang.sender,
|
||||||
data: 'sender',
|
data: 'sender',
|
||||||
defaultContent: ''
|
className: 'senders-mw220',
|
||||||
},
|
defaultContent: ''
|
||||||
{
|
},
|
||||||
title: lang.subj,
|
{
|
||||||
data: 'subject',
|
title: lang.subj,
|
||||||
defaultContent: ''
|
data: 'subject',
|
||||||
},
|
defaultContent: ''
|
||||||
{
|
},
|
||||||
title: lang.rspamd_result,
|
{
|
||||||
data: 'rspamdaction',
|
title: lang.rspamd_result,
|
||||||
defaultContent: ''
|
data: 'rspamdaction',
|
||||||
},
|
defaultContent: ''
|
||||||
{
|
},
|
||||||
title: lang.rcpt,
|
{
|
||||||
data: 'rcpt',
|
title: lang.rcpt,
|
||||||
defaultContent: ''
|
data: 'rcpt',
|
||||||
},
|
defaultContent: ''
|
||||||
{
|
},
|
||||||
title: lang.danger,
|
{
|
||||||
data: 'virus',
|
title: lang.danger,
|
||||||
defaultContent: ''
|
data: 'virus',
|
||||||
},
|
defaultContent: ''
|
||||||
{
|
},
|
||||||
title: lang.spam_score,
|
{
|
||||||
data: 'score',
|
title: lang.spam_score,
|
||||||
defaultContent: ''
|
data: 'score',
|
||||||
},
|
defaultContent: ''
|
||||||
{
|
},
|
||||||
title: lang.notified,
|
{
|
||||||
data: 'notified',
|
title: lang.notified,
|
||||||
defaultContent: ''
|
data: 'notified',
|
||||||
},
|
defaultContent: ''
|
||||||
{
|
},
|
||||||
title: lang.received,
|
{
|
||||||
data: 'created',
|
title: lang.received,
|
||||||
defaultContent: '',
|
data: 'created',
|
||||||
createdCell: function(td, cellData) {
|
defaultContent: '',
|
||||||
$(td).attr({
|
createdCell: function(td, cellData) {
|
||||||
"data-order": cellData,
|
$(td).attr({
|
||||||
"data-sort": cellData
|
"data-order": cellData,
|
||||||
});
|
"data-sort": cellData
|
||||||
|
});
|
||||||
|
|
||||||
var date = new Date(cellData ? cellData * 1000 : 0);
|
var date = new Date(cellData ? cellData * 1000 : 0);
|
||||||
var dateString = date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
|
var dateString = date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
|
||||||
$(td).html(dateString);
|
$(td).html(dateString);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang.action,
|
title: lang.action,
|
||||||
data: 'action',
|
data: 'action',
|
||||||
className: 'text-md-end dt-sm-head-hidden dt-body-right',
|
className: 'dt-text-right dt-sm-head-hidden',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -193,24 +205,24 @@ jQuery(function($){
|
|||||||
$('#qid_detail_fuzzy').html('');
|
$('#qid_detail_fuzzy').html('');
|
||||||
if (typeof data.symbols !== 'undefined') {
|
if (typeof data.symbols !== 'undefined') {
|
||||||
data.symbols.sort(function (a, b) {
|
data.symbols.sort(function (a, b) {
|
||||||
if (a.score === 0) return 1
|
if (a.score === 0) return 1;
|
||||||
if (b.score === 0) return -1
|
if (b.score === 0) return -1;
|
||||||
if (b.score < 0 && a.score < 0) {
|
if (b.score < 0 && a.score < 0) {
|
||||||
return a.score - b.score
|
return a.score - b.score;
|
||||||
}
|
}
|
||||||
if (b.score > 0 && a.score > 0) {
|
if (b.score > 0 && a.score > 0) {
|
||||||
return b.score - a.score
|
return b.score - a.score;
|
||||||
}
|
}
|
||||||
return b.score - a.score
|
return b.score - a.score;
|
||||||
})
|
})
|
||||||
$.each(data.symbols, function (index, value) {
|
$.each(data.symbols, function (index, value) {
|
||||||
var highlightClass = ''
|
var highlightClass = '';
|
||||||
if (value.score > 0) highlightClass = 'negative'
|
if (value.score > 0) highlightClass = 'negative';
|
||||||
else if (value.score < 0) highlightClass = 'positive'
|
else if (value.score < 0) highlightClass = 'positive';
|
||||||
else highlightClass = 'neutral'
|
else highlightClass = 'neutral';
|
||||||
$('#qid_detail_symbols').append('<span data-bs-toggle="tooltip" class="rspamd-symbol ' + highlightClass + '" title="' + (value.options ? value.options.join(', ') : '') + '">' + value.name + ' (<span class="score">' + value.score + '</span>)</span>');
|
$('#qid_detail_symbols').append('<span data-bs-toggle="tooltip" class="rspamd-symbol ' + highlightClass + '" title="' + (value.options ? value.options.join(', ') : '') + '">' + value.name + ' (<span class="score">' + value.score + '</span>)</span>');
|
||||||
});
|
});
|
||||||
$('[data-bs-toggle="tooltip"]').tooltip()
|
$('[data-bs-toggle="tooltip"]').tooltip();
|
||||||
}
|
}
|
||||||
if (typeof data.fuzzy_hashes === 'object' && data.fuzzy_hashes !== null && data.fuzzy_hashes.length !== 0) {
|
if (typeof data.fuzzy_hashes === 'object' && data.fuzzy_hashes !== null && data.fuzzy_hashes.length !== 0) {
|
||||||
$.each(data.fuzzy_hashes, function (index, value) {
|
$.each(data.fuzzy_hashes, function (index, value) {
|
||||||
@@ -276,7 +288,6 @@ jQuery(function($){
|
|||||||
// Initial table drawings
|
// Initial table drawings
|
||||||
draw_quarantine_table();
|
draw_quarantine_table();
|
||||||
|
|
||||||
|
|
||||||
function hideTableExpandCollapseBtn(table){
|
function hideTableExpandCollapseBtn(table){
|
||||||
if ($(table).hasClass('collapsed'))
|
if ($(table).hasClass('collapsed'))
|
||||||
$(".table_collapse_option").show();
|
$(".table_collapse_option").show();
|
||||||
|
@@ -1,123 +1,124 @@
|
|||||||
jQuery(function($){
|
jQuery(function($){
|
||||||
|
|
||||||
$(".refresh_table").on('click', function(e) {
|
$(".refresh_table").on('click', function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
var table_name = $(this).data('table');
|
var table_name = $(this).data('table');
|
||||||
$('#' + table_name).DataTable().ajax.reload();
|
$('#' + table_name).DataTable().ajax.reload();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
function humanFileSize(i){if(Math.abs(i)<1024)return i+" B";var B=["KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],e=-1;do{i/=1024,++e}while(Math.abs(i)>=1024&&e<B.length-1);return i.toFixed(1)+" "+B[e]}
|
function humanFileSize(i){if(Math.abs(i)<1024)return i+" B";var B=["KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],e=-1;do{i/=1024,++e}while(Math.abs(i)>=1024&&e<B.length-1);return i.toFixed(1)+" "+B[e]}
|
||||||
|
|
||||||
// Queue item
|
// Queue item
|
||||||
$('#showQueuedMsg').on('show.bs.modal', function (e) {
|
$('#showQueuedMsg').on('show.bs.modal', function (e) {
|
||||||
$('#queue_msg_content').text(lang.loading);
|
$('#queue_msg_content').text(lang.loading);
|
||||||
button = $(e.relatedTarget)
|
button = $(e.relatedTarget)
|
||||||
if (button != null) {
|
if (button != null) {
|
||||||
$('#queue_id').text(button.data('queue-id'));
|
$('#queue_id').text(button.data('queue-id'));
|
||||||
}
|
|
||||||
$.ajax({
|
|
||||||
type: 'GET',
|
|
||||||
url: '/api/v1/get/postcat/' + button.data('queue-id'),
|
|
||||||
dataType: 'text',
|
|
||||||
complete: function (data) {
|
|
||||||
$('#queue_msg_content').text(data.responseText);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
})
|
|
||||||
|
|
||||||
function draw_queue() {
|
|
||||||
// just recalc width if instance already exists
|
|
||||||
if ($.fn.DataTable.isDataTable('#queuetable') ) {
|
|
||||||
$('#queuetable').DataTable().columns.adjust().responsive.recalc();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
$.ajax({
|
||||||
|
type: 'GET',
|
||||||
|
url: '/api/v1/get/postcat/' + button.data('queue-id'),
|
||||||
|
dataType: 'text',
|
||||||
|
complete: function (data) {
|
||||||
|
$('#queue_msg_content').text(data.responseText);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
||||||
$('#queuetable').DataTable({
|
function draw_queue() {
|
||||||
responsive: true,
|
// just recalc width if instance already exists
|
||||||
processing: true,
|
if ($.fn.DataTable.isDataTable('#queuetable') ) {
|
||||||
serverSide: false,
|
$('#queuetable').DataTable().columns.adjust().responsive.recalc();
|
||||||
stateSave: true,
|
return;
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
}
|
||||||
"tr" +
|
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
$('#queuetable').DataTable({
|
||||||
language: lang_datatables,
|
responsive: true,
|
||||||
ajax: {
|
processing: true,
|
||||||
type: "GET",
|
serverSide: false,
|
||||||
url: "/api/v1/get/mailq/all",
|
stateSave: true,
|
||||||
dataSrc: function(data){
|
pageLength: pagination_size,
|
||||||
$.each(data, function (i, item) {
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
item.chkbox = '<input type="checkbox" data-id="mailqitems" name="multi_select" value="' + item.queue_id + '" />';
|
"tr" +
|
||||||
rcpts = $.map(item.recipients, function(i) {
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
return escapeHtml(i);
|
language: lang_datatables,
|
||||||
});
|
ajax: {
|
||||||
item.recipients = rcpts.join('<hr style="margin:1px!important">');
|
type: "GET",
|
||||||
item.action = '<div class="btn-group">' +
|
url: "/api/v1/get/mailq/all",
|
||||||
'<a href="#" data-bs-toggle="modal" data-bs-target="#showQueuedMsg" data-queue-id="' + encodeURI(item.queue_id) + '" class="btn btn-xs btn-secondary">' + lang.show_message + '</a>' +
|
dataSrc: function(data){
|
||||||
|
$.each(data, function (i, item) {
|
||||||
|
item.chkbox = '<input type="checkbox" data-id="mailqitems" name="multi_select" value="' + item.queue_id + '" />';
|
||||||
|
rcpts = $.map(item.recipients, function(i) {
|
||||||
|
return escapeHtml(i);
|
||||||
|
});
|
||||||
|
item.recipients = rcpts.join('<hr style="margin:1px!important">');
|
||||||
|
item.action = '<div class="btn-group">' +
|
||||||
|
'<a href="#" data-bs-toggle="modal" data-bs-target="#showQueuedMsg" data-queue-id="' + encodeURI(item.queue_id) + '" class="btn btn-xs btn-secondary">' + lang.show_message + '</a>' +
|
||||||
'</div>';
|
'</div>';
|
||||||
});
|
});
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
columns: [
|
columns: [
|
||||||
{
|
{
|
||||||
// placeholder, so checkbox will not block child row toggle
|
// placeholder, so checkbox will not block child row toggle
|
||||||
title: '',
|
title: '',
|
||||||
data: null,
|
data: null,
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: '',
|
title: '',
|
||||||
data: 'chkbox',
|
data: 'chkbox',
|
||||||
searchable: false,
|
searchable: false,
|
||||||
orderable: false,
|
orderable: false,
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'QID',
|
title: 'QID',
|
||||||
data: 'queue_id',
|
data: 'queue_id',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Queue',
|
title: 'Queue',
|
||||||
data: 'queue_name',
|
data: 'queue_name',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang_admin.arrival_time,
|
title: lang_admin.arrival_time,
|
||||||
data: 'arrival_time',
|
data: 'arrival_time',
|
||||||
defaultContent: '',
|
defaultContent: '',
|
||||||
render: function (data, type){
|
render: function (data, type){
|
||||||
var date = new Date(data ? data * 1000 : 0);
|
var date = new Date(data ? data * 1000 : 0);
|
||||||
return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
|
return date.toLocaleDateString(undefined, {year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit"});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang_admin.message_size,
|
title: lang_admin.message_size,
|
||||||
data: 'message_size',
|
data: 'message_size',
|
||||||
defaultContent: '',
|
defaultContent: '',
|
||||||
render: function (data, type){
|
render: function (data, type){
|
||||||
return humanFileSize(data);
|
return humanFileSize(data);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang_admin.sender,
|
title: lang_admin.sender,
|
||||||
data: 'sender',
|
data: 'sender',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang_admin.recipients,
|
title: lang_admin.recipients,
|
||||||
data: 'recipients',
|
data: 'recipients',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: lang_admin.action,
|
title: lang_admin.action,
|
||||||
data: 'action',
|
data: 'action',
|
||||||
className: 'text-md-end dt-sm-head-hidden dt-body-right',
|
className: 'dt-sm-head-hidden dt-text-right',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@@ -135,10 +135,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$('#tla_table').DataTable({
|
$('#tla_table').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -207,7 +208,7 @@ jQuery(function($){
|
|||||||
{
|
{
|
||||||
title: lang.action,
|
title: lang.action,
|
||||||
data: 'action',
|
data: 'action',
|
||||||
className: 'text-md-end dt-sm-head-hidden dt-body-right',
|
className: 'dt-sm-head-hidden dt-text-right',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -221,10 +222,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$('#sync_job_table').DataTable({
|
$('#sync_job_table').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -269,9 +271,9 @@ jQuery(function($){
|
|||||||
item.success = '<i class="text-' + (item.success == 1 ? 'success' : 'danger') + ' bi bi-' + (item.success == 1 ? 'check-lg' : 'x-lg') + '"></i>';
|
item.success = '<i class="text-' + (item.success == 1 ? 'success' : 'danger') + ' bi bi-' + (item.success == 1 ? 'check-lg' : 'x-lg') + '"></i>';
|
||||||
}
|
}
|
||||||
if (lang['syncjob_'+item.exit_status]) {
|
if (lang['syncjob_'+item.exit_status]) {
|
||||||
item.exit_status = lang['syncjob_'+item.exit_status];
|
item.exit_status = lang['syncjob_'+item.exit_status];
|
||||||
} else if (item.success != '-') {
|
} else if (item.success != '-') {
|
||||||
item.exit_status = lang.syncjob_check_log;
|
item.exit_status = lang.syncjob_check_log;
|
||||||
}
|
}
|
||||||
item.exit_status = item.success + ' ' + item.exit_status;
|
item.exit_status = item.success + ' ' + item.exit_status;
|
||||||
});
|
});
|
||||||
@@ -361,7 +363,7 @@ jQuery(function($){
|
|||||||
{
|
{
|
||||||
title: lang.action,
|
title: lang.action,
|
||||||
data: 'action',
|
data: 'action',
|
||||||
className: 'text-md-end dt-sm-head-hidden dt-body-right',
|
className: 'dt-sm-head-hidden dt-text-right',
|
||||||
defaultContent: '',
|
defaultContent: '',
|
||||||
responsivePriority: 5
|
responsivePriority: 5
|
||||||
}
|
}
|
||||||
@@ -376,10 +378,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$('#app_passwd_table').DataTable({
|
$('#app_passwd_table').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -457,7 +460,7 @@ jQuery(function($){
|
|||||||
{
|
{
|
||||||
title: lang.action,
|
title: lang.action,
|
||||||
data: 'action',
|
data: 'action',
|
||||||
className: 'text-md-end dt-sm-head-hidden dt-body-right',
|
className: 'dt-sm-head-hidden dt-text-right',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -471,10 +474,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$('#wl_policy_mailbox_table').DataTable({
|
$('#wl_policy_mailbox_table').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
@@ -541,10 +545,11 @@ jQuery(function($){
|
|||||||
}
|
}
|
||||||
|
|
||||||
$('#bl_policy_mailbox_table').DataTable({
|
$('#bl_policy_mailbox_table').DataTable({
|
||||||
responsive: true,
|
responsive: true,
|
||||||
processing: true,
|
processing: true,
|
||||||
serverSide: false,
|
serverSide: false,
|
||||||
stateSave: true,
|
stateSave: true,
|
||||||
|
pageLength: pagination_size,
|
||||||
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
dom: "<'row'<'col-sm-12 col-md-6'f><'col-sm-12 col-md-6'l>>" +
|
||||||
"tr" +
|
"tr" +
|
||||||
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
"<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
|
||||||
|
@@ -288,6 +288,18 @@ if (isset($_GET['query'])) {
|
|||||||
case "domain-admin":
|
case "domain-admin":
|
||||||
process_add_return(domain_admin('add', $attr));
|
process_add_return(domain_admin('add', $attr));
|
||||||
break;
|
break;
|
||||||
|
case "sso":
|
||||||
|
switch ($object) {
|
||||||
|
case "domain-admin":
|
||||||
|
$data = domain_admin_sso('issue', $attr);
|
||||||
|
if($data) {
|
||||||
|
echo json_encode($data);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
process_add_return($data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
case "admin":
|
case "admin":
|
||||||
process_add_return(admin('add', $attr));
|
process_add_return(admin('add', $attr));
|
||||||
break;
|
break;
|
||||||
|
@@ -650,7 +650,7 @@
|
|||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"delayed": "Přihlášení zpožděno o %s sekund.",
|
"delayed": "Přihlášení zpožděno o %s sekund.",
|
||||||
"fido2_webauthn": "FIDO2/WebAuthn",
|
"fido2_webauthn": "FIDO2/WebAuthn Login",
|
||||||
"login": "Přihlásit",
|
"login": "Přihlásit",
|
||||||
"mobileconfig_info": "Ke stažení profilového souboru se přihlaste jako uživatel schránky.",
|
"mobileconfig_info": "Ke stažení profilového souboru se přihlaste jako uživatel schránky.",
|
||||||
"other_logins": "Přihlášení klíčem",
|
"other_logins": "Přihlášení klíčem",
|
||||||
|
@@ -586,7 +586,7 @@
|
|||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"delayed": "Login blev forsinket med% s sekunder.",
|
"delayed": "Login blev forsinket med% s sekunder.",
|
||||||
"fido2_webauthn": "FIDO2/WebAuthn",
|
"fido2_webauthn": "FIDO2/WebAuthn Login",
|
||||||
"login": "Login",
|
"login": "Login",
|
||||||
"mobileconfig_info": "Log ind som postkassebruger for at downloade den anmodede Apple-forbindelsesprofil.",
|
"mobileconfig_info": "Log ind som postkassebruger for at downloade den anmodede Apple-forbindelsesprofil.",
|
||||||
"other_logins": "Nøgle login",
|
"other_logins": "Nøgle login",
|
||||||
|
@@ -339,7 +339,8 @@
|
|||||||
"oauth2_add_client": "Füge OAuth2 Client hinzu",
|
"oauth2_add_client": "Füge OAuth2 Client hinzu",
|
||||||
"api_read_only": "Schreibgeschützter Zugriff",
|
"api_read_only": "Schreibgeschützter Zugriff",
|
||||||
"api_read_write": "Lese-Schreib-Zugriff",
|
"api_read_write": "Lese-Schreib-Zugriff",
|
||||||
"oauth2_apps": "OAuth2 Apps"
|
"oauth2_apps": "OAuth2 Apps",
|
||||||
|
"queue_unban": "entsperren"
|
||||||
},
|
},
|
||||||
"danger": {
|
"danger": {
|
||||||
"access_denied": "Zugriff verweigert oder unvollständige/ungültige Daten",
|
"access_denied": "Zugriff verweigert oder unvollständige/ungültige Daten",
|
||||||
@@ -366,7 +367,7 @@
|
|||||||
"domain_not_empty": "Domain %s ist nicht leer",
|
"domain_not_empty": "Domain %s ist nicht leer",
|
||||||
"domain_not_found": "Domain %s nicht gefunden",
|
"domain_not_found": "Domain %s nicht gefunden",
|
||||||
"domain_quota_m_in_use": "Domain-Speicherplatzlimit muss größer oder gleich %d MiB sein",
|
"domain_quota_m_in_use": "Domain-Speicherplatzlimit muss größer oder gleich %d MiB sein",
|
||||||
"extended_sender_acl_denied": "Keine Rechte zum setzen von externen Absenderadressen",
|
"extended_sender_acl_denied": "Keine Rechte zum Setzen von externen Absenderadressen",
|
||||||
"extra_acl_invalid": "Externe Absenderadresse \"%s\" ist ungültig",
|
"extra_acl_invalid": "Externe Absenderadresse \"%s\" ist ungültig",
|
||||||
"extra_acl_invalid_domain": "Externe Absenderadresse \"%s\" verwendet eine ungültige Domain",
|
"extra_acl_invalid_domain": "Externe Absenderadresse \"%s\" verwendet eine ungültige Domain",
|
||||||
"fido2_verification_failed": "FIDO2-Verifizierung fehlgeschlagen: %s",
|
"fido2_verification_failed": "FIDO2-Verifizierung fehlgeschlagen: %s",
|
||||||
@@ -454,17 +455,23 @@
|
|||||||
"totp_verification_failed": "TOTP-Verifizierung fehlgeschlagen",
|
"totp_verification_failed": "TOTP-Verifizierung fehlgeschlagen",
|
||||||
"transport_dest_exists": "Transport-Maps-Ziel \"%s\" existiert bereits",
|
"transport_dest_exists": "Transport-Maps-Ziel \"%s\" existiert bereits",
|
||||||
"webauthn_verification_failed": "WebAuthn-Verifizierung fehlgeschlagen: %s",
|
"webauthn_verification_failed": "WebAuthn-Verifizierung fehlgeschlagen: %s",
|
||||||
|
"webauthn_authenticator_failed": "Der ausgewählte Authenticator wurde nicht gefunden",
|
||||||
|
"webauthn_publickey_failed": "Zu dem ausgewählten Authenticator wurde kein Publickey hinterlegt",
|
||||||
|
"webauthn_username_failed": "Der ausgewählte Authenticator gehört zu einem anderen Konto",
|
||||||
"unknown": "Ein unbekannter Fehler trat auf",
|
"unknown": "Ein unbekannter Fehler trat auf",
|
||||||
"unknown_tfa_method": "Unbekannte TFA-Methode",
|
"unknown_tfa_method": "Unbekannte TFA-Methode",
|
||||||
"unlimited_quota_acl": "Unendliche Quota untersagt durch ACL",
|
"unlimited_quota_acl": "Unendliche Quota untersagt durch ACL",
|
||||||
"username_invalid": "Benutzername %s kann nicht verwendet werden",
|
"username_invalid": "Benutzername %s kann nicht verwendet werden",
|
||||||
"validity_missing": "Bitte geben Sie eine Gültigkeitsdauer an",
|
"validity_missing": "Bitte geben Sie eine Gültigkeitsdauer an",
|
||||||
"value_missing": "Bitte alle Felder ausfüllen",
|
"value_missing": "Bitte alle Felder ausfüllen",
|
||||||
"yotp_verification_failed": "Yubico OTP-Verifizierung fehlgeschlagen: %s"
|
"yotp_verification_failed": "Yubico OTP-Verifizierung fehlgeschlagen: %s",
|
||||||
|
"template_exists": "Vorlage %s existiert bereits",
|
||||||
|
"template_id_invalid": "Vorlagen-ID %s ungültig",
|
||||||
|
"template_name_invalid": "Name der Vorlage ungültig"
|
||||||
},
|
},
|
||||||
"datatables": {
|
"datatables": {
|
||||||
"collapse_all": "Alle Einklappen",
|
"collapse_all": "Alle Einklappen",
|
||||||
"decimal": "",
|
"decimal": ",",
|
||||||
"emptyTable": "Keine Daten in der Tabelle vorhanden",
|
"emptyTable": "Keine Daten in der Tabelle vorhanden",
|
||||||
"expand_all": "Alle Ausklappen",
|
"expand_all": "Alle Ausklappen",
|
||||||
"info": "_START_ bis _END_ von _TOTAL_ Einträgen",
|
"info": "_START_ bis _END_ von _TOTAL_ Einträgen",
|
||||||
@@ -498,7 +505,7 @@
|
|||||||
"current_time": "Systemzeit",
|
"current_time": "Systemzeit",
|
||||||
"disk_usage": "Festplattennutzung",
|
"disk_usage": "Festplattennutzung",
|
||||||
"docs": "Dokumente",
|
"docs": "Dokumente",
|
||||||
"error_show_ip": "konnte die öffentlichen IP Adressen nicht auflösen",
|
"error_show_ip": "Konnte die öffentlichen IP Adressen nicht auflösen",
|
||||||
"external_logs": "Externe Logs",
|
"external_logs": "Externe Logs",
|
||||||
"history_all_servers": "History (alle Server)",
|
"history_all_servers": "History (alle Server)",
|
||||||
"in_memory_logs": "In-memory Logs",
|
"in_memory_logs": "In-memory Logs",
|
||||||
@@ -651,7 +658,8 @@
|
|||||||
"title": "Objekt bearbeiten",
|
"title": "Objekt bearbeiten",
|
||||||
"unchanged_if_empty": "Unverändert, wenn leer",
|
"unchanged_if_empty": "Unverändert, wenn leer",
|
||||||
"username": "Benutzername",
|
"username": "Benutzername",
|
||||||
"validate_save": "Validieren und speichern"
|
"validate_save": "Validieren und speichern",
|
||||||
|
"pushover_sound": "Ton"
|
||||||
},
|
},
|
||||||
"fido2": {
|
"fido2": {
|
||||||
"confirm": "Bestätigen",
|
"confirm": "Bestätigen",
|
||||||
@@ -692,7 +700,8 @@
|
|||||||
"quarantine": "Quarantäne",
|
"quarantine": "Quarantäne",
|
||||||
"restart_netfilter": "Netfilter neustarten",
|
"restart_netfilter": "Netfilter neustarten",
|
||||||
"restart_sogo": "SOGo neustarten",
|
"restart_sogo": "SOGo neustarten",
|
||||||
"user_settings": "Benutzereinstellungen"
|
"user_settings": "Benutzereinstellungen",
|
||||||
|
"mailcow_system": "System"
|
||||||
},
|
},
|
||||||
"info": {
|
"info": {
|
||||||
"awaiting_tfa_confirmation": "Warte auf TFA-Verifizierung",
|
"awaiting_tfa_confirmation": "Warte auf TFA-Verifizierung",
|
||||||
@@ -701,7 +710,7 @@
|
|||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"delayed": "Login wurde zur Sicherheit um %s Sekunde/n verzögert.",
|
"delayed": "Login wurde zur Sicherheit um %s Sekunde/n verzögert.",
|
||||||
"fido2_webauthn": "FIDO2/WebAuthn",
|
"fido2_webauthn": "FIDO2/WebAuthn Login",
|
||||||
"login": "Anmelden",
|
"login": "Anmelden",
|
||||||
"mobileconfig_info": "Bitte als Mailbox-Benutzer einloggen, um das Verbindungsprofil herunterzuladen.",
|
"mobileconfig_info": "Bitte als Mailbox-Benutzer einloggen, um das Verbindungsprofil herunterzuladen.",
|
||||||
"other_logins": "Key Login",
|
"other_logins": "Key Login",
|
||||||
@@ -1236,7 +1245,8 @@
|
|||||||
"syncjob_EXIT_CONNECTION_FAILURE": "Verbindungsproblem",
|
"syncjob_EXIT_CONNECTION_FAILURE": "Verbindungsproblem",
|
||||||
"syncjob_EXIT_TLS_FAILURE": "Problem mit verschlüsselter Verbindung",
|
"syncjob_EXIT_TLS_FAILURE": "Problem mit verschlüsselter Verbindung",
|
||||||
"syncjob_EXIT_AUTHENTICATION_FAILURE": "Authentifizierungsproblem",
|
"syncjob_EXIT_AUTHENTICATION_FAILURE": "Authentifizierungsproblem",
|
||||||
"syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Falscher Benutzername oder Passwort"
|
"syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Falscher Benutzername oder Passwort",
|
||||||
|
"pushover_sound": "Ton"
|
||||||
},
|
},
|
||||||
"warning": {
|
"warning": {
|
||||||
"cannot_delete_self": "Kann derzeit eingeloggten Benutzer nicht entfernen",
|
"cannot_delete_self": "Kann derzeit eingeloggten Benutzer nicht entfernen",
|
||||||
|
@@ -458,6 +458,9 @@
|
|||||||
"totp_verification_failed": "TOTP verification failed",
|
"totp_verification_failed": "TOTP verification failed",
|
||||||
"transport_dest_exists": "Transport destination \"%s\" exists",
|
"transport_dest_exists": "Transport destination \"%s\" exists",
|
||||||
"webauthn_verification_failed": "WebAuthn verification failed: %s",
|
"webauthn_verification_failed": "WebAuthn verification failed: %s",
|
||||||
|
"webauthn_authenticator_failed": "The selected authenticator was not found",
|
||||||
|
"webauthn_publickey_failed": "No public key was stored for the selected authenticator",
|
||||||
|
"webauthn_username_failed": "The selected authenticator belongs to another account",
|
||||||
"unknown": "An unknown error occurred",
|
"unknown": "An unknown error occurred",
|
||||||
"unknown_tfa_method": "Unknown TFA method",
|
"unknown_tfa_method": "Unknown TFA method",
|
||||||
"unlimited_quota_acl": "Unlimited quota prohibited by ACL",
|
"unlimited_quota_acl": "Unlimited quota prohibited by ACL",
|
||||||
@@ -468,7 +471,7 @@
|
|||||||
},
|
},
|
||||||
"datatables": {
|
"datatables": {
|
||||||
"collapse_all": "Collapse All",
|
"collapse_all": "Collapse All",
|
||||||
"decimal": "",
|
"decimal": ".",
|
||||||
"emptyTable": "No data available in table",
|
"emptyTable": "No data available in table",
|
||||||
"expand_all": "Expand All",
|
"expand_all": "Expand All",
|
||||||
"info": "Showing _START_ to _END_ of _TOTAL_ entries",
|
"info": "Showing _START_ to _END_ of _TOTAL_ entries",
|
||||||
@@ -707,7 +710,7 @@
|
|||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"delayed": "Login was delayed by %s seconds.",
|
"delayed": "Login was delayed by %s seconds.",
|
||||||
"fido2_webauthn": "FIDO2/WebAuthn",
|
"fido2_webauthn": "FIDO2/WebAuthn Login",
|
||||||
"login": "Login",
|
"login": "Login",
|
||||||
"mobileconfig_info": "Please login as mailbox user to download the requested Apple connection profile.",
|
"mobileconfig_info": "Please login as mailbox user to download the requested Apple connection profile.",
|
||||||
"other_logins": "Key login",
|
"other_logins": "Key login",
|
||||||
|
@@ -612,7 +612,7 @@
|
|||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"delayed": "La connexion a été retardée de %s secondes.",
|
"delayed": "La connexion a été retardée de %s secondes.",
|
||||||
"fido2_webauthn": "FIDO2/WebAuthn",
|
"fido2_webauthn": "FIDO2/WebAuthn Login",
|
||||||
"login": "Connexion",
|
"login": "Connexion",
|
||||||
"mobileconfig_info": "Veuillez vous connecter en tant qu’utilisateur de la boîte pour télécharger le profil de connexion Apple demandé.",
|
"mobileconfig_info": "Veuillez vous connecter en tant qu’utilisateur de la boîte pour télécharger le profil de connexion Apple demandé.",
|
||||||
"other_logins": "Clé d'authentification",
|
"other_logins": "Clé d'authentification",
|
||||||
|
@@ -674,7 +674,7 @@
|
|||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"delayed": "L'accesso è stato ritardato di %s secondi.",
|
"delayed": "L'accesso è stato ritardato di %s secondi.",
|
||||||
"fido2_webauthn": "FIDO2/WebAuthn",
|
"fido2_webauthn": "FIDO2/WebAuthn Login",
|
||||||
"login": "Login",
|
"login": "Login",
|
||||||
"mobileconfig_info": "Please login as mailbox user to download the requested Apple connection profile.",
|
"mobileconfig_info": "Please login as mailbox user to download the requested Apple connection profile.",
|
||||||
"other_logins": "Key login",
|
"other_logins": "Key login",
|
||||||
|
@@ -3,7 +3,8 @@
|
|||||||
"bcc_maps": "BCC kartes",
|
"bcc_maps": "BCC kartes",
|
||||||
"filters": "Filtri",
|
"filters": "Filtri",
|
||||||
"recipient_maps": "Saņēmēja kartes",
|
"recipient_maps": "Saņēmēja kartes",
|
||||||
"syncjobs": "Sinhronizācijas uzdevumi"
|
"syncjobs": "Sinhronizācijas uzdevumi",
|
||||||
|
"spam_score": "Mēstules novērtējums"
|
||||||
},
|
},
|
||||||
"add": {
|
"add": {
|
||||||
"activate_filter_warn": "Visi pārējie filtri tiks deaktivizēti, kad aktīvs ir atzīmēts.",
|
"activate_filter_warn": "Visi pārējie filtri tiks deaktivizēti, kad aktīvs ir atzīmēts.",
|
||||||
@@ -104,10 +105,10 @@
|
|||||||
"host": "Hosts",
|
"host": "Hosts",
|
||||||
"import": "Importēt",
|
"import": "Importēt",
|
||||||
"import_private_key": "Importēt privātu atslēgu",
|
"import_private_key": "Importēt privātu atslēgu",
|
||||||
"in_use_by": "Tiek lietots ar",
|
"in_use_by": "Izmanto",
|
||||||
"inactive": "Neaktīvs",
|
"inactive": "Neaktīvs",
|
||||||
"link": "Saite",
|
"link": "Saite",
|
||||||
"loading": "Lūdzu uzgaidiet...",
|
"loading": "Lūgums uzgaidīt...",
|
||||||
"logo_info": "Jūsu attēls augšējā navigācijas joslā tiks palielināts līdz 40 pikseļiem un maks. sākumlapas platums par 250 pikseļi. Ir ļoti ieteicama pielāgojama grafikaYour image will be scaled to a height of 40px for the top navigation bar and a max. width of 250px for the start page. Ir ļoti ieteicama pielāgojamā grafika",
|
"logo_info": "Jūsu attēls augšējā navigācijas joslā tiks palielināts līdz 40 pikseļiem un maks. sākumlapas platums par 250 pikseļi. Ir ļoti ieteicama pielāgojama grafikaYour image will be scaled to a height of 40px for the top navigation bar and a max. width of 250px for the start page. Ir ļoti ieteicama pielāgojamā grafika",
|
||||||
"main_name": "\"mailcow UI\" nosaukums",
|
"main_name": "\"mailcow UI\" nosaukums",
|
||||||
"merged_vars_hint": "Pelēkās rindas tika apvienotas <code>vars.(local.)inc.php</code> un nevar tikt modificētas.",
|
"merged_vars_hint": "Pelēkās rindas tika apvienotas <code>vars.(local.)inc.php</code> un nevar tikt modificētas.",
|
||||||
@@ -144,7 +145,10 @@
|
|||||||
"ui_texts": "UI etiķetes un teksti",
|
"ui_texts": "UI etiķetes un teksti",
|
||||||
"unchanged_if_empty": "Ja nav veiktas izmaiņas, atstājiet tukšu",
|
"unchanged_if_empty": "Ja nav veiktas izmaiņas, atstājiet tukšu",
|
||||||
"upload": "Augšupielādēt",
|
"upload": "Augšupielādēt",
|
||||||
"username": "Lietotājvārds"
|
"username": "Lietotājvārds",
|
||||||
|
"generate": "izveidot",
|
||||||
|
"message": "Ziņojums",
|
||||||
|
"last_applied": "Pēdējoreiz pielietots"
|
||||||
},
|
},
|
||||||
"danger": {
|
"danger": {
|
||||||
"access_denied": "Piekļuve liegta, vai nepareizi dati",
|
"access_denied": "Piekļuve liegta, vai nepareizi dati",
|
||||||
@@ -170,7 +174,7 @@
|
|||||||
"is_alias": "%s jau ir zināms alias",
|
"is_alias": "%s jau ir zināms alias",
|
||||||
"is_alias_or_mailbox": "%s jau ir zināms alias, pastkastes vai alias addrese izvērsta no alias domēna.",
|
"is_alias_or_mailbox": "%s jau ir zināms alias, pastkastes vai alias addrese izvērsta no alias domēna.",
|
||||||
"is_spam_alias": "%s ir jau zināms spam alias",
|
"is_spam_alias": "%s ir jau zināms spam alias",
|
||||||
"last_key": "Pēdējā atslēga nevar būt dzēsta",
|
"last_key": "Pēdējo atslēgu nevar izdzēst, tā vietā jāatspējo divpakāpju pārbaude.",
|
||||||
"login_failed": "Ielogošanās neveiksmīga",
|
"login_failed": "Ielogošanās neveiksmīga",
|
||||||
"mailbox_invalid": "Pastkastes vārds ir nederīgs",
|
"mailbox_invalid": "Pastkastes vārds ir nederīgs",
|
||||||
"mailbox_quota_exceeded": "Kvota pārsniedz domēna limitu (max. %d MiB)",
|
"mailbox_quota_exceeded": "Kvota pārsniedz domēna limitu (max. %d MiB)",
|
||||||
@@ -262,7 +266,8 @@
|
|||||||
"title": "Labot priekšmetu",
|
"title": "Labot priekšmetu",
|
||||||
"unchanged_if_empty": "Ja neizmainīts atstājiet tukšu",
|
"unchanged_if_empty": "Ja neizmainīts atstājiet tukšu",
|
||||||
"username": "Lietotājvārds",
|
"username": "Lietotājvārds",
|
||||||
"validate_save": "Apstiprināt un saglabāt"
|
"validate_save": "Apstiprināt un saglabāt",
|
||||||
|
"last_modified": "Pēdējoreiz mainīts"
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"cancel": "Atcelt",
|
"cancel": "Atcelt",
|
||||||
@@ -314,21 +319,21 @@
|
|||||||
"bcc_destinations": "BCC galamērķi/s",
|
"bcc_destinations": "BCC galamērķi/s",
|
||||||
"bcc_info": "BCC kartes tiek izmantotas, lai klusu pārsūtītu visu ziņojumu kopijas uz citu adresi. Saņēmēja kartes tipa ieraksts tiek izmantots, kad vietējais galamērķis darbojas kā pasta adresāts. Sūtītāja kartes atbilst vienam un tam pašam principam. <br/>\r\n Vietējais galamērķis netiks informēts par piegādes neveiksmi. ",
|
"bcc_info": "BCC kartes tiek izmantotas, lai klusu pārsūtītu visu ziņojumu kopijas uz citu adresi. Saņēmēja kartes tipa ieraksts tiek izmantots, kad vietējais galamērķis darbojas kā pasta adresāts. Sūtītāja kartes atbilst vienam un tam pašam principam. <br/>\r\n Vietējais galamērķis netiks informēts par piegādes neveiksmi. ",
|
||||||
"bcc_local_dest": "Vietējais galamērķis",
|
"bcc_local_dest": "Vietējais galamērķis",
|
||||||
"bcc_map_type": "BCC tips",
|
"bcc_map_type": "BCC veids",
|
||||||
"bcc_maps": "BCC kartes",
|
"bcc_maps": "BCC kartes",
|
||||||
"bcc_rcpt_map": "saņēmēja karte",
|
"bcc_rcpt_map": "saņēmēja karte",
|
||||||
"bcc_sender_map": "Sūtītāja karte",
|
"bcc_sender_map": "Sūtītāja karte",
|
||||||
"bcc_to_rcpt": "Pārslēdzieties uz adresāta kartes tipu",
|
"bcc_to_rcpt": "Pārslēdzieties uz adresāta kartes tipu",
|
||||||
"bcc_to_sender": "Pārslēgties uz sūtītāja kartes tipu",
|
"bcc_to_sender": "Pārslēgties uz sūtītāja kartes tipu",
|
||||||
"bcc_type": "BCC tips",
|
"bcc_type": "BCC tips",
|
||||||
"deactivate": "Deaktivizēt",
|
"deactivate": "Deaktivēt",
|
||||||
"description": "Apraksts",
|
"description": "Apraksts",
|
||||||
"dkim_key_length": "DKIM atslēgas garums (bits)",
|
"dkim_key_length": "DKIM atslēgas garums (bits)",
|
||||||
"domain": "Domēns",
|
"domain": "Domēns",
|
||||||
"domain_admins": "Domēna administratori",
|
"domain_admins": "Domēna administratori",
|
||||||
"domain_aliases": "Domēna aliases",
|
"domain_aliases": "Domēna aliases",
|
||||||
"domain_quota": "Kvota",
|
"domain_quota": "Kvota",
|
||||||
"domain_quota_total": "Kopējā domēna kvota",
|
"domain_quota_total": "Kopējais domēna ierobežojums",
|
||||||
"domains": "Domēns",
|
"domains": "Domēns",
|
||||||
"edit": "Labot",
|
"edit": "Labot",
|
||||||
"empty": "Nav rezultātu",
|
"empty": "Nav rezultātu",
|
||||||
@@ -341,7 +346,7 @@
|
|||||||
"inactive": "Neaktīvs",
|
"inactive": "Neaktīvs",
|
||||||
"kind": "Veids",
|
"kind": "Veids",
|
||||||
"last_run": "Pēdējā norise",
|
"last_run": "Pēdējā norise",
|
||||||
"last_run_reset": "Nākamais grafiks",
|
"last_run_reset": "Ievietot sarakstā kā nākamo",
|
||||||
"mailbox_quota": "Maks. pastkastes izmērs",
|
"mailbox_quota": "Maks. pastkastes izmērs",
|
||||||
"mailboxes": "Pastkaste",
|
"mailboxes": "Pastkaste",
|
||||||
"max_aliases": "Maks. iespejamās aliases",
|
"max_aliases": "Maks. iespejamās aliases",
|
||||||
@@ -374,7 +379,13 @@
|
|||||||
"tls_enforce_out": "Piespiest TLS izejošajiem",
|
"tls_enforce_out": "Piespiest TLS izejošajiem",
|
||||||
"toggle_all": "Pārslēgt visu",
|
"toggle_all": "Pārslēgt visu",
|
||||||
"username": "Lietotājvārds",
|
"username": "Lietotājvārds",
|
||||||
"waiting": "Gaidīšana"
|
"waiting": "Gaidīšana",
|
||||||
|
"last_modified": "Pēdējoreiz mainīts",
|
||||||
|
"booking_0_short": "Vienmēŗ bezmaksas",
|
||||||
|
"daily": "Ik dienu",
|
||||||
|
"hourly": "Ik stundu",
|
||||||
|
"last_mail_login": "Pēdējā pieteikšanās pastkastē",
|
||||||
|
"mailbox": "Pastkaste"
|
||||||
},
|
},
|
||||||
"quarantine": {
|
"quarantine": {
|
||||||
"action": "Darbības",
|
"action": "Darbības",
|
||||||
@@ -547,5 +558,14 @@
|
|||||||
"waiting": "Waiting",
|
"waiting": "Waiting",
|
||||||
"week": "Nedēļa",
|
"week": "Nedēļa",
|
||||||
"weeks": "Nedēļas"
|
"weeks": "Nedēļas"
|
||||||
|
},
|
||||||
|
"datatables": {
|
||||||
|
"paginate": {
|
||||||
|
"first": "Pirmā",
|
||||||
|
"last": "Pēdējā"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"debug": {
|
||||||
|
"last_modified": "Pēdējoreiz mainīts"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -598,7 +598,7 @@
|
|||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"delayed": "Aanmelding vertraagd met %s seconden.",
|
"delayed": "Aanmelding vertraagd met %s seconden.",
|
||||||
"fido2_webauthn": "FIDO2/WebAuthn",
|
"fido2_webauthn": "FIDO2/WebAuthn Login",
|
||||||
"login": "Aanmelden",
|
"login": "Aanmelden",
|
||||||
"mobileconfig_info": "Log in als mailboxgebruiker om het Apple-verbindingsprofiel te downloaden.",
|
"mobileconfig_info": "Log in als mailboxgebruiker om het Apple-verbindingsprofiel te downloaden.",
|
||||||
"other_logins": "Meld aan met key",
|
"other_logins": "Meld aan met key",
|
||||||
|
@@ -656,7 +656,7 @@
|
|||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"delayed": "Conectarea a fost întârziată cu %s secunde.",
|
"delayed": "Conectarea a fost întârziată cu %s secunde.",
|
||||||
"fido2_webauthn": "FIDO2/WebAuthn",
|
"fido2_webauthn": "FIDO2/WebAuthn Login",
|
||||||
"login": "Autentificare",
|
"login": "Autentificare",
|
||||||
"mobileconfig_info": "Autentificați-vă cu adresa de email pentru a descărca profilul de conexiune Apple.",
|
"mobileconfig_info": "Autentificați-vă cu adresa de email pentru a descărca profilul de conexiune Apple.",
|
||||||
"other_logins": "Autentificare cu cheie",
|
"other_logins": "Autentificare cu cheie",
|
||||||
|
@@ -37,7 +37,7 @@
|
|||||||
"add_domain_only": "Только добавить домен",
|
"add_domain_only": "Только добавить домен",
|
||||||
"add_domain_restart": "Добавить домен и перезапустить SOGo",
|
"add_domain_restart": "Добавить домен и перезапустить SOGo",
|
||||||
"alias_address": "Псевдоним/ы",
|
"alias_address": "Псевдоним/ы",
|
||||||
"alias_address_info": "<small>Укажите почтовые адреса разделенные запятыми или, если хотите пересылать все сообщения для домена владельцам псевдонима то: <code>@example.com</code>. <b>Только домены mailcow разрешены</b>.</small>",
|
"alias_address_info": "<small>Адрес(а) электронной почты (через запятую) или @example.com (для перехвата всех писем для домена). <b>только домены mailcow</b>.</small>",
|
||||||
"alias_domain": "Псевдоним домена",
|
"alias_domain": "Псевдоним домена",
|
||||||
"alias_domain_info": "<small>Действительные имена доменов, раздёленные запятыми.</small>",
|
"alias_domain_info": "<small>Действительные имена доменов, раздёленные запятыми.</small>",
|
||||||
"app_name": "Название приложения",
|
"app_name": "Название приложения",
|
||||||
@@ -335,7 +335,8 @@
|
|||||||
"username": "Имя пользователя",
|
"username": "Имя пользователя",
|
||||||
"validate_license_now": "Получить лицензию на основе GUID с сервера лицензий",
|
"validate_license_now": "Получить лицензию на основе GUID с сервера лицензий",
|
||||||
"verify": "Проверить",
|
"verify": "Проверить",
|
||||||
"yes": "✓"
|
"yes": "✓",
|
||||||
|
"queue_unban": "разблокировать"
|
||||||
},
|
},
|
||||||
"danger": {
|
"danger": {
|
||||||
"access_denied": "Доступ запрещён, или указаны неверные данные",
|
"access_denied": "Доступ запрещён, или указаны неверные данные",
|
||||||
@@ -654,7 +655,7 @@
|
|||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"delayed": "Вход был отложен на %s секунд.",
|
"delayed": "Вход был отложен на %s секунд.",
|
||||||
"fido2_webauthn": "FIDO2/WebAuthn",
|
"fido2_webauthn": "FIDO2/WebAuthn Login",
|
||||||
"login": "Войти",
|
"login": "Войти",
|
||||||
"mobileconfig_info": "Пожалуйста, войдите в систему как пользователь почтового аккаунта для загрузки профиля подключения Apple.",
|
"mobileconfig_info": "Пожалуйста, войдите в систему как пользователь почтового аккаунта для загрузки профиля подключения Apple.",
|
||||||
"other_logins": "Вход с помощью ключа",
|
"other_logins": "Вход с помощью ключа",
|
||||||
|
@@ -106,7 +106,8 @@
|
|||||||
"username": "Používateľské meno",
|
"username": "Používateľské meno",
|
||||||
"validate": "Overiť",
|
"validate": "Overiť",
|
||||||
"validation_success": "Úspešne overené",
|
"validation_success": "Úspešne overené",
|
||||||
"app_passwd_protocols": "Povolené protokoly k heslu aplikácie"
|
"app_passwd_protocols": "Povolené protokoly k heslu aplikácie",
|
||||||
|
"tags": "Štítky"
|
||||||
},
|
},
|
||||||
"admin": {
|
"admin": {
|
||||||
"access": "Prístup",
|
"access": "Prístup",
|
||||||
@@ -656,7 +657,7 @@
|
|||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"delayed": "Prihlásenie bolo oneskorené o %s sekúnd.",
|
"delayed": "Prihlásenie bolo oneskorené o %s sekúnd.",
|
||||||
"fido2_webauthn": "FIDO2/WebAuthn",
|
"fido2_webauthn": "FIDO2/WebAuthn Login",
|
||||||
"login": "Prihlásenie",
|
"login": "Prihlásenie",
|
||||||
"mobileconfig_info": "Prosím, prihláste sa ako mailový používateľ pre stiahnutie požadovaného Apple profilu.",
|
"mobileconfig_info": "Prosím, prihláste sa ako mailový používateľ pre stiahnutie požadovaného Apple profilu.",
|
||||||
"other_logins": "Prihlásenie kľúčom",
|
"other_logins": "Prihlásenie kľúčom",
|
||||||
|
@@ -618,7 +618,7 @@
|
|||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"delayed": "Av säkerhetsskäl har inloggning inaktiverats i %s sekunder.",
|
"delayed": "Av säkerhetsskäl har inloggning inaktiverats i %s sekunder.",
|
||||||
"fido2_webauthn": "FIDO2/WebAuthn",
|
"fido2_webauthn": "FIDO2/WebAuthn Login",
|
||||||
"login": "Logga in",
|
"login": "Logga in",
|
||||||
"mobileconfig_info": "Logga in som en användare av brevlåda för att ladda ner den begärda Apple-anslutningsprofilen.",
|
"mobileconfig_info": "Logga in som en användare av brevlåda för att ladda ner den begärda Apple-anslutningsprofilen.",
|
||||||
"other_logins": "Loggain med nyckel",
|
"other_logins": "Loggain med nyckel",
|
||||||
|
@@ -656,7 +656,7 @@
|
|||||||
"awaiting_tfa_confirmation": "В очікуванні підтвердження TFA"
|
"awaiting_tfa_confirmation": "В очікуванні підтвердження TFA"
|
||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"fido2_webauthn": "FIDO2/WebAuthn",
|
"fido2_webauthn": "FIDO2/WebAuthn Login",
|
||||||
"login": "Увійти",
|
"login": "Увійти",
|
||||||
"other_logins": "Вхід за допомогою ключа",
|
"other_logins": "Вхід за допомогою ключа",
|
||||||
"password": "Пароль",
|
"password": "Пароль",
|
||||||
|
@@ -661,7 +661,7 @@
|
|||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"delayed": "请在 %s 秒后重新登录。",
|
"delayed": "请在 %s 秒后重新登录。",
|
||||||
"fido2_webauthn": "使用 FIDO2/WebAuthn 登录",
|
"fido2_webauthn": "使用 FIDO2/WebAuthn Login 登录",
|
||||||
"login": "登录",
|
"login": "登录",
|
||||||
"mobileconfig_info": "请使用邮箱用户登录以下载 Apple 连接描述文件。",
|
"mobileconfig_info": "请使用邮箱用户登录以下载 Apple 连接描述文件。",
|
||||||
"other_logins": "Key 登录",
|
"other_logins": "Key 登录",
|
||||||
|
@@ -655,7 +655,7 @@
|
|||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"delayed": "請在 %s 秒後重新登入。",
|
"delayed": "請在 %s 秒後重新登入。",
|
||||||
"fido2_webauthn": "FIDO2/WebAuthn",
|
"fido2_webauthn": "FIDO2/WebAuthn Login",
|
||||||
"login": "登入",
|
"login": "登入",
|
||||||
"mobileconfig_info": "請使用信箱使用者登入以下載 Apple 連接描述檔案。",
|
"mobileconfig_info": "請使用信箱使用者登入以下載 Apple 連接描述檔案。",
|
||||||
"other_logins": "金鑰登入",
|
"other_logins": "金鑰登入",
|
||||||
|
@@ -66,7 +66,7 @@ var lang = {{ lang_admin|raw }};
|
|||||||
var lang_datatables = {{ lang_datatables|raw }};
|
var lang_datatables = {{ lang_datatables|raw }};
|
||||||
var admin_username = '{{ mailcow_cc_username }}';
|
var admin_username = '{{ mailcow_cc_username }}';
|
||||||
var csrf_token = '{{ csrf_token }}';
|
var csrf_token = '{{ csrf_token }}';
|
||||||
var pagination_size = '{{ pagination_size }}';
|
var pagination_size = Math.trunc('{{ pagination_size }}');
|
||||||
var log_pagination_size = '{{ log_pagination_size }}';
|
var log_pagination_size = Math.trunc('{{ log_pagination_size }}');
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@@ -41,7 +41,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-8">
|
<div class="col-sm-12 col-md-8">
|
||||||
<div class="table-responsive" style="margin-top: 10px;">
|
<div class="table-responsive" style="margin-top: 10px;">
|
||||||
<table class="table table-striped table-condensed">
|
<table class="table table-striped table-condensed w-100">
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td>Hostname</td>
|
<td>Hostname</td>
|
||||||
@@ -627,6 +627,6 @@
|
|||||||
var lang_debug = {{ lang_debug|raw }};
|
var lang_debug = {{ lang_debug|raw }};
|
||||||
var lang_datatables = {{ lang_datatables|raw }};
|
var lang_datatables = {{ lang_datatables|raw }};
|
||||||
var csrf_token = '{{ csrf_token }}';
|
var csrf_token = '{{ csrf_token }}';
|
||||||
var log_pagination_size = '{{ log_pagination_size }}';
|
var log_pagination_size = Math.trunc('{{ log_pagination_size }}');
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@@ -46,7 +46,7 @@
|
|||||||
<div class="col-sm-3 col-5 text-end">{{ lang.fido2.known_ids }}:</div>
|
<div class="col-sm-3 col-5 text-end">{{ lang.fido2.known_ids }}:</div>
|
||||||
<div class="col-sm-9 col-7">
|
<div class="col-sm-9 col-7">
|
||||||
<div class="table-responsive">
|
<div class="table-responsive">
|
||||||
<table class="table table-striped table-hover table-condensed" id="fido2_keys">
|
<table class="table table-striped table-hover table-condensed w-100" id="fido2_keys">
|
||||||
<tr>
|
<tr>
|
||||||
<th>ID</th>
|
<th>ID</th>
|
||||||
<th style="min-width:240px;text-align: right">{{ lang.admin.action }}</th>
|
<th style="min-width:240px;text-align: right">{{ lang.admin.action }}</th>
|
||||||
|
@@ -26,7 +26,7 @@
|
|||||||
var lang_user = {{ lang_user|raw }};
|
var lang_user = {{ lang_user|raw }};
|
||||||
var lang_datatables = {{ lang_datatables|raw }};
|
var lang_datatables = {{ lang_datatables|raw }};
|
||||||
var csrf_token = '{{ csrf_token }}';
|
var csrf_token = '{{ csrf_token }}';
|
||||||
var pagination_size = '{{ pagination_size }}';
|
var pagination_size = Math.trunc('{{ pagination_size }}');
|
||||||
var table_for_domain = '{{ domain }}';
|
var table_for_domain = '{{ domain }}';
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@@ -38,15 +38,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex mt-4" style="position: relative">
|
<div class="d-flex mt-4" style="position: relative">
|
||||||
<div class="btn-group">
|
<button type="submit" class="btn btn-xs-lg btn-success" value="Login">{{ lang.login.login }}</button>
|
||||||
<div class="btn-group">
|
<button type="button" class="btn btn-xs-lg btn-success ms-2" id="fido2-login"><i class="bi bi-shield-fill-check"></i> {{ lang.login.fido2_webauthn }}</button>
|
||||||
<button type="submit" class="btn btn-xs-lg btn-success" value="Login">{{ lang.login.login }}</button>
|
|
||||||
<button type="button" class="btn btn-xs-lg btn-success dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"></button>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<li><a class="dropdown-item" href="#" id="fido2-login"><i class="bi bi-shield-fill-check"></i> {{ lang.login.fido2_webauthn }}</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% if not oauth2_request %}
|
{% if not oauth2_request %}
|
||||||
<button type="button" {% if available_languages|length == 1 %}disabled="true"{% endif %} class="btn btn-xs-lg btn-secondary ms-auto dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
<button type="button" {% if available_languages|length == 1 %}disabled="true"{% endif %} class="btn btn-xs-lg btn-secondary ms-auto dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
<span class="flag-icon flag-icon-{{ mailcow_locale[-2:] }}"></span>
|
<span class="flag-icon flag-icon-{{ mailcow_locale[-2:] }}"></span>
|
||||||
|
@@ -58,7 +58,7 @@
|
|||||||
var lang_rl = {{ lang_rl|raw }};
|
var lang_rl = {{ lang_rl|raw }};
|
||||||
var lang_datatables = {{ lang_datatables|raw }};
|
var lang_datatables = {{ lang_datatables|raw }};
|
||||||
var csrf_token = '{{ csrf_token }}';
|
var csrf_token = '{{ csrf_token }}';
|
||||||
var pagination_size = '{{ pagination_size }}';
|
var pagination_size = Math.trunc('{{ pagination_size }}');
|
||||||
var role = '{{ role }}';
|
var role = '{{ role }}';
|
||||||
var is_dual = {{ is_dual }};
|
var is_dual = {{ is_dual }};
|
||||||
var ALLOW_ADMIN_EMAIL_LOGIN = {{ allow_admin_email_login }};
|
var ALLOW_ADMIN_EMAIL_LOGIN = {{ allow_admin_email_login }};
|
||||||
|
@@ -37,7 +37,7 @@
|
|||||||
</p>
|
</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</p>
|
</p>
|
||||||
<table id="quarantinetable" class="table table-striped"></table>
|
<table id="quarantinetable" class="table table-striped w-100"></table>
|
||||||
<div class="mass-actions-quarantine mt-4">
|
<div class="mass-actions-quarantine mt-4">
|
||||||
<div class="btn-group" data-acl="{{ acl.quarantine }}">
|
<div class="btn-group" data-acl="{{ acl.quarantine }}">
|
||||||
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="toggle_multi_select_all" data-id="qitems" href="#"><i class="bi bi-check-all"></i> {{ lang.quarantine.toggle_all }}</a>
|
<a class="btn btn-sm btn-xs-half d-block d-sm-inline btn-secondary" id="toggle_multi_select_all" data-id="qitems" href="#"><i class="bi bi-check-all"></i> {{ lang.quarantine.toggle_all }}</a>
|
||||||
@@ -66,7 +66,7 @@ var acl = '{{ acl_json|raw }}';
|
|||||||
var lang = {{ lang_quarantine|raw }};
|
var lang = {{ lang_quarantine|raw }};
|
||||||
var lang_datatables = {{ lang_datatables|raw }};
|
var lang_datatables = {{ lang_datatables|raw }};
|
||||||
var csrf_token = '{{ csrf_token }}';
|
var csrf_token = '{{ csrf_token }}';
|
||||||
var pagination_size = '{{ pagination_size }}';
|
var pagination_size = Math.trunc('{{ pagination_size }}');
|
||||||
var role = '{{ role }}';
|
var role = '{{ role }}';
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@@ -55,7 +55,7 @@
|
|||||||
var lang = {{ lang_queue|raw }};
|
var lang = {{ lang_queue|raw }};
|
||||||
var lang_datatables = {{ lang_datatables|raw }};
|
var lang_datatables = {{ lang_datatables|raw }};
|
||||||
var csrf_token = '{{ csrf_token }}';
|
var csrf_token = '{{ csrf_token }}';
|
||||||
var pagination_size = '{{ pagination_size }}';
|
var pagination_size = Math.trunc('{{ pagination_size }}');
|
||||||
var table_for_domain = '{{ domain }}';
|
var table_for_domain = '{{ domain }}';
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@@ -4,7 +4,7 @@
|
|||||||
var acl = '{{ acl_json|raw }}';
|
var acl = '{{ acl_json|raw }}';
|
||||||
var lang = {{ lang_user|raw }};
|
var lang = {{ lang_user|raw }};
|
||||||
var csrf_token = '{{ csrf_token }}';
|
var csrf_token = '{{ csrf_token }}';
|
||||||
var pagination_size = '{{ pagination_size }}';
|
var pagination_size = Math.trunc('{{ pagination_size }}');
|
||||||
var mailcow_cc_username = '{{ mailcow_cc_username }}';
|
var mailcow_cc_username = '{{ mailcow_cc_username }}';
|
||||||
var user_spam_score = [{{ user_spam_score }}];
|
var user_spam_score = [{{ user_spam_score }}];
|
||||||
var lang_datatables = {{ lang_datatables|raw }};
|
var lang_datatables = {{ lang_datatables|raw }};
|
||||||
|
@@ -58,7 +58,7 @@ services:
|
|||||||
- redis
|
- redis
|
||||||
|
|
||||||
clamd-mailcow:
|
clamd-mailcow:
|
||||||
image: mailcow/clamd:1.60
|
image: mailcow/clamd:1.61
|
||||||
restart: always
|
restart: always
|
||||||
depends_on:
|
depends_on:
|
||||||
- unbound-mailcow
|
- unbound-mailcow
|
||||||
@@ -154,7 +154,7 @@ services:
|
|||||||
- API_KEY_READ_ONLY=${API_KEY_READ_ONLY:-invalid}
|
- API_KEY_READ_ONLY=${API_KEY_READ_ONLY:-invalid}
|
||||||
- API_ALLOW_FROM=${API_ALLOW_FROM:-invalid}
|
- API_ALLOW_FROM=${API_ALLOW_FROM:-invalid}
|
||||||
- COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized}
|
- COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized}
|
||||||
- SKIP_SOLR=${SKIP_SOLR:-y}
|
- SKIP_XAPIAN=${SKIP_XAPIAN:-y}
|
||||||
- SKIP_CLAMD=${SKIP_CLAMD:-n}
|
- SKIP_CLAMD=${SKIP_CLAMD:-n}
|
||||||
- SKIP_SOGO=${SKIP_SOGO:-n}
|
- SKIP_SOGO=${SKIP_SOGO:-n}
|
||||||
- ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
|
- ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
|
||||||
@@ -169,7 +169,7 @@ services:
|
|||||||
- phpfpm
|
- phpfpm
|
||||||
|
|
||||||
sogo-mailcow:
|
sogo-mailcow:
|
||||||
image: mailcow/sogo:1.114
|
image: mailcow/sogo:1.115
|
||||||
environment:
|
environment:
|
||||||
- DBNAME=${DBNAME}
|
- DBNAME=${DBNAME}
|
||||||
- DBUSER=${DBUSER}
|
- DBUSER=${DBUSER}
|
||||||
@@ -216,7 +216,7 @@ services:
|
|||||||
- sogo
|
- sogo
|
||||||
|
|
||||||
dovecot-mailcow:
|
dovecot-mailcow:
|
||||||
image: mailcow/dovecot:1.22
|
image: mailcow/dovecot:1.20-xapian
|
||||||
depends_on:
|
depends_on:
|
||||||
- mysql-mailcow
|
- mysql-mailcow
|
||||||
dns:
|
dns:
|
||||||
@@ -250,7 +250,8 @@ services:
|
|||||||
- ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
|
- ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
|
||||||
- MAILDIR_GC_TIME=${MAILDIR_GC_TIME:-7200}
|
- MAILDIR_GC_TIME=${MAILDIR_GC_TIME:-7200}
|
||||||
- ACL_ANYONE=${ACL_ANYONE:-disallow}
|
- ACL_ANYONE=${ACL_ANYONE:-disallow}
|
||||||
- SKIP_SOLR=${SKIP_SOLR:-y}
|
- SKIP_XAPIAN=${SKIP_XAPIAN:-y}
|
||||||
|
- XAPIAN_HEAP=${XAPIAN_HEAP:-1024}
|
||||||
- MAILDIR_SUB=${MAILDIR_SUB:-}
|
- MAILDIR_SUB=${MAILDIR_SUB:-}
|
||||||
- MASTER=${MASTER:-y}
|
- MASTER=${MASTER:-y}
|
||||||
- REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-}
|
- REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-}
|
||||||
@@ -281,7 +282,7 @@ services:
|
|||||||
ofelia.job-exec.dovecot_sarules.schedule: "@every 24h"
|
ofelia.job-exec.dovecot_sarules.schedule: "@every 24h"
|
||||||
ofelia.job-exec.dovecot_sarules.command: "/bin/bash -c \"/usr/local/bin/sa-rules.sh\""
|
ofelia.job-exec.dovecot_sarules.command: "/bin/bash -c \"/usr/local/bin/sa-rules.sh\""
|
||||||
ofelia.job-exec.dovecot_fts.schedule: "@every 24h"
|
ofelia.job-exec.dovecot_fts.schedule: "@every 24h"
|
||||||
ofelia.job-exec.dovecot_fts.command: "/usr/bin/curl http://solr:8983/solr/dovecot-fts/update?optimize=true"
|
ofelia.job-exec.dovecot_fts.command: "doveadm fts optimize -A"
|
||||||
ofelia.job-exec.dovecot_repl_health.schedule: "@every 5m"
|
ofelia.job-exec.dovecot_repl_health.schedule: "@every 5m"
|
||||||
ofelia.job-exec.dovecot_repl_health.command: "/bin/bash -c \"/usr/local/bin/gosu vmail /usr/local/bin/repl_health.sh\""
|
ofelia.job-exec.dovecot_repl_health.command: "/bin/bash -c \"/usr/local/bin/gosu vmail /usr/local/bin/repl_health.sh\""
|
||||||
ulimits:
|
ulimits:
|
||||||
@@ -425,7 +426,7 @@ services:
|
|||||||
- acme
|
- acme
|
||||||
|
|
||||||
netfilter-mailcow:
|
netfilter-mailcow:
|
||||||
image: mailcow/netfilter:1.50
|
image: mailcow/netfilter:1.51
|
||||||
stop_grace_period: 30s
|
stop_grace_period: 30s
|
||||||
depends_on:
|
depends_on:
|
||||||
- dovecot-mailcow
|
- dovecot-mailcow
|
||||||
@@ -528,22 +529,6 @@ services:
|
|||||||
aliases:
|
aliases:
|
||||||
- dockerapi
|
- dockerapi
|
||||||
|
|
||||||
solr-mailcow:
|
|
||||||
image: mailcow/solr:1.8.1
|
|
||||||
restart: always
|
|
||||||
volumes:
|
|
||||||
- solr-vol-1:/opt/solr/server/solr/dovecot-fts/data
|
|
||||||
ports:
|
|
||||||
- "${SOLR_PORT:-127.0.0.1:18983}:8983"
|
|
||||||
environment:
|
|
||||||
- TZ=${TZ}
|
|
||||||
- SOLR_HEAP=${SOLR_HEAP:-1024}
|
|
||||||
- SKIP_SOLR=${SKIP_SOLR:-y}
|
|
||||||
networks:
|
|
||||||
mailcow-network:
|
|
||||||
aliases:
|
|
||||||
- solr
|
|
||||||
|
|
||||||
olefy-mailcow:
|
olefy-mailcow:
|
||||||
image: mailcow/olefy:1.11
|
image: mailcow/olefy:1.11
|
||||||
restart: always
|
restart: always
|
||||||
@@ -599,7 +584,6 @@ services:
|
|||||||
- netfilter-mailcow
|
- netfilter-mailcow
|
||||||
- watchdog-mailcow
|
- watchdog-mailcow
|
||||||
- dockerapi-mailcow
|
- dockerapi-mailcow
|
||||||
- solr-mailcow
|
|
||||||
environment:
|
environment:
|
||||||
- TZ=${TZ}
|
- TZ=${TZ}
|
||||||
image: robbertkl/ipv6nat
|
image: robbertkl/ipv6nat
|
||||||
@@ -631,7 +615,6 @@ volumes:
|
|||||||
mysql-socket-vol-1:
|
mysql-socket-vol-1:
|
||||||
redis-vol-1:
|
redis-vol-1:
|
||||||
rspamd-vol-1:
|
rspamd-vol-1:
|
||||||
solr-vol-1:
|
|
||||||
postfix-vol-1:
|
postfix-vol-1:
|
||||||
crypt-vol-1:
|
crypt-vol-1:
|
||||||
sogo-web-vol-1:
|
sogo-web-vol-1:
|
||||||
|
@@ -122,23 +122,23 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ${MEM_TOTAL} -le "2097152" ]; then
|
if [ ${MEM_TOTAL} -le "2097152" ]; then
|
||||||
echo "Disabling Solr on low-memory system."
|
echo "Disabling Xapian (full text search, build in Dovecot) on low-memory system."
|
||||||
SKIP_SOLR=y
|
SKIP_XAPIAN=y
|
||||||
elif [ ${MEM_TOTAL} -le "3670016" ]; then
|
elif [ ${MEM_TOTAL} -le "3670016" ]; then
|
||||||
echo "Installed memory is <= 3.5 GiB. It is recommended to disable Solr to prevent out-of-memory situations."
|
echo "Installed memory is <= 3.5 GiB. We suggest you to disable Xapian (full text search, build in Dovecot) to prevent out-of-memory situations."
|
||||||
echo "Solr is a prone to run OOM and should be monitored. The default Solr heap size is 1024 MiB and should be set in mailcow.conf according to your expected load."
|
echo "The default Xapian heap size is 1024 MiB and should be set in mailcow.conf according to your expected load."
|
||||||
echo "Solr can be re-enabled by setting SKIP_SOLR=n in mailcow.conf but will refuse to start with less than 2 GB total memory."
|
echo "Xapian can be re-enabled by setting SKIP_XAPIAN=n in mailcow.conf but will refuse to start with less than 2 GB total memory."
|
||||||
read -r -p "Do you want to disable Solr now? [Y/n] " response
|
read -r -p "Do you want to disable the FTS Xapian now? [Y/n] " response
|
||||||
case $response in
|
case $response in
|
||||||
[nN][oO]|[nN])
|
[nN][oO]|[nN])
|
||||||
SKIP_SOLR=n
|
SKIP_XAPIAN=n
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
SKIP_SOLR=y
|
SKIP_XAPIAN=y
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
else
|
else
|
||||||
SKIP_SOLR=n
|
SKIP_XAPIAN=n
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ${SKIP_BRANCH} != y ]]; then
|
if [[ ${SKIP_BRANCH} != y ]]; then
|
||||||
@@ -243,7 +243,6 @@ POPS_PORT=995
|
|||||||
SIEVE_PORT=4190
|
SIEVE_PORT=4190
|
||||||
DOVEADM_PORT=127.0.0.1:19991
|
DOVEADM_PORT=127.0.0.1:19991
|
||||||
SQL_PORT=127.0.0.1:13306
|
SQL_PORT=127.0.0.1:13306
|
||||||
SOLR_PORT=127.0.0.1:18983
|
|
||||||
REDIS_PORT=127.0.0.1:7654
|
REDIS_PORT=127.0.0.1:7654
|
||||||
|
|
||||||
# Your timezone
|
# Your timezone
|
||||||
@@ -329,14 +328,14 @@ SKIP_CLAMD=${SKIP_CLAMD}
|
|||||||
|
|
||||||
SKIP_SOGO=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 Xapian (FTS) on low-memory systems or if you do not want to store a readable index of your mails in vmail-index-vol-1.
|
||||||
|
|
||||||
SKIP_SOLR=${SKIP_SOLR}
|
SKIP_XAPIAN=${SKIP_XAPIAN}
|
||||||
|
|
||||||
# Solr heap size in MB, there is no recommendation, please see Solr docs.
|
# Xapian heap size in MB, there is no recommendation, please see Xapians docs.
|
||||||
# Solr is a prone to run OOM and should be monitored. Unmonitored Solr setups are not recommended.
|
# Xapian is replacing solr completely. It is supposed to be much more efficient in CPU and RAM consumption.
|
||||||
|
|
||||||
SOLR_HEAP=1024
|
XAPIAN_HEAP=1024
|
||||||
|
|
||||||
# Allow admins to log into SOGo as email user (without any password)
|
# Allow admins to log into SOGo as email user (without any password)
|
||||||
|
|
||||||
|
@@ -2,9 +2,12 @@
|
|||||||
# renovate: datasource=github-releases depName=nextcloud/server versioning=semver extractVersion=^v(?<version>.*)$
|
# renovate: datasource=github-releases depName=nextcloud/server versioning=semver extractVersion=^v(?<version>.*)$
|
||||||
NEXTCLOUD_VERSION=25.0.3
|
NEXTCLOUD_VERSION=25.0.3
|
||||||
|
|
||||||
for bin in curl dirmngr; do
|
echo -ne "Checking prerequisites..."
|
||||||
if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi
|
sleep 1
|
||||||
|
for bin in curl dirmngr tar bzip2; do
|
||||||
|
if [[ -z $(which ${bin}) ]]; then echo -ne "\r\033[31mCannot find ${bin}, exiting...\033[0m\n"; exit 1; fi
|
||||||
done
|
done
|
||||||
|
echo -ne "\r\033[32mFound all prerequisites! Continuing...\033[0m\n"
|
||||||
|
|
||||||
[[ -z ${1} ]] && NC_HELP=y
|
[[ -z ${1} ]] && NC_HELP=y
|
||||||
|
|
||||||
@@ -215,5 +218,4 @@ elif [[ ${NC_RESETPW} == "y" ]]; then
|
|||||||
read -p "Enter the username: " NC_USER
|
read -p "Enter the username: " NC_USER
|
||||||
done
|
done
|
||||||
docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) /web/nextcloud/occ user:resetpassword ${NC_USER}
|
docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) /web/nextcloud/occ user:resetpassword ${NC_USER}
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
26
update.sh
26
update.sh
@@ -388,8 +388,8 @@ CONFIG_ARRAY=(
|
|||||||
"MAILDIR_GC_TIME"
|
"MAILDIR_GC_TIME"
|
||||||
"MAILDIR_SUB"
|
"MAILDIR_SUB"
|
||||||
"ACL_ANYONE"
|
"ACL_ANYONE"
|
||||||
"SOLR_HEAP"
|
"XAPIAN_HEAP"
|
||||||
"SKIP_SOLR"
|
"SKIP_XAPIAN"
|
||||||
"ENABLE_SSL_SNI"
|
"ENABLE_SSL_SNI"
|
||||||
"ALLOW_ADMIN_EMAIL_LOGIN"
|
"ALLOW_ADMIN_EMAIL_LOGIN"
|
||||||
"SKIP_HTTP_VERIFICATION"
|
"SKIP_HTTP_VERIFICATION"
|
||||||
@@ -510,20 +510,20 @@ for option in ${CONFIG_ARRAY[@]}; do
|
|||||||
echo '# Otherwise a user might share data with too many other users.' >> mailcow.conf
|
echo '# Otherwise a user might share data with too many other users.' >> mailcow.conf
|
||||||
echo 'ACL_ANYONE=disallow' >> mailcow.conf
|
echo 'ACL_ANYONE=disallow' >> mailcow.conf
|
||||||
fi
|
fi
|
||||||
elif [[ ${option} == "SOLR_HEAP" ]]; then
|
elif [[ ${option} == "XAPIAN_HEAP" ]]; then
|
||||||
if ! grep -q ${option} mailcow.conf; then
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
echo "Adding new option \"${option}\" to mailcow.conf"
|
echo "Replacing SOLR_HEAP with \"${option}\" in mailcow.conf"
|
||||||
echo '# Solr heap size, there is no recommendation, please see Solr docs.' >> mailcow.conf
|
sed -i '/# Solr heap size in MB, there is no recommendation, please see Solr docs./c\# Xapian heap size in MB, there is no recommendation, please see Xapians docs.' mailcow.conf
|
||||||
echo '# Solr is a prone to run OOM on large systems and should be monitored. Unmonitored Solr setups are not recommended.' >> mailcow.conf
|
sed -i '/# Solr is a prone to run OOM on large systems and should be monitored. Unmonitored Solr setups are not recommended./c\# Xapian is replacing solr completely. It is supposed to be much more efficient in CPU and RAM consumption.' mailcow.conf
|
||||||
echo '# Solr will refuse to start with total system memory below or equal to 2 GB.' >> mailcow.conf
|
sed -i '/SOLR_HEAP=/c\XAPIAN_HEAP=' mailcow.conf
|
||||||
echo "SOLR_HEAP=1024" >> mailcow.conf
|
|
||||||
fi
|
fi
|
||||||
elif [[ ${option} == "SKIP_SOLR" ]]; then
|
elif [[ ${option} == "SKIP_XAPIAN" ]]; then
|
||||||
if ! grep -q ${option} mailcow.conf; then
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
echo "Adding new option \"${option}\" to mailcow.conf"
|
echo "Replacing SKIP_SOLR with \"${option}\" in mailcow.conf"
|
||||||
echo '# Solr is disabled by default after upgrading from non-Solr to Solr-enabled mailcows.' >> mailcow.conf
|
sed -i '/# Skip Solr on low-memory systems or if you do not want to store a readable index of your mails in solr-vol-1./c\# Skip Xapian (FTS) on low-memory systems or if you do not want to store a readable index of your mails in vmail-index-vol-1.' mailcow.conf
|
||||||
echo '# Disable Solr or if you do not want to store a readable index of your mails in solr-vol-1.' >> mailcow.conf
|
sed -i '/SKIP_SOLR=/c\SKIP_XAPIAN=' mailcow.conf
|
||||||
echo "SKIP_SOLR=y" >> mailcow.conf
|
echo "Removing Solr-Port Binding from mailcow.conf"
|
||||||
|
sed -i '/SOLR_PORT=/d' mailcow.conf
|
||||||
fi
|
fi
|
||||||
elif [[ ${option} == "ENABLE_SSL_SNI" ]]; then
|
elif [[ ${option} == "ENABLE_SSL_SNI" ]]; then
|
||||||
if ! grep -q ${option} mailcow.conf; then
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
Reference in New Issue
Block a user