mirror of
https://github.com/mailcow/mailcow-dockerized.git
synced 2024-12-12 10:45:14 +02:00
commit
86beba6f5a
22
.github/renovate.json
vendored
22
.github/renovate.json
vendored
@ -1,13 +1,31 @@
|
||||
{
|
||||
"enabled": true,
|
||||
"timezone": "Europe/Berlin",
|
||||
"dependencyDashboard": false,
|
||||
"dependencyDashboard": true,
|
||||
"dependencyDashboardTitle": "Renovate Dashboard",
|
||||
"commitBody": "Signed-off-by: milkmaker <milkmaker@mailcow.de>",
|
||||
"rebaseWhen": "auto",
|
||||
"labels": ["renovate"],
|
||||
"assignees": [
|
||||
"@magiccc"
|
||||
],
|
||||
"baseBranches": ["staging"],
|
||||
"enabledManagers": ["github-actions"]
|
||||
"enabledManagers": ["github-actions", "regex", "docker-compose"],
|
||||
"ignorePaths": [
|
||||
"data\/web\/inc\/lib\/vendor\/matthiasmullie\/minify\/**"
|
||||
],
|
||||
"regexManagers": [
|
||||
{
|
||||
"fileMatch": ["^helper-scripts\/nextcloud.sh$"],
|
||||
"matchStrings": [
|
||||
"#\\srenovate:\\sdatasource=(?<datasource>.*?) depName=(?<depName>.*?)( versioning=(?<versioning>.*?))?( extractVersion=(?<extractVersion>.*?))?\\s.*?_VERSION=(?<currentValue>.*)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"fileMatch": ["(^|/)Dockerfile[^/]*$"],
|
||||
"matchStrings": [
|
||||
"#\\srenovate:\\sdatasource=(?<datasource>.*?) depName=(?<depName>.*?)( versioning=(?<versioning>.*?))?\\s(ENV|ARG) .*?_VERSION=(?<currentValue>.*)\\s"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ jobs:
|
||||
if: github.event.pull_request.base.ref != 'staging' #check if the target branch is not staging
|
||||
steps:
|
||||
- name: Send message
|
||||
uses: thollander/actions-comment-pull-request@main
|
||||
uses: thollander/actions-comment-pull-request@v2.3.1
|
||||
with:
|
||||
GITHUB_TOKEN: ${{ secrets.CHECKIFPRISSTAGING_ACTION_PAT }}
|
||||
message: |
|
||||
|
@ -14,7 +14,7 @@ jobs:
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Mark/Close Stale Issues and Pull Requests 🗑️
|
||||
uses: actions/stale@v6.0.1
|
||||
uses: actions/stale@v7.0.0
|
||||
with:
|
||||
repo-token: ${{ secrets.STALE_ACTION_PAT }}
|
||||
days-before-stale: 60
|
||||
|
@ -11,7 +11,7 @@ jobs:
|
||||
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.1
|
||||
uses: mugi111/tweet-trigger-release@v1.2
|
||||
with:
|
||||
consumer_key: ${{ secrets.CONSUMER_KEY }}
|
||||
consumer_secret: ${{ secrets.CONSUMER_SECRET }}
|
||||
|
@ -2,9 +2,12 @@ FROM debian:bullseye-slim
|
||||
LABEL maintainer "Andre Peters <andre.peters@servercow.de>"
|
||||
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
ARG DOVECOT=2.3.19.1
|
||||
# renovate: datasource=github-tags depName=dovecot/core versioning=semver-coerced
|
||||
ARG DOVECOT=2.3.20
|
||||
# renovate: datasource=github-releases depName=tianon/gosu versioning=semver-coerced
|
||||
ARG GOSU_VERSION=1.16
|
||||
ENV LC_ALL C
|
||||
ENV GOSU_VERSION 1.14
|
||||
|
||||
|
||||
# Add groups and users before installing Dovecot to not break compatibility
|
||||
RUN groupadd -g 5000 vmail \
|
||||
|
@ -1,12 +1,18 @@
|
||||
FROM php:8.1-fpm-alpine3.17
|
||||
LABEL maintainer "Andre Peters <andre.peters@servercow.de>"
|
||||
|
||||
ENV APCU_PECL 5.1.22
|
||||
ENV IMAGICK_PECL 3.7.0
|
||||
ENV MAILPARSE_PECL 3.1.4
|
||||
ENV MEMCACHED_PECL 3.2.0
|
||||
ENV REDIS_PECL 5.3.7
|
||||
ENV COMPOSER 2.4.4
|
||||
# renovate: datasource=github-tags depName=krakjoe/apcu versioning=semver-coerced
|
||||
ARG APCU_PECL_VERSION=5.1.22
|
||||
# renovate: datasource=github-tags depName=Imagick/imagick versioning=semver-coerced
|
||||
ARG IMAGICK_PECL_VERSION=3.7.0
|
||||
# renovate: datasource=github-tags depName=php/pecl-mail-mailparse versioning=semver-coerced
|
||||
ARG MAILPARSE_PECL_VERSION=3.1.4
|
||||
# renovate: datasource=github-tags depName=php-memcached-dev/php-memcached versioning=semver-coerced
|
||||
ARG MEMCACHED_PECL_VERSION=3.2.0
|
||||
# renovate: datasource=github-tags depName=phpredis/phpredis versioning=semver-coerced
|
||||
ARG REDIS_PECL_VERSION=5.3.7
|
||||
# renovate: datasource=github-tags depName=composer/composer versioning=semver-coerced
|
||||
ARG COMPOSER_VERSION=2.5.1
|
||||
|
||||
RUN apk add -U --no-cache autoconf \
|
||||
aspell-dev \
|
||||
@ -55,11 +61,11 @@ RUN apk add -U --no-cache autoconf \
|
||||
samba-client \
|
||||
zlib-dev \
|
||||
tzdata \
|
||||
&& pecl install mailparse-${MAILPARSE_PECL} \
|
||||
&& pecl install redis-${REDIS_PECL} \
|
||||
&& pecl install memcached-${MEMCACHED_PECL} \
|
||||
&& pecl install APCu-${APCU_PECL} \
|
||||
&& pecl install imagick-${IMAGICK_PECL} \
|
||||
&& pecl install APCu-${APCU_PECL_VERSION} \
|
||||
&& pecl install imagick-${IMAGICK_PECL_VERSION} \
|
||||
&& pecl install mailparse-${MAILPARSE_PECL_VERSION} \
|
||||
&& pecl install memcached-${MEMCACHED_PECL_VERSION} \
|
||||
&& pecl install redis-${REDIS_PECL_VERSION} \
|
||||
&& docker-php-ext-enable apcu imagick memcached mailparse redis \
|
||||
&& pecl clear-cache \
|
||||
&& docker-php-ext-configure intl \
|
||||
@ -72,7 +78,7 @@ RUN apk add -U --no-cache autoconf \
|
||||
&& docker-php-ext-install -j 4 exif gd gettext intl ldap opcache pcntl pdo pdo_mysql pspell soap sockets zip bcmath gmp \
|
||||
&& docker-php-ext-configure imap --with-imap --with-imap-ssl \
|
||||
&& docker-php-ext-install -j 4 imap \
|
||||
&& curl --silent --show-error https://getcomposer.org/installer | php -- --version=${COMPOSER} \
|
||||
&& curl --silent --show-error https://getcomposer.org/installer | php -- --version=${COMPOSER_VERSION} \
|
||||
&& mv composer.phar /usr/local/bin/composer \
|
||||
&& chmod +x /usr/local/bin/composer \
|
||||
&& apk del --purge autoconf \
|
||||
@ -102,4 +108,4 @@ COPY ./docker-entrypoint.sh /
|
||||
|
||||
ENTRYPOINT ["/docker-entrypoint.sh"]
|
||||
|
||||
CMD ["php-fpm"]
|
||||
CMD ["php-fpm"]
|
@ -3,8 +3,9 @@ LABEL maintainer "Andre Peters <andre.peters@servercow.de>"
|
||||
|
||||
ARG DEBIAN_FRONTEND=noninteractive
|
||||
ARG SOGO_DEBIAN_REPOSITORY=http://packages.sogo.nu/nightly/5/debian/
|
||||
# renovate: datasource=github-releases depName=tianon/gosu versioning=semver-coerced
|
||||
ARG GOSU_VERSION=1.16
|
||||
ENV LC_ALL C
|
||||
ENV GOSU_VERSION 1.14
|
||||
|
||||
# Prerequisites
|
||||
RUN echo "Building from repository $SOGO_DEBIAN_REPOSITORY" \
|
||||
|
@ -2,7 +2,8 @@ FROM solr:7.7-slim
|
||||
|
||||
USER root
|
||||
|
||||
ENV GOSU_VERSION 1.11
|
||||
# renovate: datasource=github-releases depName=tianon/gosu versioning=semver-coerced
|
||||
ARG GOSU_VERSION=1.16
|
||||
|
||||
COPY solr.sh /
|
||||
COPY solr-config-7.7.0.xml /
|
||||
|
@ -103,6 +103,7 @@ $template_data = [
|
||||
'rsettings' => $rsettings,
|
||||
'rspamd_regex_maps' => $rspamd_regex_maps,
|
||||
'logo_specs' => customize('get', 'main_logo_specs'),
|
||||
'ip_check' => customize('get', 'ip_check'),
|
||||
'password_complexity' => password_complexity('get'),
|
||||
'show_rspamd_global_filters' => @$_SESSION['show_rspamd_global_filters'],
|
||||
'lang_admin' => json_encode($lang['admin']),
|
||||
|
@ -370,3 +370,14 @@ 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 {
|
||||
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;
|
||||
}
|
@ -199,6 +199,10 @@
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
div.dataTables_wrapper div.dataTables_length {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media (max-width: 350px) {
|
@ -11,7 +11,86 @@
|
||||
* Copyright 2011-2021 Twitter, Inc.
|
||||
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
|
||||
*/
|
||||
@import url("https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,300;0,400;0,700;1,400&display=swap");
|
||||
|
||||
/* source-sans-pro-300 - latin */
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
src: url('/fonts/source-sans-pro-v21-latin-300.eot'); /* IE9 Compat Modes */
|
||||
src: local(''),
|
||||
url('/fonts/source-sans-pro-v21-latin-300.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||
url('/fonts/source-sans-pro-v21-latin-300.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('/fonts/source-sans-pro-v21-latin-300.woff') format('woff'), /* Modern Browsers */
|
||||
url('/fonts/source-sans-pro-v21-latin-300.ttf') format('truetype'), /* Safari, Android, iOS */
|
||||
url('/fonts/source-sans-pro-v21-latin-300.svg#SourceSansPro') format('svg'); /* Legacy iOS */
|
||||
}
|
||||
/* source-sans-pro-300italic - latin */
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: italic;
|
||||
font-weight: 300;
|
||||
src: url('/fonts/source-sans-pro-v21-latin-300italic.eot'); /* IE9 Compat Modes */
|
||||
src: local(''),
|
||||
url('/fonts/source-sans-pro-v21-latin-300italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||
url('/fonts/source-sans-pro-v21-latin-300italic.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('/fonts/source-sans-pro-v21-latin-300italic.woff') format('woff'), /* Modern Browsers */
|
||||
url('/fonts/source-sans-pro-v21-latin-300italic.ttf') format('truetype'), /* Safari, Android, iOS */
|
||||
url('/fonts/source-sans-pro-v21-latin-300italic.svg#SourceSansPro') format('svg'); /* Legacy iOS */
|
||||
}
|
||||
/* source-sans-pro-regular - latin */
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url('/fonts/source-sans-pro-v21-latin-regular.eot'); /* IE9 Compat Modes */
|
||||
src: local(''),
|
||||
url('/fonts/source-sans-pro-v21-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||
url('/fonts/source-sans-pro-v21-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('/fonts/source-sans-pro-v21-latin-regular.woff') format('woff'), /* Modern Browsers */
|
||||
url('/fonts/source-sans-pro-v21-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */
|
||||
url('/fonts/source-sans-pro-v21-latin-regular.svg#SourceSansPro') format('svg'); /* Legacy iOS */
|
||||
}
|
||||
/* source-sans-pro-italic - latin */
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: italic;
|
||||
font-weight: 400;
|
||||
src: url('/fonts/source-sans-pro-v21-latin-italic.eot'); /* IE9 Compat Modes */
|
||||
src: local(''),
|
||||
url('/fonts/source-sans-pro-v21-latin-italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||
url('/fonts/source-sans-pro-v21-latin-italic.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('/fonts/source-sans-pro-v21-latin-italic.woff') format('woff'), /* Modern Browsers */
|
||||
url('/fonts/source-sans-pro-v21-latin-italic.ttf') format('truetype'), /* Safari, Android, iOS */
|
||||
url('/fonts/source-sans-pro-v21-latin-italic.svg#SourceSansPro') format('svg'); /* Legacy iOS */
|
||||
}
|
||||
/* source-sans-pro-700 - latin */
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
src: url('/fonts/source-sans-pro-v21-latin-700.eot'); /* IE9 Compat Modes */
|
||||
src: local(''),
|
||||
url('/fonts/source-sans-pro-v21-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||
url('/fonts/source-sans-pro-v21-latin-700.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('/fonts/source-sans-pro-v21-latin-700.woff') format('woff'), /* Modern Browsers */
|
||||
url('/fonts/source-sans-pro-v21-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */
|
||||
url('/fonts/source-sans-pro-v21-latin-700.svg#SourceSansPro') format('svg'); /* Legacy iOS */
|
||||
}
|
||||
/* source-sans-pro-700italic - latin */
|
||||
@font-face {
|
||||
font-family: 'Source Sans Pro';
|
||||
font-style: italic;
|
||||
font-weight: 700;
|
||||
src: url('/fonts/source-sans-pro-v21-latin-700italic.eot'); /* IE9 Compat Modes */
|
||||
src: local(''),
|
||||
url('/fonts/source-sans-pro-v21-latin-700italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
|
||||
url('/fonts/source-sans-pro-v21-latin-700italic.woff2') format('woff2'), /* Super Modern Browsers */
|
||||
url('/fonts/source-sans-pro-v21-latin-700italic.woff') format('woff'), /* Modern Browsers */
|
||||
url('/fonts/source-sans-pro-v21-latin-700italic.ttf') format('truetype'), /* Safari, Android, iOS */
|
||||
url('/fonts/source-sans-pro-v21-latin-700italic.svg#SourceSansPro') format('svg'); /* Legacy iOS */
|
||||
}
|
||||
|
||||
:root {
|
||||
--bs-blue: #158cba;
|
||||
--bs-indigo: #6610f2;
|
||||
|
@ -358,3 +358,11 @@ table.dataTable.dtr-inline.collapsed>tbody>tr>td.dataTables_empty {
|
||||
background: #333;
|
||||
}
|
||||
|
||||
span.mail-address-item {
|
||||
background-color: #333;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #555;
|
||||
padding: 2px 7px;
|
||||
display: inline-block;
|
||||
margin: 2px 6px 2px 0;
|
||||
}
|
||||
|
@ -65,6 +65,7 @@ $template_data = [
|
||||
'solr_uptime' => round($solr_status['status']['dovecot-fts']['uptime'] / 1000 / 60 / 60),
|
||||
'clamd_status' => $clamd_status,
|
||||
'containers' => $containers,
|
||||
'ip_check' => customize('get', 'ip_check'),
|
||||
'lang_admin' => json_encode($lang['admin']),
|
||||
'lang_debug' => json_encode($lang['debug']),
|
||||
'lang_datatables' => json_encode($lang['datatables']),
|
||||
|
BIN
data/web/fonts/source-sans-pro-v21-latin-300.woff
Normal file
BIN
data/web/fonts/source-sans-pro-v21-latin-300.woff
Normal file
Binary file not shown.
BIN
data/web/fonts/source-sans-pro-v21-latin-300.woff2
Normal file
BIN
data/web/fonts/source-sans-pro-v21-latin-300.woff2
Normal file
Binary file not shown.
BIN
data/web/fonts/source-sans-pro-v21-latin-300italic.woff
Normal file
BIN
data/web/fonts/source-sans-pro-v21-latin-300italic.woff
Normal file
Binary file not shown.
BIN
data/web/fonts/source-sans-pro-v21-latin-300italic.woff2
Normal file
BIN
data/web/fonts/source-sans-pro-v21-latin-300italic.woff2
Normal file
Binary file not shown.
BIN
data/web/fonts/source-sans-pro-v21-latin-700.woff
Normal file
BIN
data/web/fonts/source-sans-pro-v21-latin-700.woff
Normal file
Binary file not shown.
BIN
data/web/fonts/source-sans-pro-v21-latin-700.woff2
Normal file
BIN
data/web/fonts/source-sans-pro-v21-latin-700.woff2
Normal file
Binary file not shown.
BIN
data/web/fonts/source-sans-pro-v21-latin-700italic.woff
Normal file
BIN
data/web/fonts/source-sans-pro-v21-latin-700italic.woff
Normal file
Binary file not shown.
BIN
data/web/fonts/source-sans-pro-v21-latin-700italic.woff2
Normal file
BIN
data/web/fonts/source-sans-pro-v21-latin-700italic.woff2
Normal file
Binary file not shown.
BIN
data/web/fonts/source-sans-pro-v21-latin-italic.woff
Normal file
BIN
data/web/fonts/source-sans-pro-v21-latin-italic.woff
Normal file
Binary file not shown.
BIN
data/web/fonts/source-sans-pro-v21-latin-italic.woff2
Normal file
BIN
data/web/fonts/source-sans-pro-v21-latin-italic.woff2
Normal file
Binary file not shown.
BIN
data/web/fonts/source-sans-pro-v21-latin-regular.woff
Normal file
BIN
data/web/fonts/source-sans-pro-v21-latin-regular.woff
Normal file
Binary file not shown.
BIN
data/web/fonts/source-sans-pro-v21-latin-regular.woff2
Normal file
BIN
data/web/fonts/source-sans-pro-v21-latin-regular.woff2
Normal file
Binary file not shown.
@ -160,6 +160,25 @@ function customize($_action, $_item, $_data = null) {
|
||||
'msg' => 'ui_texts'
|
||||
);
|
||||
break;
|
||||
case 'ip_check':
|
||||
$ip_check = ($_data['ip_check_opt_in'] == "1") ? 1 : 0;
|
||||
try {
|
||||
$redis->set('IP_CHECK', $ip_check);
|
||||
}
|
||||
catch (RedisException $e) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||
'msg' => array('redis_error', $e)
|
||||
);
|
||||
return false;
|
||||
}
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'success',
|
||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||
'msg' => 'ip_check_opt_in_modified'
|
||||
);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 'delete':
|
||||
@ -276,6 +295,20 @@ function customize($_action, $_item, $_data = null) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
case 'ip_check':
|
||||
try {
|
||||
$ip_check = ($ip_check = $redis->get('IP_CHECK')) ? $ip_check : 0;
|
||||
return $ip_check;
|
||||
}
|
||||
catch (RedisException $e) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_item, $_data),
|
||||
'msg' => array('redis_error', $e)
|
||||
);
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -2879,67 +2879,68 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
|
||||
'msg' => 'access_denied'
|
||||
'msg' => 'extended_sender_acl_denied'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
$extra_acls = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['extended_sender_acl']));
|
||||
foreach ($extra_acls as $i => &$extra_acl) {
|
||||
if (empty($extra_acl)) {
|
||||
continue;
|
||||
}
|
||||
if (substr($extra_acl, 0, 1) === "@") {
|
||||
$extra_acl = ltrim($extra_acl, '@');
|
||||
}
|
||||
if (!filter_var($extra_acl, FILTER_VALIDATE_EMAIL) && !is_valid_domain_name($extra_acl)) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
|
||||
'msg' => array('extra_acl_invalid', htmlspecialchars($extra_acl))
|
||||
);
|
||||
unset($extra_acls[$i]);
|
||||
continue;
|
||||
}
|
||||
$domains = array_merge(mailbox('get', 'domains'), mailbox('get', 'alias_domains'));
|
||||
if (filter_var($extra_acl, FILTER_VALIDATE_EMAIL)) {
|
||||
$extra_acl_domain = idn_to_ascii(substr(strstr($extra_acl, '@'), 1), 0, INTL_IDNA_VARIANT_UTS46);
|
||||
if (in_array($extra_acl_domain, $domains)) {
|
||||
else {
|
||||
$extra_acls = array_map('trim', preg_split( "/( |,|;|\n)/", $_data['extended_sender_acl']));
|
||||
foreach ($extra_acls as $i => &$extra_acl) {
|
||||
if (empty($extra_acl)) {
|
||||
continue;
|
||||
}
|
||||
if (substr($extra_acl, 0, 1) === "@") {
|
||||
$extra_acl = ltrim($extra_acl, '@');
|
||||
}
|
||||
if (!filter_var($extra_acl, FILTER_VALIDATE_EMAIL) && !is_valid_domain_name($extra_acl)) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
|
||||
'msg' => array('extra_acl_invalid_domain', $extra_acl_domain)
|
||||
'msg' => array('extra_acl_invalid', htmlspecialchars($extra_acl))
|
||||
);
|
||||
unset($extra_acls[$i]);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (in_array($extra_acl, $domains)) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
|
||||
'msg' => array('extra_acl_invalid_domain', $extra_acl_domain)
|
||||
);
|
||||
unset($extra_acls[$i]);
|
||||
continue;
|
||||
$domains = array_merge(mailbox('get', 'domains'), mailbox('get', 'alias_domains'));
|
||||
if (filter_var($extra_acl, FILTER_VALIDATE_EMAIL)) {
|
||||
$extra_acl_domain = idn_to_ascii(substr(strstr($extra_acl, '@'), 1), 0, INTL_IDNA_VARIANT_UTS46);
|
||||
if (in_array($extra_acl_domain, $domains)) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
|
||||
'msg' => array('extra_acl_invalid_domain', $extra_acl_domain)
|
||||
);
|
||||
unset($extra_acls[$i]);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (in_array($extra_acl, $domains)) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
|
||||
'msg' => array('extra_acl_invalid_domain', $extra_acl_domain)
|
||||
);
|
||||
unset($extra_acls[$i]);
|
||||
continue;
|
||||
}
|
||||
$extra_acl = '@' . $extra_acl;
|
||||
}
|
||||
$extra_acl = '@' . $extra_acl;
|
||||
}
|
||||
}
|
||||
$extra_acls = array_filter($extra_acls);
|
||||
$extra_acls = array_values($extra_acls);
|
||||
$extra_acls = array_unique($extra_acls);
|
||||
$stmt = $pdo->prepare("DELETE FROM `sender_acl` WHERE `external` = 1 AND `logged_in_as` = :username");
|
||||
$stmt->execute(array(
|
||||
':username' => $username
|
||||
));
|
||||
foreach ($extra_acls as $sender_acl_external) {
|
||||
$stmt = $pdo->prepare("INSERT INTO `sender_acl` (`send_as`, `logged_in_as`, `external`)
|
||||
VALUES (:sender_acl, :username, 1)");
|
||||
$extra_acls = array_filter($extra_acls);
|
||||
$extra_acls = array_values($extra_acls);
|
||||
$extra_acls = array_unique($extra_acls);
|
||||
$stmt = $pdo->prepare("DELETE FROM `sender_acl` WHERE `external` = 1 AND `logged_in_as` = :username");
|
||||
$stmt->execute(array(
|
||||
':sender_acl' => $sender_acl_external,
|
||||
':username' => $username
|
||||
));
|
||||
foreach ($extra_acls as $sender_acl_external) {
|
||||
$stmt = $pdo->prepare("INSERT INTO `sender_acl` (`send_as`, `logged_in_as`, `external`)
|
||||
VALUES (:sender_acl, :username, 1)");
|
||||
$stmt->execute(array(
|
||||
':sender_acl' => $sender_acl_external,
|
||||
':username' => $username
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isset($_data['sender_acl'])) {
|
||||
@ -5170,15 +5171,6 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
|
||||
$tags = $_data['tags'];
|
||||
if (!is_array($tags)) $tags = array();
|
||||
|
||||
|
||||
if ($_SESSION['mailcow_cc_role'] != "admin") {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
|
||||
'msg' => 'access_denied'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
$wasModified = false;
|
||||
foreach ($domains as $domain) {
|
||||
@ -5190,7 +5182,15 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
|
||||
);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!hasDomainAccess($_SESSION['mailcow_cc_username'], $_SESSION['mailcow_cc_role'], $domain)) {
|
||||
$_SESSION['return'][] = array(
|
||||
'type' => 'danger',
|
||||
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
|
||||
'msg' => 'access_denied'
|
||||
);
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach($tags as $tag){
|
||||
// delete tag
|
||||
$wasModified = true;
|
||||
|
@ -12,14 +12,22 @@ $(document).ready(function() {
|
||||
$.notify({message: msg},{z_index: 20000, delay: auto_hide, type: type,placement: {from: "bottom",align: "right"},animate: {enter: 'animated fadeInUp',exit: 'animated fadeOutDown'}});
|
||||
}
|
||||
|
||||
$(".generate_password").click(function( event ) {
|
||||
$(".generate_password").click(async function( event ) {
|
||||
try {
|
||||
var password_policy = await window.fetch("/api/v1/get/passwordpolicy", { method:'GET', cache:'no-cache' });
|
||||
var password_policy = await password_policy.json();
|
||||
random_passwd_length = password_policy.length;
|
||||
} catch(err) {
|
||||
var random_passwd_length = 8;
|
||||
}
|
||||
|
||||
event.preventDefault();
|
||||
$('[data-hibp]').trigger('input');
|
||||
if (typeof($(this).closest("form").data('pwgen-length')) == "number") {
|
||||
var random_passwd = GPW.pronounceable($(this).closest("form").data('pwgen-length'))
|
||||
}
|
||||
else {
|
||||
var random_passwd = GPW.pronounceable(8)
|
||||
var random_passwd = GPW.pronounceable(random_passwd_length)
|
||||
}
|
||||
$(this).closest("form").find('[data-pwgen-field]').attr('type', 'text');
|
||||
$(this).closest("form").find('[data-pwgen-field]').val(random_passwd);
|
||||
@ -278,6 +286,8 @@ $(document).ready(function() {
|
||||
$.extend($.fn.dataTable.defaults, {
|
||||
responsive: true
|
||||
});
|
||||
// disable default datatable click listener
|
||||
$(document).off('click', 'tbody>tr');
|
||||
|
||||
// tag boxes
|
||||
$('.tag-box .tag-add').click(function(){
|
||||
|
@ -70,8 +70,13 @@ jQuery(function($){
|
||||
}
|
||||
|
||||
$('#domainadminstable').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
ajax: {
|
||||
type: "GET",
|
||||
@ -143,8 +148,13 @@ jQuery(function($){
|
||||
}
|
||||
|
||||
$('#oauth2clientstable').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
ajax: {
|
||||
type: "GET",
|
||||
@ -206,8 +216,13 @@ jQuery(function($){
|
||||
}
|
||||
|
||||
$('#adminstable').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
ajax: {
|
||||
type: "GET",
|
||||
@ -272,8 +287,13 @@ jQuery(function($){
|
||||
}
|
||||
|
||||
$('#forwardinghoststable').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
ajax: {
|
||||
type: "GET",
|
||||
@ -311,7 +331,10 @@ jQuery(function($){
|
||||
{
|
||||
title: lang.spamfilter,
|
||||
data: 'keep_spam',
|
||||
defaultContent: ''
|
||||
defaultContent: '',
|
||||
render: function(data, type){
|
||||
return 'yes'==data?'<i class="bi bi-x-lg"></i>':'no'==data&&'<i class="bi bi-check-lg"></i>';
|
||||
}
|
||||
},
|
||||
{
|
||||
title: lang.action,
|
||||
@ -330,8 +353,13 @@ jQuery(function($){
|
||||
}
|
||||
|
||||
$('#relayhoststable').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
ajax: {
|
||||
type: "GET",
|
||||
@ -402,8 +430,13 @@ jQuery(function($){
|
||||
}
|
||||
|
||||
$('#transportstable').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
ajax: {
|
||||
type: "GET",
|
||||
|
@ -51,7 +51,40 @@ $(document).ready(function() {
|
||||
showVersionModal("Version " + mailcow_info.version_tag, mailcow_info.version_tag);
|
||||
})
|
||||
// get public ips
|
||||
get_public_ips();
|
||||
$("#host_show_ip").click(function(){
|
||||
$("#host_show_ip").find(".text").addClass("d-none");
|
||||
$("#host_show_ip").find(".spinner-border").removeClass("d-none");
|
||||
|
||||
window.fetch("/api/v1/get/status/host/ip", { method:'GET', cache:'no-cache' }).then(function(response) {
|
||||
return response.json();
|
||||
}).then(function(data) {
|
||||
console.log(data);
|
||||
|
||||
// display host ips
|
||||
if (data.ipv4)
|
||||
$("#host_ipv4").text(data.ipv4);
|
||||
if (data.ipv6)
|
||||
$("#host_ipv6").text(data.ipv6);
|
||||
|
||||
$("#host_show_ip").addClass("d-none");
|
||||
$("#host_show_ip").find(".text").removeClass("d-none");
|
||||
$("#host_show_ip").find(".spinner-border").addClass("d-none");
|
||||
$("#host_ipv4").removeClass("d-none");
|
||||
$("#host_ipv6").removeClass("d-none");
|
||||
$("#host_ipv6").removeClass("text-danger");
|
||||
$("#host_ipv4").addClass("d-block");
|
||||
$("#host_ipv6").addClass("d-block");
|
||||
}).catch(function(error){
|
||||
console.log(error);
|
||||
|
||||
$("#host_ipv6").removeClass("d-none");
|
||||
$("#host_ipv6").addClass("d-block");
|
||||
$("#host_ipv6").addClass("text-danger");
|
||||
$("#host_ipv6").text(lang_debug.error_show_ip);
|
||||
$("#host_show_ip").find(".text").removeClass("d-none");
|
||||
$("#host_show_ip").find(".spinner-border").addClass("d-none");
|
||||
});
|
||||
});
|
||||
update_container_stats();
|
||||
});
|
||||
jQuery(function($){
|
||||
@ -85,11 +118,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#autodiscover_log').DataTable({
|
||||
var table = $('#autodiscover_log').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order: [[0, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-autodiscover-logs', '#autodiscover_log');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/logs/autodiscover/100",
|
||||
@ -134,6 +175,10 @@ jQuery(function($){
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-autodiscover-logs', '#autodiscover_log');
|
||||
});
|
||||
}
|
||||
function draw_postfix_logs() {
|
||||
// just recalc width if instance already exists
|
||||
@ -142,11 +187,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#postfix_log').DataTable({
|
||||
var table = $('#postfix_log').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order: [[0, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-postfix-logs', '#postfix_log');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/logs/postfix",
|
||||
@ -176,6 +229,10 @@ jQuery(function($){
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-postfix-logs', '#postfix_log');
|
||||
});
|
||||
}
|
||||
function draw_watchdog_logs() {
|
||||
// just recalc width if instance already exists
|
||||
@ -184,11 +241,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#watchdog_log').DataTable({
|
||||
var table = $('#watchdog_log').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order: [[0, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-watchdog-logs', '#watchdog_log');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/logs/watchdog",
|
||||
@ -222,6 +287,10 @@ jQuery(function($){
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-watchdog-logs', '#watchdog_log');
|
||||
});
|
||||
}
|
||||
function draw_api_logs() {
|
||||
// just recalc width if instance already exists
|
||||
@ -230,11 +299,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#api_log').DataTable({
|
||||
var table = $('#api_log').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order: [[0, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-api-logs', '#api_log');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/logs/api",
|
||||
@ -275,6 +352,10 @@ jQuery(function($){
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-api-logs', '#api_log');
|
||||
});
|
||||
}
|
||||
function draw_rl_logs() {
|
||||
// just recalc width if instance already exists
|
||||
@ -283,11 +364,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#rl_log').DataTable({
|
||||
var table = $('#rl_log').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order: [[0, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-rl-logs', '#rl_log');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/logs/ratelimited",
|
||||
@ -366,6 +455,10 @@ jQuery(function($){
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-rl-logs', '#rl_log');
|
||||
});
|
||||
}
|
||||
function draw_ui_logs() {
|
||||
// just recalc width if instance already exists
|
||||
@ -374,11 +467,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#ui_logs').DataTable({
|
||||
var table = $('#ui_logs').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order: [[0, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-ui-logs', '#ui_logs');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/logs/ui",
|
||||
@ -437,6 +538,10 @@ jQuery(function($){
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-ui-logs', '#ui_log');
|
||||
});
|
||||
}
|
||||
function draw_sasl_logs() {
|
||||
// just recalc width if instance already exists
|
||||
@ -445,11 +550,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#sasl_logs').DataTable({
|
||||
var table = $('#sasl_logs').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order: [[0, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-sasl-logs', '#sasl_logs');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/logs/sasl",
|
||||
@ -479,12 +592,16 @@ jQuery(function($){
|
||||
data: 'datetime',
|
||||
defaultContent: '',
|
||||
createdCell: function(td, cellData) {
|
||||
cellData = Math.floor((new Date(data.replace(/-/g, "/"))).getTime() / 1000);
|
||||
cellData = Math.floor((new Date(cellData.replace(/-/g, "/"))).getTime() / 1000);
|
||||
createSortableDate(td, cellData)
|
||||
}
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-sasl-logs', '#sasl_logs');
|
||||
});
|
||||
}
|
||||
function draw_acme_logs() {
|
||||
// just recalc width if instance already exists
|
||||
@ -493,11 +610,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#acme_log').DataTable({
|
||||
var table = $('#acme_log').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order: [[0, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-acme-logs', '#acme_log');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/logs/acme",
|
||||
@ -522,6 +647,10 @@ jQuery(function($){
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-acme-logs', '#acme_log');
|
||||
});
|
||||
}
|
||||
function draw_netfilter_logs() {
|
||||
// just recalc width if instance already exists
|
||||
@ -530,11 +659,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#netfilter_log').DataTable({
|
||||
var table = $('#netfilter_log').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order: [[0, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-netfilter-logs', '#netfilter_log');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/logs/netfilter",
|
||||
@ -564,6 +701,10 @@ jQuery(function($){
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-netfilter-logs', '#netfilter_log');
|
||||
});
|
||||
}
|
||||
function draw_sogo_logs() {
|
||||
// just recalc width if instance already exists
|
||||
@ -572,11 +713,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#sogo_log').DataTable({
|
||||
var table = $('#sogo_log').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order: [[0, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-sogo-logs', '#sogo_log');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/logs/sogo",
|
||||
@ -606,6 +755,10 @@ jQuery(function($){
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-sogo-logs', '#sogo_log');
|
||||
});
|
||||
}
|
||||
function draw_dovecot_logs() {
|
||||
// just recalc width if instance already exists
|
||||
@ -614,11 +767,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#dovecot_log').DataTable({
|
||||
var table = $('#dovecot_log').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order: [[0, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-dovecot-logs', '#dovecot_log');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/logs/dovecot",
|
||||
@ -648,6 +809,10 @@ jQuery(function($){
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-dovecot-logs', '#dovecot_log');
|
||||
});
|
||||
}
|
||||
function rspamd_pie_graph() {
|
||||
$.ajax({
|
||||
@ -717,11 +882,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#rspamd_history').DataTable({
|
||||
var table = $('#rspamd_history').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order: [[0, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-rspamd-logs', '#rspamd_history');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/logs/rspamd-history",
|
||||
@ -810,6 +983,10 @@ jQuery(function($){
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-rspamd-history', '#rspamd_history');
|
||||
});
|
||||
}
|
||||
function process_table_data(data, table) {
|
||||
if (table == 'rspamd_history') {
|
||||
@ -1005,6 +1182,12 @@ jQuery(function($){
|
||||
});
|
||||
}
|
||||
})
|
||||
function hideTableExpandCollapseBtn(tab, table){
|
||||
if ($(table).hasClass('collapsed'))
|
||||
$(tab).find(".table_collapse_option").show();
|
||||
else
|
||||
$(tab).find(".table_collapse_option").hide();
|
||||
}
|
||||
|
||||
// detect element visibility changes
|
||||
function onVisible(element, callback) {
|
||||
@ -1224,20 +1407,6 @@ function update_container_stats(timeout=5){
|
||||
// run again in n seconds
|
||||
setTimeout(update_container_stats, timeout * 1000);
|
||||
}
|
||||
// get public ips
|
||||
function get_public_ips(){
|
||||
window.fetch("/api/v1/get/status/host/ip", {method:'GET',cache:'no-cache'}).then(function(response) {
|
||||
return response.json();
|
||||
}).then(function(data) {
|
||||
console.log(data);
|
||||
|
||||
// display host ips
|
||||
if (data.ipv4)
|
||||
$("#host_ipv4").text(data.ipv4);
|
||||
if (data.ipv6)
|
||||
$("#host_ipv6").text(data.ipv6);
|
||||
});
|
||||
}
|
||||
// format hosts uptime seconds to readable string
|
||||
function formatUptime(seconds){
|
||||
seconds = Number(seconds);
|
||||
|
@ -78,8 +78,13 @@ jQuery(function($){
|
||||
}
|
||||
function draw_wl_policy_domain_table() {
|
||||
$('#wl_policy_domain_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
ajax: {
|
||||
type: "GET",
|
||||
@ -133,8 +138,13 @@ jQuery(function($){
|
||||
}
|
||||
function draw_bl_policy_domain_table() {
|
||||
$('#bl_policy_domain_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
ajax: {
|
||||
type: "GET",
|
||||
|
@ -433,9 +433,17 @@ jQuery(function($){
|
||||
}
|
||||
|
||||
var table = $('#domain_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-domains', '#domain_table');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/domain/all",
|
||||
@ -609,7 +617,11 @@ jQuery(function($){
|
||||
defaultContent: ''
|
||||
},
|
||||
]
|
||||
});
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-domains', '#domain_table');
|
||||
});
|
||||
}
|
||||
function draw_templates_domain_table() {
|
||||
// just recalc width if instance already exists
|
||||
@ -618,11 +630,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#templates_domain_table').DataTable({
|
||||
responsive : true,
|
||||
var table = $('#templates_domain_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order:[[2, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-templates-domains', '#templates_domain_table');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/domain/template/all",
|
||||
@ -807,6 +827,10 @@ jQuery(function($){
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-templates-domains', '#templates_domain_table');
|
||||
});
|
||||
}
|
||||
function draw_mailbox_table() {
|
||||
// just recalc width if instance already exists
|
||||
@ -815,17 +839,30 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#mailbox_table').DataTable({
|
||||
responsive : true,
|
||||
var table = $('#mailbox_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-mailboxes', '#mailbox_table');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/mailbox/reduced",
|
||||
dataSrc: function(json){
|
||||
$.each(json, function (i, item) {
|
||||
item.quota = item.quota_used + "/" + item.quota;
|
||||
item.quota = {
|
||||
sortBy: item.quota_used,
|
||||
value: item.quota
|
||||
}
|
||||
item.quota.value = (item.quota.value == 0 ? "∞" : humanFileSize(item.quota.value));
|
||||
item.quota.value = humanFileSize(item.quota_used) + "/" + item.quota.value;
|
||||
|
||||
item.max_quota_for_mbox = humanFileSize(item.max_quota_for_mbox);
|
||||
item.last_mail_login = item.last_imap_login + '/' + item.last_pop3_login + '/' + item.last_smtp_login;
|
||||
/*
|
||||
@ -930,14 +967,10 @@ jQuery(function($){
|
||||
},
|
||||
{
|
||||
title: lang.domain_quota,
|
||||
data: 'quota',
|
||||
data: 'quota.value',
|
||||
responsivePriority: 8,
|
||||
defaultContent: '',
|
||||
render: function (data, type) {
|
||||
data = data.split("/");
|
||||
var of_q = (data[1] == 0 ? "∞" : humanFileSize(data[1]));
|
||||
return humanFileSize(data[0]) + " / " + of_q;
|
||||
}
|
||||
defaultContent: '',
|
||||
orderData: 23
|
||||
},
|
||||
{
|
||||
title: lang.last_mail_login,
|
||||
@ -1063,8 +1096,19 @@ jQuery(function($){
|
||||
responsivePriority: 6,
|
||||
defaultContent: ''
|
||||
},
|
||||
{
|
||||
title: "",
|
||||
data: 'quota.sortBy',
|
||||
responsivePriority: 8,
|
||||
defaultContent: '',
|
||||
className: "d-none"
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-mailboxes', '#mailbox_table');
|
||||
});
|
||||
}
|
||||
function draw_templates_mbox_table() {
|
||||
// just recalc width if instance already exists
|
||||
@ -1073,11 +1117,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#templates_mbox_table').DataTable({
|
||||
responsive : true,
|
||||
var table = $('#templates_mbox_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order:[[2, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-templates-mbox', '#templates_mbox_table');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/mailbox/template/all",
|
||||
@ -1276,6 +1328,10 @@ jQuery(function($){
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-templates-mbox', '#templates_mbox_table');
|
||||
});
|
||||
}
|
||||
function draw_resource_table() {
|
||||
// just recalc width if instance already exists
|
||||
@ -1284,10 +1340,18 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#resource_table').DataTable({
|
||||
var table = $('#resource_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-resources', '#resource_table');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/resource/all",
|
||||
@ -1374,6 +1438,10 @@ jQuery(function($){
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-resources', '#resource_table');
|
||||
});
|
||||
}
|
||||
function draw_bcc_table() {
|
||||
$.get("/api/v1/get/bcc-destination-options", function(data){
|
||||
@ -1410,10 +1478,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#bcc_table').DataTable({
|
||||
var table = $('#bcc_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order:[[2, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#collapse-tab-bcc', '#bcc_table');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/bcc/all",
|
||||
@ -1498,6 +1575,10 @@ jQuery(function($){
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#collapse-tab-bcc', '#bcc_table');
|
||||
});
|
||||
}
|
||||
function draw_recipient_map_table() {
|
||||
// just recalc width if instance already exists
|
||||
@ -1506,10 +1587,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#recipient_map_table').DataTable({
|
||||
var table = $('#recipient_map_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order:[[2, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#collapse-tab-bcc-filters', '#recipient_map_table');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/recipient_map/all",
|
||||
@ -1581,6 +1671,10 @@ jQuery(function($){
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#collapse-tab-bcc-filters', '#recipient_map_table');
|
||||
});
|
||||
}
|
||||
function draw_tls_policy_table() {
|
||||
// just recalc width if instance already exists
|
||||
@ -1589,10 +1683,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#tls_policy_table').DataTable({
|
||||
var table = $('#tls_policy_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order:[[2, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-tls-policy', '#tls_policy_table');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/tls-policy-map/all",
|
||||
@ -1674,6 +1777,10 @@ jQuery(function($){
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-tls-policy', '#tls_policy_table');
|
||||
});
|
||||
}
|
||||
function draw_alias_table() {
|
||||
// just recalc width if instance already exists
|
||||
@ -1682,10 +1789,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#alias_table').DataTable({
|
||||
var table = $('#alias_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order:[[2, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-mbox-aliases', '#alias_table');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/alias/all",
|
||||
@ -1814,6 +1930,10 @@ jQuery(function($){
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-mbox-aliases', '#alias_table');
|
||||
});
|
||||
}
|
||||
function draw_aliasdomain_table() {
|
||||
// just recalc width if instance already exists
|
||||
@ -1822,10 +1942,18 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#aliasdomain_table').DataTable({
|
||||
var table = $('#aliasdomain_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-domain-aliases', '#aliasdomain_table');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/alias-domain/all",
|
||||
@ -1896,6 +2024,10 @@ jQuery(function($){
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-domain-aliases', '#aliasdomain_table');
|
||||
});
|
||||
}
|
||||
function draw_sync_job_table() {
|
||||
// just recalc width if instance already exists
|
||||
@ -1904,10 +2036,19 @@ jQuery(function($){
|
||||
return;
|
||||
}
|
||||
|
||||
$('#sync_job_table').DataTable({
|
||||
var table = $('#sync_job_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order:[[2, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-syncjobs', '#sync_job_table');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/syncjobs/all/no_log",
|
||||
@ -2035,6 +2176,10 @@ jQuery(function($){
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-syncjobs', '#sync_job_table');
|
||||
});
|
||||
}
|
||||
function draw_filter_table() {
|
||||
// just recalc width if instance already exists
|
||||
@ -2044,10 +2189,19 @@ jQuery(function($){
|
||||
}
|
||||
|
||||
var table = $('#filter_table').DataTable({
|
||||
responsive: true,
|
||||
autoWidth: false,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
order:[[2, 'desc']],
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#tab-filters', '#filter_table');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/filters/all",
|
||||
@ -2132,8 +2286,19 @@ jQuery(function($){
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#tab-filters', '#filter_table');
|
||||
});
|
||||
};
|
||||
|
||||
function hideTableExpandCollapseBtn(tab, table){
|
||||
if ($(table).hasClass('collapsed'))
|
||||
$(tab).find(".table_collapse_option").show();
|
||||
else
|
||||
$(tab).find(".table_collapse_option").hide();
|
||||
}
|
||||
|
||||
// detect element visibility changes
|
||||
function onVisible(element, callback) {
|
||||
$(document).ready(function() {
|
||||
|
@ -13,10 +13,18 @@ jQuery(function($){
|
||||
$('#' + table_name).DataTable().ajax.reload();
|
||||
});
|
||||
function draw_quarantine_table() {
|
||||
$('#quarantinetable').DataTable({
|
||||
var table = $('#quarantinetable').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
initComplete: function(){
|
||||
hideTableExpandCollapseBtn('#quarantinetable');
|
||||
},
|
||||
ajax: {
|
||||
type: "GET",
|
||||
url: "/api/v1/get/quarantine/all",
|
||||
@ -129,9 +137,15 @@ jQuery(function($){
|
||||
title: lang.received,
|
||||
data: 'created',
|
||||
defaultContent: '',
|
||||
render: function (data,type) {
|
||||
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"});
|
||||
createdCell: function(td, cellData) {
|
||||
$(td).attr({
|
||||
"data-order": cellData,
|
||||
"data-sort": cellData
|
||||
});
|
||||
|
||||
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"});
|
||||
$(td).html(dateString);
|
||||
}
|
||||
},
|
||||
{
|
||||
@ -142,6 +156,10 @@ jQuery(function($){
|
||||
},
|
||||
]
|
||||
});
|
||||
|
||||
table.on('responsive-resize', function (e, datatable, columns){
|
||||
hideTableExpandCollapseBtn('#quarantinetable');
|
||||
});
|
||||
}
|
||||
|
||||
$('body').on('click', '.show_qid_info', function (e) {
|
||||
@ -257,4 +275,12 @@ jQuery(function($){
|
||||
|
||||
// Initial table drawings
|
||||
draw_quarantine_table();
|
||||
|
||||
|
||||
function hideTableExpandCollapseBtn(table){
|
||||
if ($(table).hasClass('collapsed'))
|
||||
$(".table_collapse_option").show();
|
||||
else
|
||||
$(".table_collapse_option").hide();
|
||||
}
|
||||
});
|
||||
|
@ -35,8 +35,13 @@ jQuery(function($){
|
||||
}
|
||||
|
||||
$('#queuetable').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
ajax: {
|
||||
type: "GET",
|
||||
|
@ -135,8 +135,13 @@ jQuery(function($){
|
||||
}
|
||||
|
||||
$('#tla_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
ajax: {
|
||||
type: "GET",
|
||||
@ -216,8 +221,13 @@ jQuery(function($){
|
||||
}
|
||||
|
||||
$('#sync_job_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
ajax: {
|
||||
type: "GET",
|
||||
@ -366,8 +376,13 @@ jQuery(function($){
|
||||
}
|
||||
|
||||
$('#app_passwd_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
ajax: {
|
||||
type: "GET",
|
||||
@ -456,8 +471,13 @@ jQuery(function($){
|
||||
}
|
||||
|
||||
$('#wl_policy_mailbox_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
ajax: {
|
||||
type: "GET",
|
||||
@ -521,8 +541,13 @@ jQuery(function($){
|
||||
}
|
||||
|
||||
$('#bl_policy_mailbox_table').DataTable({
|
||||
responsive: true,
|
||||
processing: true,
|
||||
serverSide: false,
|
||||
stateSave: true,
|
||||
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>>",
|
||||
language: lang_datatables,
|
||||
ajax: {
|
||||
type: "GET",
|
||||
|
@ -561,6 +561,15 @@ if (isset($_GET['query'])) {
|
||||
echo '{}';
|
||||
}
|
||||
break;
|
||||
default:
|
||||
$password_complexity_rules = password_complexity('get');
|
||||
if ($password_complexity_rules !== false) {
|
||||
process_get_return($password_complexity_rules);
|
||||
}
|
||||
else {
|
||||
echo '{}';
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
@ -1544,14 +1553,15 @@ if (isset($_GET['query'])) {
|
||||
}
|
||||
else if ($extra == "ip") {
|
||||
// get public ips
|
||||
|
||||
$curl = curl_init();
|
||||
curl_setopt($curl, CURLOPT_URL, 'http://ipv4.mailcow.email');
|
||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($curl, CURLOPT_POST, 0);
|
||||
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
|
||||
curl_setopt($curl, CURLOPT_TIMEOUT, 15);
|
||||
curl_setopt($curl, CURLOPT_URL, 'http://ipv4.mailcow.email');
|
||||
$ipv4 = curl_exec($curl);
|
||||
curl_setopt($curl, CURLOPT_URL, 'http://ipv6.mailcow.email');
|
||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
||||
curl_setopt($curl, CURLOPT_POST, 0);
|
||||
$ipv6 = curl_exec($curl);
|
||||
$ips = array(
|
||||
"ipv4" => $ipv4,
|
||||
@ -1913,6 +1923,9 @@ if (isset($_GET['query'])) {
|
||||
case "ui_texts":
|
||||
process_edit_return(customize('edit', 'ui_texts', $attr));
|
||||
break;
|
||||
case "ip_check":
|
||||
process_edit_return(customize('edit', 'ip_check', $attr));
|
||||
break;
|
||||
case "self":
|
||||
if ($_SESSION['mailcow_cc_role'] == "domainadmin") {
|
||||
process_edit_return(domain_admin('edit', $attr));
|
||||
|
@ -204,6 +204,9 @@
|
||||
"include_exclude": "Ein- und Ausschlüsse",
|
||||
"include_exclude_info": "Ohne Auswahl werden <b>alle Mailboxen</b> adressiert.",
|
||||
"includes": "Diese Empfänger einschließen",
|
||||
"ip_check": "IP Check",
|
||||
"ip_check_disabled": "IP check ist deaktiviert. Unter dem angegebenen Pfad kann es aktiviert werden<br> <strong>System > Konfiguration > Einstellungen > UI-Anpassung</strong>",
|
||||
"ip_check_opt_in": "Opt-In für die Nutzung der Drittanbieter-Dienste <strong>ipv4.mailcow.email</strong> und <strong>ipv6.mailcow.email</strong> zur Auflösung externer IP-Adressen.",
|
||||
"is_mx_based": "MX-basiert",
|
||||
"last_applied": "Zuletzt angewendet",
|
||||
"license_info": "Eine Lizenz ist nicht erforderlich, hilft jedoch der Entwicklung mailcows.<br><a href=\"https://www.servercow.de/mailcow#sal\" target=\"_blank\" alt=\"SAL Bestellung\">Hier kann die mailcow-GUID registriert werden.</a> Alternativ ist <a href=\"https://www.servercow.de/mailcow#support\" target=\"_blank\" alt=\"SAL Bestellung\">die Bestellung von Support-Paketen möglich</a>.",
|
||||
@ -363,6 +366,7 @@
|
||||
"domain_not_empty": "Domain %s ist nicht leer",
|
||||
"domain_not_found": "Domain %s nicht gefunden",
|
||||
"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",
|
||||
"extra_acl_invalid": "Externe Absenderadresse \"%s\" ist ungültig",
|
||||
"extra_acl_invalid_domain": "Externe Absenderadresse \"%s\" verwendet eine ungültige Domain",
|
||||
"fido2_verification_failed": "FIDO2-Verifizierung fehlgeschlagen: %s",
|
||||
@ -459,30 +463,30 @@
|
||||
"yotp_verification_failed": "Yubico OTP-Verifizierung fehlgeschlagen: %s"
|
||||
},
|
||||
"datatables": {
|
||||
"collapse_all": "Alle Einklappen",
|
||||
"decimal": "",
|
||||
"emptyTable": "Keine Daten in der Tabelle vorhanden",
|
||||
"expand_all": "Alle Ausklappen",
|
||||
"info": "_START_ bis _END_ von _TOTAL_ Einträgen",
|
||||
"infoEmpty": "0 bis 0 von 0 Einträgen",
|
||||
"infoFiltered": "(gefiltert von _MAX_ Einträgen)",
|
||||
"infoPostFix": "",
|
||||
"thousands": ".",
|
||||
"lengthMenu": "_MENU_ Einträge anzeigen",
|
||||
"loadingRecords": "Wird geladen...",
|
||||
"processing": "Bitte warten...",
|
||||
"search": "Suchen",
|
||||
"zeroRecords": "Keine Einträge vorhanden.",
|
||||
"paginate": {
|
||||
"first": "Erste",
|
||||
"previous": "Zurück",
|
||||
"next": "Nächste",
|
||||
"last": "Letzte"
|
||||
},
|
||||
"aria": {
|
||||
"sortAscending": ": aktivieren, um Spalte aufsteigend zu sortieren",
|
||||
"sortDescending": ": aktivieren, um Spalte absteigend zu sortieren"
|
||||
}
|
||||
"collapse_all": "Alle Einklappen",
|
||||
"decimal": "",
|
||||
"emptyTable": "Keine Daten in der Tabelle vorhanden",
|
||||
"expand_all": "Alle Ausklappen",
|
||||
"info": "_START_ bis _END_ von _TOTAL_ Einträgen",
|
||||
"infoEmpty": "0 bis 0 von 0 Einträgen",
|
||||
"infoFiltered": "(gefiltert von _MAX_ Einträgen)",
|
||||
"infoPostFix": "",
|
||||
"thousands": ".",
|
||||
"lengthMenu": "_MENU_ Einträge anzeigen",
|
||||
"loadingRecords": "Wird geladen...",
|
||||
"processing": "Bitte warten...",
|
||||
"search": "Suchen",
|
||||
"zeroRecords": "Keine Einträge vorhanden.",
|
||||
"paginate": {
|
||||
"first": "Erste",
|
||||
"previous": "Zurück",
|
||||
"next": "Nächste",
|
||||
"last": "Letzte"
|
||||
},
|
||||
"aria": {
|
||||
"sortAscending": ": aktivieren, um Spalte aufsteigend zu sortieren",
|
||||
"sortDescending": ": aktivieren, um Spalte absteigend zu sortieren"
|
||||
}
|
||||
},
|
||||
"debug": {
|
||||
"chart_this_server": "Chart (dieser Server)",
|
||||
@ -494,6 +498,7 @@
|
||||
"current_time": "Systemzeit",
|
||||
"disk_usage": "Festplattennutzung",
|
||||
"docs": "Dokumente",
|
||||
"error_show_ip": "konnte die öffentlichen IP Adressen nicht auflösen",
|
||||
"external_logs": "Externe Logs",
|
||||
"history_all_servers": "History (alle Server)",
|
||||
"in_memory_logs": "In-memory Logs",
|
||||
@ -506,6 +511,7 @@
|
||||
"online_users": "Benutzer online",
|
||||
"restart_container": "Neustart",
|
||||
"service": "Dienst",
|
||||
"show_ip": "Zeige öffentliche IP",
|
||||
"size": "Größe",
|
||||
"solr_dead": "Solr startet, ist deaktiviert oder temporär nicht erreichbar.",
|
||||
"solr_status": "Solr Status",
|
||||
@ -942,7 +948,7 @@
|
||||
"queue": {
|
||||
"delete": "Queue löschen",
|
||||
"flush": "Queue flushen",
|
||||
"info" : "In der Mailqueue befinden sich alle E-Mails, welche auf eine Zustellung warten. Sollte eine E-Mail eine längere Zeit innerhalb der Mailqueue stecken wird diese automatisch vom System gelöscht.<br>Die Fehlermeldung der jeweiligen Mail gibt aufschluss darüber, warum diese nicht zugestellt werden konnte",
|
||||
"info": "In der Mailqueue befinden sich alle E-Mails, welche auf eine Zustellung warten. Sollte eine E-Mail eine längere Zeit innerhalb der Mailqueue stecken wird diese automatisch vom System gelöscht.<br>Die Fehlermeldung der jeweiligen Mail gibt aufschluss darüber, warum diese nicht zugestellt werden konnte",
|
||||
"legend": "Funktionen der Mailqueue Aktionen:",
|
||||
"ays": "Soll die derzeitige Queue wirklich komplett bereinigt werden?",
|
||||
"deliver_mail": "Ausliefern",
|
||||
@ -1001,6 +1007,7 @@
|
||||
"forwarding_host_removed": "Weiterleitungs-Host %s wurde entfernt",
|
||||
"global_filter_written": "Filterdatei wurde erfolgreich geschrieben",
|
||||
"hash_deleted": "Hash wurde gelöscht",
|
||||
"ip_check_opt_in_modified": "IP Check wurde erfolgreich gespeichert",
|
||||
"item_deleted": "Objekt %s wurde entfernt",
|
||||
"item_released": "Objekt %s freigegeben",
|
||||
"items_deleted": "Objekt(e) %s wurde(n) erfolgreich entfernt",
|
||||
|
@ -206,6 +206,9 @@
|
||||
"include_exclude": "Include/Exclude",
|
||||
"include_exclude_info": "By default - with no selection - <b>all mailboxes</b> are addressed",
|
||||
"includes": "Include these recipients",
|
||||
"ip_check": "IP Check",
|
||||
"ip_check_disabled": "IP check is disabled. You can enable it under<br> <strong>System > Configuration > Options > Customize</strong>",
|
||||
"ip_check_opt_in": "Opt-In for using third party service <strong>ipv4.mailcow.email</strong> and <strong>ipv6.mailcow.email</strong> to resolve external IP addresses.",
|
||||
"is_mx_based": "MX based",
|
||||
"last_applied": "Last applied",
|
||||
"license_info": "A license is not required but helps further development.<br><a href=\"https://www.servercow.de/mailcow?lang=en#sal\" target=\"_blank\" alt=\"SAL order\">Register your GUID here</a> or <a href=\"https://www.servercow.de/mailcow?lang=en#support\" target=\"_blank\" alt=\"Support order\">buy support for your mailcow installation.</a>",
|
||||
@ -264,6 +267,7 @@
|
||||
"quota_notifications": "Quota notifications",
|
||||
"quota_notifications_info": "Quota notifications are sent to users once when crossing 80% and once when crossing 95% usage.",
|
||||
"quota_notifications_vars": "{{percent}} equals the current quota of the user<br>{{username}} is the mailbox name",
|
||||
"queue_unban": "unban",
|
||||
"r_active": "Active restrictions",
|
||||
"r_inactive": "Inactive restrictions",
|
||||
"r_info": "Greyed out/disabled elements on the list of active restrictions are not known as valid restrictions to mailcow and cannot be moved. Unknown restrictions will be set in order of appearance anyway. <br>You can add new elements in <code>inc/vars.local.inc.php</code> to be able to toggle them.",
|
||||
@ -363,6 +367,7 @@
|
||||
"domain_not_empty": "Cannot remove non-empty domain %s",
|
||||
"domain_not_found": "Domain %s not found",
|
||||
"domain_quota_m_in_use": "Domain quota must be greater or equal to %s MiB",
|
||||
"extended_sender_acl_denied": "missing ACL to set external sender addresses",
|
||||
"extra_acl_invalid": "External sender address \"%s\" is invalid",
|
||||
"extra_acl_invalid_domain": "External sender \"%s\" uses an invalid domain",
|
||||
"fido2_verification_failed": "FIDO2 verification failed: %s",
|
||||
@ -462,30 +467,30 @@
|
||||
"yotp_verification_failed": "Yubico OTP verification failed: %s"
|
||||
},
|
||||
"datatables": {
|
||||
"collapse_all": "Collapse All",
|
||||
"decimal": "",
|
||||
"emptyTable": "No data available in table",
|
||||
"expand_all": "Expand All",
|
||||
"info": "Showing _START_ to _END_ of _TOTAL_ entries",
|
||||
"infoEmpty": "Showing 0 to 0 of 0 entries",
|
||||
"infoFiltered": "(filtered from _MAX_ total entries)",
|
||||
"infoPostFix": "",
|
||||
"thousands": ",",
|
||||
"lengthMenu": "Show _MENU_ entries",
|
||||
"loadingRecords": "Loading...",
|
||||
"processing": "Please wait...",
|
||||
"search": "Search:",
|
||||
"zeroRecords": "No matching records found",
|
||||
"paginate": {
|
||||
"first": "First",
|
||||
"last": "Last",
|
||||
"next": "Next",
|
||||
"previous": "Previous"
|
||||
},
|
||||
"aria": {
|
||||
"sortAscending": ": activate to sort column ascending",
|
||||
"sortDescending": ": activate to sort column descending"
|
||||
}
|
||||
"collapse_all": "Collapse All",
|
||||
"decimal": "",
|
||||
"emptyTable": "No data available in table",
|
||||
"expand_all": "Expand All",
|
||||
"info": "Showing _START_ to _END_ of _TOTAL_ entries",
|
||||
"infoEmpty": "Showing 0 to 0 of 0 entries",
|
||||
"infoFiltered": "(filtered from _MAX_ total entries)",
|
||||
"infoPostFix": "",
|
||||
"thousands": ",",
|
||||
"lengthMenu": "Show _MENU_ entries",
|
||||
"loadingRecords": "Loading...",
|
||||
"processing": "Please wait...",
|
||||
"search": "Search:",
|
||||
"zeroRecords": "No matching records found",
|
||||
"paginate": {
|
||||
"first": "First",
|
||||
"last": "Last",
|
||||
"next": "Next",
|
||||
"previous": "Previous"
|
||||
},
|
||||
"aria": {
|
||||
"sortAscending": ": activate to sort column ascending",
|
||||
"sortDescending": ": activate to sort column descending"
|
||||
}
|
||||
},
|
||||
"debug": {
|
||||
"chart_this_server": "Chart (this server)",
|
||||
@ -497,6 +502,7 @@
|
||||
"current_time": "System Time",
|
||||
"disk_usage": "Disk usage",
|
||||
"docs": "Docs",
|
||||
"error_show_ip": "Could not resolve the public IP addresses",
|
||||
"external_logs": "External logs",
|
||||
"history_all_servers": "History (all servers)",
|
||||
"in_memory_logs": "In-memory logs",
|
||||
@ -509,6 +515,7 @@
|
||||
"online_users": "Users online",
|
||||
"restart_container": "Restart",
|
||||
"service": "Service",
|
||||
"show_ip": "Show public IP",
|
||||
"size": "Size",
|
||||
"solr_dead": "Solr is starting, disabled or died.",
|
||||
"solr_status": "Solr status",
|
||||
@ -947,7 +954,7 @@
|
||||
"queue": {
|
||||
"delete": "Delete all",
|
||||
"flush": "Flush queue",
|
||||
"info" : "The mail queue contains all e-mails that are waiting for delivery. If an email is stuck in the mail queue for a long time, it is automatically deleted by the system.<br>The error message of the respective mail gives information about why the mail could not be delivered.",
|
||||
"info": "The mail queue contains all e-mails that are waiting for delivery. If an email is stuck in the mail queue for a long time, it is automatically deleted by the system.<br>The error message of the respective mail gives information about why the mail could not be delivered.",
|
||||
"legend": "Mail queue actions functions:",
|
||||
"ays": "Please confirm you want to delete all items from the current queue.",
|
||||
"deliver_mail": "Deliver",
|
||||
@ -961,11 +968,11 @@
|
||||
"unhold_mail_legend": "Releases selected mails for delivery. (Requires prior hold)"
|
||||
},
|
||||
"ratelimit": {
|
||||
"disabled": "Disabled",
|
||||
"second": "msgs / second",
|
||||
"minute": "msgs / minute",
|
||||
"hour": "msgs / hour",
|
||||
"day": "msgs / day"
|
||||
"disabled": "Disabled",
|
||||
"second": "msgs / second",
|
||||
"minute": "msgs / minute",
|
||||
"hour": "msgs / hour",
|
||||
"day": "msgs / day"
|
||||
},
|
||||
"start": {
|
||||
"help": "Show/Hide help panel",
|
||||
@ -1013,6 +1020,7 @@
|
||||
"forwarding_host_removed": "Forwarding host %s has been removed",
|
||||
"global_filter_written": "Filter was successfully written to file",
|
||||
"hash_deleted": "Hash deleted",
|
||||
"ip_check_opt_in_modified": "IP check was saved successfully",
|
||||
"item_deleted": "Item %s successfully deleted",
|
||||
"item_released": "Item %s released",
|
||||
"items_deleted": "Item %s successfully deleted",
|
||||
|
@ -105,7 +105,8 @@
|
||||
"username": "Nom d'utilisateur",
|
||||
"validate": "Valider",
|
||||
"validation_success": "Validation réussie",
|
||||
"bcc_dest_format": "La destination Cci doit être une seule adresse e-mail valide.<br>Si vous avez besoin d'envoyer une copie à plusieurs adresses, créez un alias et utilisez-le ici."
|
||||
"bcc_dest_format": "La destination Cci doit être une seule adresse e-mail valide.<br>Si vous avez besoin d'envoyer une copie à plusieurs adresses, créez un alias et utilisez-le ici.",
|
||||
"tags": "Etiquettes"
|
||||
},
|
||||
"admin": {
|
||||
"access": "Accès",
|
||||
@ -318,7 +319,9 @@
|
||||
"oauth2_add_client": "Ajouter un client OAuth2",
|
||||
"password_policy": "Politique de mots de passe",
|
||||
"admins": "Administrateurs",
|
||||
"api_read_only": "Accès lecture-seule"
|
||||
"api_read_only": "Accès lecture-seule",
|
||||
"password_policy_lowerupper": "Doit contenir des caractères minuscules et majuscules",
|
||||
"password_policy_numbers": "Doit contenir au moins un chiffre"
|
||||
},
|
||||
"danger": {
|
||||
"access_denied": "Accès refusé ou données de formulaire non valides",
|
||||
|
@ -43,7 +43,7 @@
|
||||
"app_name": "Nome app",
|
||||
"app_password": "Aggiungi la password dell'app",
|
||||
"automap": "Prova a mappare automaticamente le cartelle (\"Sent items\", \"Sent\" => \"Posta inviata\" ecc.)",
|
||||
"backup_mx_options": "Relay options",
|
||||
"backup_mx_options": "Opzioni di inoltro",
|
||||
"comment_info": "Un commento privato non è visibile all'utente, mentre un commento pubblico viene mostrato come suggerimento quando si passa con il mouse nella panoramica di un utente",
|
||||
"custom_params": "Parametri personalizzati",
|
||||
"custom_params_hint": "Corretto: --param=xy, errato: --param xy",
|
||||
@ -303,7 +303,7 @@
|
||||
"spamfilter": "Filtri spam",
|
||||
"subject": "Oggetto",
|
||||
"success": "Successo",
|
||||
"sys_mails": "System mails",
|
||||
"sys_mails": "Mail di sistema",
|
||||
"text": "Testo",
|
||||
"time": "Orario",
|
||||
"title": "Titolo",
|
||||
@ -335,7 +335,8 @@
|
||||
"api_read_write": "Accesso in lettura-scrittura",
|
||||
"oauth2_apps": "App OAuth2",
|
||||
"oauth2_add_client": "Aggiungere il client OAuth2",
|
||||
"rsettings_preset_4": "Disattivare Rspamd per un dominio"
|
||||
"rsettings_preset_4": "Disattivare Rspamd per un dominio",
|
||||
"options": "Opzioni"
|
||||
},
|
||||
"danger": {
|
||||
"access_denied": "Accesso negato o form di login non corretto",
|
||||
@ -364,7 +365,7 @@
|
||||
"extra_acl_invalid": "External sender address \"%s\" is invalid",
|
||||
"extra_acl_invalid_domain": "External sender \"%s\" uses an invalid domain",
|
||||
"fido2_verification_failed": "FIDO2 verification failed: %s",
|
||||
"file_open_error": "File cannot be opened for writing",
|
||||
"file_open_error": "Il file non può essere aperto per la scrittura",
|
||||
"filter_type": "Wrong filter type",
|
||||
"from_invalid": "Il mittente non può essere vuoto",
|
||||
"global_filter_write_error": "Could not write filter file: %s",
|
||||
@ -397,7 +398,7 @@
|
||||
"mailbox_quota_exceeds_domain_quota": "Lo spazio massimo supera la spazio del dominio",
|
||||
"mailbox_quota_left_exceeded": "Non c'è abbastanza spazio libero (space left: %d MiB)",
|
||||
"mailboxes_in_use": "Lo spazio massimo della casella deve essere maggiore o uguale a %d",
|
||||
"malformed_username": "Malformed username",
|
||||
"malformed_username": "Nome utente non valido",
|
||||
"map_content_empty": "Map content cannot be empty",
|
||||
"max_alias_exceeded": "Numero massimo di alias superato",
|
||||
"max_mailbox_exceeded": "Numero massimo di caselle superato (%d of %d)",
|
||||
@ -429,18 +430,18 @@
|
||||
"resource_invalid": "Il nome della risorsa non è valido",
|
||||
"rl_timeframe": "Rate limit time frame is incorrect",
|
||||
"rspamd_ui_pw_length": "Rspamd UI password should be at least 6 chars long",
|
||||
"script_empty": "Script cannot be empty",
|
||||
"script_empty": "Lo script non può essere vuoto",
|
||||
"sender_acl_invalid": "Il valore di Sender ACL non è valido",
|
||||
"set_acl_failed": "Failed to set ACL",
|
||||
"settings_map_invalid": "Settings map ID %s invalid",
|
||||
"sieve_error": "Sieve parser error: %s",
|
||||
"spam_learn_error": "Spam learn error: %s",
|
||||
"subject_empty": "Subject must not be empty",
|
||||
"subject_empty": "L'oggetto non deve essere vuoto",
|
||||
"target_domain_invalid": "Goto domain non è valido",
|
||||
"targetd_not_found": "Il target del dominio non è stato trovato",
|
||||
"targetd_relay_domain": "Target domain %s is a relay domain",
|
||||
"temp_error": "Temporary error",
|
||||
"text_empty": "Text must not be empty",
|
||||
"temp_error": "Errore temporaneo",
|
||||
"text_empty": "Il testo non deve essere vuoto",
|
||||
"tfa_token_invalid": "TFA token invalid",
|
||||
"tls_policy_map_dest_invalid": "Policy destination is invalid",
|
||||
"tls_policy_map_entry_exists": "A TLS policy map entry \"%s\" exists",
|
||||
@ -448,40 +449,54 @@
|
||||
"totp_verification_failed": "TOTP verification failed",
|
||||
"transport_dest_exists": "Transport destination \"%s\" exists",
|
||||
"webauthn_verification_failed": "WebAuthn verification failed: %s",
|
||||
"unknown": "An unknown error occurred",
|
||||
"unknown": "Si è verificato un errore sconosciuto",
|
||||
"unknown_tfa_method": "Unknown TFA method",
|
||||
"unlimited_quota_acl": "Unlimited quota prohibited by ACL",
|
||||
"username_invalid": "Username %s non può essere utilizzato",
|
||||
"username_invalid": "Il nome utente %s non può essere utilizzato",
|
||||
"validity_missing": "Assegnare un periodo di validità",
|
||||
"value_missing": "Si prega di fornire tutti i valori",
|
||||
"yotp_verification_failed": "Verifica OTP Yubico fallita: %s"
|
||||
"yotp_verification_failed": "Verifica OTP Yubico fallita: %s",
|
||||
"demo_mode_enabled": "La modalità demo è abilitata",
|
||||
"template_name_invalid": "Nome template non valido",
|
||||
"template_exists": "Il template %s esiste già",
|
||||
"template_id_invalid": "Il template con ID %s non è valido"
|
||||
},
|
||||
"debug": {
|
||||
"chart_this_server": "Grafico (questo server)",
|
||||
"containers_info": "Container information",
|
||||
"containers_info": "Informazioni sul container",
|
||||
"disk_usage": "Uso del disco",
|
||||
"docs": "Docs",
|
||||
"external_logs": "External logs",
|
||||
"history_all_servers": "History (all servers)",
|
||||
"external_logs": "Log esterni",
|
||||
"history_all_servers": "Cronologia (tutti i server)",
|
||||
"in_memory_logs": "In-memory logs",
|
||||
"jvm_memory_solr": "JVM memory usage",
|
||||
"last_modified": "Ultima modifica",
|
||||
"log_info": "<p>mailcow <b>in-memory logs</b> are collected in Redis lists and trimmed to LOG_LINES (%d) every minute to reduce hammering.\r\n <br>In-memory logs are not meant to be persistent. All applications that log in-memory, also log to the Docker daemon and therefore to the default logging driver.\r\n <br>The in-memory log type should be used for debugging minor issues with containers.</p>\r\n <p><b>External logs</b> are collected via API of the given application.</p>\r\n <p><b>Static logs</b> are mostly activity logs, that are not logged to the Dockerd but still need to be persistent (except for API logs).</p>",
|
||||
"login_time": "Time",
|
||||
"login_time": "Orario",
|
||||
"logs": "Logs",
|
||||
"online_users": "Users online",
|
||||
"online_users": "Utenti online",
|
||||
"restart_container": "Riavvio",
|
||||
"service": "Servizio",
|
||||
"size": "Size",
|
||||
"solr_dead": "Solr is starting, disabled or died.",
|
||||
"size": "Dimensione",
|
||||
"solr_dead": "Solr sta partendo, è disabilitato o morto.",
|
||||
"solr_status": "Stato Solr",
|
||||
"started_at": "Started at",
|
||||
"started_on": "Started on",
|
||||
"static_logs": "Static logs",
|
||||
"started_at": "Iniziato alle",
|
||||
"started_on": "Iniziato",
|
||||
"static_logs": "Log statici",
|
||||
"success": "Successo",
|
||||
"system_containers": "System & Containers",
|
||||
"system_containers": "Sistema & Containers",
|
||||
"uptime": "Tempo di attività",
|
||||
"username": "Username"
|
||||
"username": "Nome utente",
|
||||
"container_disabled": "Container arrestato o disattivato",
|
||||
"update_available": "È disponibile un aggiornamento",
|
||||
"container_running": "In esecuzione",
|
||||
"container_stopped": "Arrestato",
|
||||
"cores": "Cores",
|
||||
"current_time": "Orario di sistema",
|
||||
"memory": "Memoria",
|
||||
"timezone": "Fuso orario",
|
||||
"no_update_available": "Il sistema è aggiornato all'ultima versione",
|
||||
"update_failed": "Impossibile verificare la presenza di un aggiornamento"
|
||||
},
|
||||
"diagnostics": {
|
||||
"cname_from_a": "Valore letto dal record A/AAAA. Questo è supportato finché il record punta alla risorsa corretta.",
|
||||
@ -514,7 +529,7 @@
|
||||
"delete1": "Elimina dalla sorgente al termine",
|
||||
"delete2": "Delete messages on destination that are not on source",
|
||||
"delete2duplicates": "Elimina duplicati nella destinazione",
|
||||
"delete_ays": "Please confirm the deletion process.",
|
||||
"delete_ays": "Si prega di confermare il processo di eliminazione.",
|
||||
"description": "Descrizione",
|
||||
"disable_login": "Disabilita l'accesso (la posta in arrivo viene correttamente recapitata)",
|
||||
"domain": "Modifica dominio",
|
||||
@ -527,12 +542,12 @@
|
||||
"exclude": "Escludi oggetti (regex)",
|
||||
"extended_sender_acl": "External sender addresses",
|
||||
"extended_sender_acl_info": "A DKIM domain key should be imported, if available.<br>\r\n Remember to add this server to the corresponding SPF TXT record.<br>\r\n Whenever a domain or alias domain is added to this server, that overlaps with an external address, the external address is removed.<br>\r\n Use @domain.tld to allow to send as *@domain.tld.",
|
||||
"force_pw_update": "Force password update at next login",
|
||||
"force_pw_update": "Forza l'aggiornamento della password al prossimo accesso",
|
||||
"force_pw_update_info": "Questo utente potrà accedere solo a %s.",
|
||||
"full_name": "Nome completo",
|
||||
"gal": "Global Address List",
|
||||
"gal_info": "The GAL contains all objects of a domain and cannot be edited by any user. Free/busy information in SOGo is missing, if disabled! <b>Restart SOGo to apply changes.</b>",
|
||||
"generate": "generate",
|
||||
"generate": "crea",
|
||||
"grant_types": "Grant types",
|
||||
"hostname": "Hostname",
|
||||
"inactive": "Inattivo",
|
||||
@ -549,7 +564,7 @@
|
||||
"mbox_rl_info": "This rate limit is applied on the SASL login name, it matches any \"from\" address used by the logged-in user. A mailbox rate limit overrides a domain-wide rate limit.",
|
||||
"mins_interval": "Intervallo (min)",
|
||||
"multiple_bookings": "Prenotazioni multiple",
|
||||
"nexthop": "Next hop",
|
||||
"nexthop": "Prossimo hop",
|
||||
"password": "Password",
|
||||
"password_repeat": "Conferma password (riscrivi)",
|
||||
"previous": "Pagina precedente",
|
||||
@ -561,9 +576,9 @@
|
||||
"pushover_sender_array": "Only consider the following sender email addresses <small>(comma-separated)</small>",
|
||||
"pushover_sender_regex": "Consider the following sender regex",
|
||||
"pushover_text": "Notification text",
|
||||
"pushover_title": "Notification title",
|
||||
"pushover_title": "Titolo della notifica",
|
||||
"pushover_vars": "When no sender filter is defined, all mails will be considered.<br>Regex filters as well as exact sender checks can be defined individually and will be considered sequentially. They do not depend on each other.<br>Useable variables for text and title (please take note of data protection policies)",
|
||||
"pushover_verify": "Verify credentials",
|
||||
"pushover_verify": "Verifica credenziali",
|
||||
"quota_mb": "Spazio (MiB)",
|
||||
"quota_warning_bcc": "Quota warning BCC",
|
||||
"quota_warning_bcc_info": "Warnings will be sent as separate copies to the following recipients. The subject will be suffixed by the corresponding username in brackets, for example: <code>Quota warning (user@example.com)</code>.",
|
||||
@ -582,42 +597,44 @@
|
||||
"sender_acl": "Consenti di inviare come",
|
||||
"sender_acl_disabled": "<span class=\"badge fs-6 bg-danger\">Sender check is disabled</span>",
|
||||
"sender_acl_info": "If mailbox user A is allowed to send as mailbox user B, the sender address is not automatically displayed as selectable \"from\" field in SOGo.<br>\r\n Mailbox user B needs to create a delegation in SOGo to allow mailbox user A to select their address as sender. To delegate a mailbox in SOGo, use the menu (three dots) to the right of your mailbox name in the upper left while in mail view. This behaviour does not apply to alias addresses.",
|
||||
"sieve_desc": "Short description",
|
||||
"sieve_desc": "Breve descrizione",
|
||||
"sieve_type": "Filter type",
|
||||
"skipcrossduplicates": "Skip duplicate messages across folders (first come, first serve)",
|
||||
"sogo_visible": "Alias is visible in SOGo",
|
||||
"sogo_visible": "L'alias è visibile in SOGo",
|
||||
"sogo_visible_info": "This option only affects objects, that can be displayed in SOGo (shared or non-shared alias addresses pointing to at least one local mailbox). If hidden, an alias will not appear as selectable sender in SOGo.",
|
||||
"spam_alias": "Create or change time limited alias addresses",
|
||||
"spam_filter": "Spam filter",
|
||||
"spam_policy": "Add or remove items to white-/blacklist",
|
||||
"spam_score": "Set a custom spam score",
|
||||
"spam_policy": "Aggiungi o rimuovi elementi dalla whitelist/blacklist",
|
||||
"spam_score": "Imposta un punteggio spam personalizzato",
|
||||
"subfolder2": "Sincronizza in una sottocartella<br /><small>(vuoto = non sincronizzare in sottocartella)</small>",
|
||||
"syncjob": "Modifica sincronizzazione",
|
||||
"target_address": "Vai all'indirizzo/i <small>(separato da virgola)</small>",
|
||||
"target_domain": "Target dominio",
|
||||
"timeout1": "Timeout for connection to remote host",
|
||||
"timeout2": "Timeout for connection to local host",
|
||||
"timeout1": "Timeout per la connessione all'host remoto",
|
||||
"timeout2": "Timeout per la connessione all'host remoto",
|
||||
"title": "Modifica oggetto",
|
||||
"unchanged_if_empty": "Se immutato lasciare vuoto",
|
||||
"username": "Username",
|
||||
"username": "Nome utente",
|
||||
"validate_save": "Convalida e salva",
|
||||
"pushover": "Pushover",
|
||||
"sogo_access_info": "Il single-sign-on dall'interno dell'interfaccia di posta rimane funzionante. Questa impostazione non influisce sull'accesso a tutti gli altri servizi né cancella o modifica il profilo SOGo esistente dell'utente.",
|
||||
"none_inherit": "Nessuno / Eredita",
|
||||
"sogo_access": "Concedere l'accesso diretto a SOGo",
|
||||
"acl": "ACL (autorizzazione)",
|
||||
"app_passwd_protocols": "Protocolli consentiti per la password dell'app"
|
||||
"app_passwd_protocols": "Protocolli consentiti per la password dell'app",
|
||||
"last_modified": "Ultima modifica",
|
||||
"pushover_sound": "Suono"
|
||||
},
|
||||
"fido2": {
|
||||
"confirm": "Confirm",
|
||||
"confirm": "Conferma",
|
||||
"fido2_auth": "Login with FIDO2",
|
||||
"fido2_success": "Device successfully registered",
|
||||
"fido2_validation_failed": "Validation failed",
|
||||
"fn": "Friendly name",
|
||||
"known_ids": "Known IDs",
|
||||
"none": "Disabled",
|
||||
"register_status": "Registration status",
|
||||
"rename": "Rename",
|
||||
"fido2_success": "Dispositivo registrato con successo",
|
||||
"fido2_validation_failed": "Validazione fallita",
|
||||
"fn": "Nome descrittivo",
|
||||
"known_ids": "ID conosciuti",
|
||||
"none": "Disabilitato",
|
||||
"register_status": "Stato di registrazione",
|
||||
"rename": "Rinominare",
|
||||
"set_fido2": "Register FIDO2 device",
|
||||
"set_fn": "Set friendly name",
|
||||
"start_fido2_validation": "Start FIDO2 validation",
|
||||
@ -641,13 +658,14 @@
|
||||
"header": {
|
||||
"administration": "Amministrazione",
|
||||
"apps": "App",
|
||||
"debug": "Informazioni di sistema",
|
||||
"debug": "Informazioni",
|
||||
"email": "E-Mail",
|
||||
"mailcow_config": "Configurazione",
|
||||
"quarantine": "Quarantena",
|
||||
"restart_netfilter": "Riavvia netfilter",
|
||||
"restart_sogo": "Riavvia SOGo",
|
||||
"user_settings": "Impostazioni utente"
|
||||
"user_settings": "Impostazioni utente",
|
||||
"mailcow_system": "Sistema"
|
||||
},
|
||||
"info": {
|
||||
"awaiting_tfa_confirmation": "In attesa di conferma TFA",
|
||||
@ -661,7 +679,7 @@
|
||||
"mobileconfig_info": "Please login as mailbox user to download the requested Apple connection profile.",
|
||||
"other_logins": "Key login",
|
||||
"password": "Password",
|
||||
"username": "Username"
|
||||
"username": "Nome utente"
|
||||
},
|
||||
"mailbox": {
|
||||
"action": "Azione",
|
||||
@ -733,7 +751,7 @@
|
||||
"inactive": "Inattivo",
|
||||
"insert_preset": "Insert example preset \"%s\"",
|
||||
"kind": "Tipo",
|
||||
"last_mail_login": "Last mail login",
|
||||
"last_mail_login": "Ultimo accesso alla posta",
|
||||
"last_modified": "Ultima modifica",
|
||||
"last_pw_change": "Ultima modifica della password",
|
||||
"last_run": "Ultima esecuzione",
|
||||
@ -828,7 +846,15 @@
|
||||
"sender": "Mittente",
|
||||
"all_domains": "Tutti i domini",
|
||||
"recipient": "Destinatario",
|
||||
"syncjob_EX_OK": "Successo"
|
||||
"syncjob_EX_OK": "Successo",
|
||||
"add_template": "Aggiungi template",
|
||||
"force_pw_update": "Forza il cambio della password al prossimo accesso",
|
||||
"relay_unknown": "Inoltra a caselle di posta sconosciute",
|
||||
"mailbox_templates": "Template della mailbox",
|
||||
"domain_templates": "Template di dominio",
|
||||
"gal": "Elenco indirizzi globale",
|
||||
"templates": "Template",
|
||||
"template": "Template"
|
||||
},
|
||||
"oauth2": {
|
||||
"access_denied": "Effettua il login alla casella di posta per garantire l'accesso tramite OAuth2.",
|
||||
@ -847,7 +873,7 @@
|
||||
"confirm_delete": "Conferma l'eliminazione di questo elemento.",
|
||||
"danger": "Pericolo",
|
||||
"deliver_inbox": "Consegna nella posta in arrivo",
|
||||
"disabled_by_config": "The current system configuration disables the quarantine functionality. Please set \"retentions per mailbox\" and a \"maximum size\" for quarantine elements.",
|
||||
"disabled_by_config": "L'attuale configurazione del sistema disabilita la funzionalità di quarantena. Imposta \"conservazioni per casella di posta\" e \"dimensione massima\" per gli elementi di quarantena.",
|
||||
"download_eml": "Download (.eml)",
|
||||
"empty": "Nessun risultato",
|
||||
"high_danger": "Alto",
|
||||
@ -893,7 +919,18 @@
|
||||
"type": "Tipologia"
|
||||
},
|
||||
"queue": {
|
||||
"queue_manager": "Gestore code"
|
||||
"queue_manager": "Gestore code",
|
||||
"delete": "Cancella tutto",
|
||||
"ays": "Conferma che desideri eliminare tutti gli elementi dalla coda corrente.",
|
||||
"info": "La coda di posta contiene tutte le e-mail in attesa di consegna. Se un'e-mail rimane a lungo nella coda di posta, viene automaticamente cancellata dal sistema.<br>Il messaggio di errore della rispettiva e-mail fornisce informazioni sul motivo per cui non è stato possibile consegnarla.",
|
||||
"deliver_mail_legend": "Tenta di riconsegnare i messaggi selezionati.",
|
||||
"hold_mail": "Blocca",
|
||||
"flush": "Svuota la coda",
|
||||
"deliver_mail": "Consegna",
|
||||
"show_message": "Mostra messaggio",
|
||||
"unhold_mail": "Sblocca",
|
||||
"hold_mail_legend": "Blocca le mail selezionate. (Previene ulteriori tentativi di consegna)",
|
||||
"legend": "Funzioni delle azioni della coda di posta:"
|
||||
},
|
||||
"start": {
|
||||
"help": "Mostra/Nascondi pannello di aiuto",
|
||||
@ -978,7 +1015,10 @@
|
||||
"verified_totp_login": "Verified TOTP login",
|
||||
"verified_webauthn_login": "Verified WebAuthn login",
|
||||
"verified_yotp_login": "Verified Yubico OTP login",
|
||||
"domain_add_dkim_available": "Esisteva già una chiave DKIM"
|
||||
"domain_add_dkim_available": "Esisteva già una chiave DKIM",
|
||||
"template_added": "Aggiunto template %s",
|
||||
"template_modified": "Le modifiche al template %s sono state salvate",
|
||||
"template_removed": "Il template con ID %s è stato cancellato"
|
||||
},
|
||||
"tfa": {
|
||||
"api_register": "%s usa le API Yubico Cloud. Richiedi una chiave API <a href=\"https://upgrade.yubico.com/getapikey/\" target=\"_blank\">qui</a>",
|
||||
@ -1142,7 +1182,7 @@
|
||||
"tls_enforce_in": "Imponi TLS in ingresso",
|
||||
"tls_enforce_out": "Imponi TLS in uscita",
|
||||
"tls_policy": "Politica di crittografia",
|
||||
"tls_policy_warning": "<strong>Attenzione:</strong> If you decide to enforce encrypted mail transfer, you may lose emails.<br />Messages to not satisfy the policy will be bounced with a hard fail by the mail system.<br />This option applies to your primary email address (login name), all addresses derived from alias domains as well as alias addresses <b>with only this single mailbox</b> as target.",
|
||||
"tls_policy_warning": "<strong>Attenzione:</strong> Se decidi di applicare il trasferimento di posta crittografato, potresti perdere le email.<br />I messaggi che non soddisfano la politica verranno respinti con un hard fail dal sistema di posta.<br />This option applies to your primary email address (login name), all addresses derived from alias domains as well as alias addresses <b>with only this single mailbox</b> as target.",
|
||||
"user_settings": "Impostazioni utente",
|
||||
"username": "Nome utente",
|
||||
"verify": "Verifica",
|
||||
@ -1166,7 +1206,8 @@
|
||||
"syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Impossibile connettersi al server remoto",
|
||||
"syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Nome utente o password errati",
|
||||
"with_app_password": "con password dell'app",
|
||||
"direct_protocol_access": "Questo utente della mailbox ha <b>accesso diretto ed esterno</b> ai seguenti protocolli e applicazioni. Questa impostazione è controllata dal tuo amministratore. Le password delle applicazioni possono essere create per garantire l'accesso ai singoli protocolli e applicazioni.<br>Il pulsante \"Accedi alla webmail\" fornisce un singolo accesso a SOGo ed è sempre disponibile."
|
||||
"direct_protocol_access": "Questo utente della mailbox ha <b>accesso diretto ed esterno</b> ai seguenti protocolli e applicazioni. Questa impostazione è controllata dal tuo amministratore. Le password delle applicazioni possono essere create per garantire l'accesso ai singoli protocolli e applicazioni.<br>Il pulsante \"Accedi alla webmail\" fornisce un singolo accesso a SOGo ed è sempre disponibile.",
|
||||
"pushover_sound": "Suono"
|
||||
},
|
||||
"warning": {
|
||||
"cannot_delete_self": "Cannot delete logged in user",
|
||||
@ -1187,5 +1228,29 @@
|
||||
"second": "messaggi / secondo",
|
||||
"hour": "messaggi / ora",
|
||||
"day": "messaggi / giorno"
|
||||
},
|
||||
"datatables": {
|
||||
"infoFiltered": "(filtrato da _MAX_ voci totali)",
|
||||
"collapse_all": "Comprimi tutto",
|
||||
"emptyTable": "Nessun dato disponibile nella tabella",
|
||||
"expand_all": "Espandi tutto",
|
||||
"info": "Visualizzazione da _START_ a _END_ di _TOTAL_ voci",
|
||||
"infoEmpty": "Visualizzazione da 0 a 0 di 0 voci",
|
||||
"thousands": ".",
|
||||
"loadingRecords": "Caricamento...",
|
||||
"processing": "Attendere prego...",
|
||||
"search": "Ricerca:",
|
||||
"zeroRecords": "Nessuna corrispondenza trovata",
|
||||
"paginate": {
|
||||
"first": "Prima",
|
||||
"last": "Ultima",
|
||||
"next": "Prossima",
|
||||
"previous": "Precedente"
|
||||
},
|
||||
"lengthMenu": "Mostra _MENU_ voci",
|
||||
"aria": {
|
||||
"sortAscending": ": attivare l'ordinamento crescente delle colonne",
|
||||
"sortDescending": ": attivare l'ordinamento decrescente delle colonne"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -31,7 +31,7 @@
|
||||
"unlimited_quota": "无限邮箱容量配额"
|
||||
},
|
||||
"add": {
|
||||
"activate_filter_warn": "当 \"启用\" 选项被勾选后,所有其他过滤器都会被禁用",
|
||||
"activate_filter_warn": "当“启用”选项被勾选后,其它所有的过滤器都会被禁用。",
|
||||
"active": "启用",
|
||||
"add": "添加",
|
||||
"add_domain_only": "只添加域名",
|
||||
@ -208,7 +208,7 @@
|
||||
"includes": "包括这些收件人",
|
||||
"is_mx_based": "基于 MX 记录",
|
||||
"last_applied": "最后应用的条目",
|
||||
"license_info": "你不需要获取证书便可以使用此项目,但是获取证书可以帮助此项目进一步发展。<br>在这里<a href=\"https://www.servercow.de/mailcow?lang=en#sal\" target=\"_blank\" alt=\"SAL order\">注册</a>你的 GUID或者为你的 Mailcow 安装<a href=\"https://www.servercow.de/mailcow?lang=en#support\" target=\"_blank\" alt=\"Support order\">购买</a>支持服务。",
|
||||
"license_info": "使用并不需要许可证,但获得许可证能够帮助此项目进一步发展。<br><a href=\"https://www.servercow.de/mailcow?lang=en#sal\" target=\"_blank\" alt=\"订购 SAL\">在这里注册你的 GUID </a>或者<a href=\"https://www.servercow.de/mailcow?lang=en#support\" target=\"_blank\" alt=\"订购支持服务\">为你的 Mailcow 安装购买支持服务。</a>",
|
||||
"link": "链接",
|
||||
"loading": "请等待...",
|
||||
"login_time": "登录时间",
|
||||
@ -335,7 +335,8 @@
|
||||
"username": "用户名",
|
||||
"validate_license_now": "通过证书服务器验证 GUID",
|
||||
"verify": "验证",
|
||||
"yes": "✓"
|
||||
"yes": "✓",
|
||||
"options": "选项"
|
||||
},
|
||||
"danger": {
|
||||
"access_denied": "访问被拒绝或者表单数据无效",
|
||||
@ -402,7 +403,7 @@
|
||||
"max_alias_exceeded": "超出最大别名数",
|
||||
"max_mailbox_exceeded": "超出最大邮箱数 (%d / %d)",
|
||||
"max_quota_in_use": "邮箱数必须大于等于 %d MiB",
|
||||
"maxquota_empty": "每个邮箱的最大配额必须不为0",
|
||||
"maxquota_empty": "每个邮箱的最大配额必须不为 0 。",
|
||||
"mysql_error": "MySQL 错误: %s",
|
||||
"network_host_invalid": "网络或主机无效: %s",
|
||||
"next_hop_interferes": "%s 与下一跳 %s 冲突",
|
||||
@ -454,7 +455,8 @@
|
||||
"username_invalid": "用户名 %s 无法使用",
|
||||
"validity_missing": "请设置有效期",
|
||||
"value_missing": "请填入所有值",
|
||||
"yotp_verification_failed": "Yubico OTP 认证失败: %s"
|
||||
"yotp_verification_failed": "Yubico OTP 认证失败: %s",
|
||||
"template_exists": "模板 %s 已存在"
|
||||
},
|
||||
"debug": {
|
||||
"chart_this_server": "图表 (此服务器)",
|
||||
@ -473,7 +475,7 @@
|
||||
"restart_container": "重启",
|
||||
"service": "服务",
|
||||
"size": "大小",
|
||||
"solr_dead": "Solr 在启动中、已关闭或已停止",
|
||||
"solr_dead": "Solr 在启动中、已关闭或已停止。",
|
||||
"solr_status": "Solr 状态",
|
||||
"started_at": "开始于",
|
||||
"started_on": "启动于",
|
||||
@ -481,10 +483,14 @@
|
||||
"success": "成功",
|
||||
"system_containers": "系统和容器",
|
||||
"uptime": "运行时间",
|
||||
"username": "用户名"
|
||||
"username": "用户名",
|
||||
"container_disabled": "容器已被停止或禁用",
|
||||
"container_running": "运行中",
|
||||
"cores": "核心数",
|
||||
"memory": "内存"
|
||||
},
|
||||
"diagnostics": {
|
||||
"cname_from_a": "虽然此记录为 A/AAAA 类型,但只要此记录指向了正确的资源便可以被支持",
|
||||
"cname_from_a": "来自 A/AAAA 记录的值。但只要记录指向正确的资源即可。",
|
||||
"dns_records": "DNS 记录",
|
||||
"dns_records_24hours": "请注意 DNS 记录的更改可能需要24小时才可以使此页面的当前状态显示正确。此页面为你提供了一个可以便捷查询如何配置 DNS 记录以及检查你的 DNS 记录是否正确的方式。",
|
||||
"dns_records_data": "正确数据",
|
||||
@ -501,7 +507,7 @@
|
||||
"advanced_settings": "高级设置",
|
||||
"alias": "编辑别名",
|
||||
"allow_from_smtp": "只允许这些 IP 使用 <b>SMTP</b>",
|
||||
"allow_from_smtp_info": "留空以允许所有发送者。<br>IPv4/IPv6地址或网络",
|
||||
"allow_from_smtp_info": "留空以允许所有发送者。<br>IPv4/IPv6 地址和网络。",
|
||||
"allowed_protocols": "允许的协议",
|
||||
"app_name": "应用名称",
|
||||
"app_passwd": "应用密码",
|
||||
@ -629,7 +635,7 @@
|
||||
"delete_these_items": "请确认对以下对象 ID 的更改",
|
||||
"hibp_check": "使用 haveibeenpwned.com 网站检查密码",
|
||||
"hibp_nok": "匹配到密码!存在潜在的使用危险!",
|
||||
"hibp_ok": "未匹配到密码",
|
||||
"hibp_ok": "未找到匹配的记录。",
|
||||
"loading": "请等待...",
|
||||
"nothing_selected": "未选择",
|
||||
"restart_container": "重启容器",
|
||||
@ -685,7 +691,7 @@
|
||||
"aliases": "别名",
|
||||
"all_domains": "全部域名",
|
||||
"allow_from_smtp": "只允许这些 IP 使用 <b>SMTP</b>",
|
||||
"allow_from_smtp_info": "留空以允许所有发送者,<br>IPv4/IPv6地址或网络",
|
||||
"allow_from_smtp_info": "留空以允许所有发送者。<br>IPv4/IPv6 地址或网络。",
|
||||
"allowed_protocols": "允许用户直接访问的协议 (不会影响应用的密码协议)",
|
||||
"backup_mx": "中继域名",
|
||||
"bcc": "BCC",
|
||||
@ -739,7 +745,7 @@
|
||||
"last_run_reset": "下一次运行",
|
||||
"mailbox": "邮箱",
|
||||
"mailbox_defaults": "默认设置",
|
||||
"mailbox_defaults_info": "配置新邮箱的默认设置",
|
||||
"mailbox_defaults_info": "配置新邮箱的默认设置。",
|
||||
"mailbox_defquota": "默认邮箱大小",
|
||||
"mailbox_quota": "最大邮箱大小",
|
||||
"mailboxes": "邮箱",
|
||||
@ -820,7 +826,12 @@
|
||||
"username": "用户名",
|
||||
"waiting": "等待中",
|
||||
"weekly": "每周",
|
||||
"yes": "✓"
|
||||
"yes": "✓",
|
||||
"domain_templates": "域名模板",
|
||||
"mailbox_templates": "邮箱模板",
|
||||
"gal": "全局地址列表",
|
||||
"max_aliases": "最大别名数",
|
||||
"max_mailboxes": "最大可能的邮箱数"
|
||||
},
|
||||
"oauth2": {
|
||||
"access_denied": "请作为邮箱所有者登录以使用 OAuth2 授权",
|
||||
@ -865,7 +876,7 @@
|
||||
"refresh": "刷新",
|
||||
"rejected": "已拒绝",
|
||||
"release": "移除",
|
||||
"release_body": "我们已在此消息中将你的消息作为 eml 附件文件",
|
||||
"release_body": "我们已将你的消息作为 eml 文件附在此消息中。",
|
||||
"release_subject": "存在潜在危险的隔离文件 %s",
|
||||
"remove": "删除",
|
||||
"rewrite_subject": "重写主题",
|
||||
@ -885,7 +896,8 @@
|
||||
"type": "类型"
|
||||
},
|
||||
"queue": {
|
||||
"queue_manager": "队列管理器"
|
||||
"queue_manager": "队列管理器",
|
||||
"delete": "全部删除"
|
||||
},
|
||||
"ratelimit": {
|
||||
"disabled": "禁用",
|
||||
@ -1179,5 +1191,18 @@
|
||||
"quota_exceeded_scope": "域名配额超标: 此域名下现在只能创建无限容量的邮箱。",
|
||||
"session_token": "表单字段无效: Token 不匹配",
|
||||
"session_ua": "表单字段无效: User-Agent 校验错误"
|
||||
},
|
||||
"datatables": {
|
||||
"info": "正从 _TOTAL_ 个条目中显示 _START_ 到 _END_ 条目",
|
||||
"collapse_all": "全部折叠",
|
||||
"expand_all": "全部展开",
|
||||
"infoEmpty": "正从共 0 个条目中显示从 0 到 0 条目",
|
||||
"processing": "请稍等...",
|
||||
"search": "搜索:",
|
||||
"paginate": {
|
||||
"first": "第一页",
|
||||
"last": "最后一页",
|
||||
"previous": "上一页"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -33,6 +33,20 @@
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<legend style="padding-top:20px" unselectable="on">{{ lang.admin.ip_check }}</legend><hr />
|
||||
<div id="ip_check">
|
||||
<form class="form" data-id="ip_check" role="form" method="post">
|
||||
<div class="mb-4">
|
||||
<input class="form-check-input" type="checkbox" value="1" name="ip_check_opt_in" id="ip_check_opt_in" {% if ip_check == 1 %}checked{% endif %}>
|
||||
<label class="form-check-label" for="ip_check_opt_in">
|
||||
{{ lang.admin.ip_check_opt_in|raw }}
|
||||
</label>
|
||||
</div>
|
||||
<p><div class="btn-group">
|
||||
<button class="btn btn-sm btn-xs-half d-block d-sm-inline btn-success" data-action="edit_selected" data-item="admin" data-id="ip_check" data-reload="no" data-api-url='edit/ip_check' data-api-attr='{}' href="#"><i class="bi bi-check-lg"></i> {{ lang.admin.save }}</button>
|
||||
</div></p>
|
||||
</form>
|
||||
</div>
|
||||
<legend>{{ lang.admin.app_links }}</legend><hr />
|
||||
<p class="text-muted">{{ lang.admin.merged_vars_hint|raw }}</p>
|
||||
<form class="form-inline" data-id="app_links" role="form" method="post">
|
||||
|
@ -36,7 +36,7 @@
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="rlyhost_password">{{ lang.admin.password }}</label>
|
||||
<input class="form-control" id="rlyhost_password" name="password">
|
||||
<input class="form-control" id="rlyhost_password" name="password" type="password">
|
||||
</div>
|
||||
<button class="btn btn-sm d-block d-sm-inline btn-success" data-action="add_item" data-id="rlyhost" data-api-url='add/relayhost' data-api-attr='{}' href="#"><i class="bi bi-plus-lg"></i> {{ lang.admin.add }}</button>
|
||||
</form>
|
||||
@ -86,7 +86,7 @@
|
||||
</div>
|
||||
<div class="mb-4">
|
||||
<label for="transport_password">{{ lang.admin.password }}</label>
|
||||
<input class="form-control" id="transport_password" name="password">
|
||||
<input class="form-control" id="transport_password" name="password" type="password">
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<label>
|
||||
|
@ -52,8 +52,18 @@
|
||||
<tr>
|
||||
<td>IPs</td>
|
||||
<td class="text-break">
|
||||
<span class="d-block" id="host_ipv4">-</span>
|
||||
<span class="d-block" id="host_ipv6">-</span>
|
||||
{% if ip_check == 1 %}
|
||||
<span class="d-none" id="host_ipv4">-</span>
|
||||
<span class="d-none mb-2" id="host_ipv6">-</span>
|
||||
<button class="d-block btn btn-primary btn-sm" id="host_show_ip">
|
||||
<span class="text">{{ lang.debug.show_ip }}</span>
|
||||
<div class="spinner-border spinner-border-sm d-none" role="status">
|
||||
<span class="visually-hidden">Loading...</span>
|
||||
</div>
|
||||
</button>
|
||||
{% else %}
|
||||
<span class="d-block">{{ lang.admin.ip_check_disabled|raw }}</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
@ -340,9 +350,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="postfix_log" data-log-url="postfix" data-nrows="100" href="#">+ 100</a></li>
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="postfix_log" data-log-url="postfix" data-nrows="1000" href="#">+ 1000</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="postfix_log" data-table="postfix_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="postfix_log" data-table="postfix_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="postfix_log" data-table="postfix_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="postfix_log" data-table="postfix_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<table id="postfix_log" class="table table-striped dt-responsive w-100"></table>
|
||||
</div>
|
||||
@ -363,9 +373,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="mailcow_ui" data-table="ui_logs" data-log-url="ui" data-nrows="100" href="#">+ 100</a></li>
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="mailcow_ui" data-table="ui_logs" data-log-url="ui" data-nrows="1000" href="#">+ 1000</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="ui_logs" data-table="ui_logs" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="ui_logs" data-table="ui_logs" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="ui_logs" data-table="ui_logs" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="ui_logs" data-table="ui_logs" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<table id="ui_logs" class="table table-striped dt-responsive w-100"></table>
|
||||
</div>
|
||||
@ -386,9 +396,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="sasl_log_table" data-table="sasl_logs" data-log-url="ui" data-nrows="100" href="#">+ 100</a></li>
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="sasl_log_table" data-table="sasl_logs" data-log-url="ui" data-nrows="1000" href="#">+ 1000</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="sasl_logs" data-table="sasl_logs" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="sasl_logs" data-table="sasl_logs" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="sasl_logs" data-table="sasl_logs" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="sasl_logs" data-table="sasl_logs" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<table id="sasl_logs" class="table table-striped dt-responsive w-100"></table>
|
||||
</div>
|
||||
@ -409,9 +419,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="dovecot_log" data-log-url="dovecot" data-nrows="100" href="#">+ 100</a></li>
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="dovecot_log" data-log-url="dovecot" data-nrows="1000" href="#">+ 1000</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="dovecot_log" data-table="dovecot_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="dovecot_log" data-table="dovecot_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="dovecot_log" data-table="dovecot_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="dovecot_log" data-table="dovecot_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<table id="dovecot_log" class="table table-striped dt-responsive w-100"></table>
|
||||
</div>
|
||||
@ -432,9 +442,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="sogo_log" data-log-url="sogo" data-nrows="100" href="#">+ 100</a></li>
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="sogo_log" data-log-url="sogo" data-nrows="1000" href="#">+ 1000</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="sogo_log" data-table="sogo_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="sogo_log" data-table="sogo_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="sogo_log" data-table="sogo_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="sogo_log" data-table="sogo_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<table id="sogo_log" class="table table-striped dt-responsive w-100"></table>
|
||||
</div>
|
||||
@ -455,9 +465,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="netfilter_log" data-log-url="netfilter" data-nrows="100" href="#">+ 100</a></li>
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="netfilter_log" data-log-url="netfilter" data-nrows="1000" href="#">+ 1000</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="netfilter_log" data-table="netfilter_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="netfilter_log" data-table="netfilter_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="netfilter_log" data-table="netfilter_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="netfilter_log" data-table="netfilter_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<table id="netfilter_log" class="table table-striped dt-responsive w-100"></table>
|
||||
</div>
|
||||
@ -483,9 +493,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="rspamd_history" data-table="rspamd_history" data-log-url="rspamd_history" data-nrows="100" href="#">+ 100</a></li>
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="rspamd_history" data-table="rspamd_history" data-log-url="rspamd_history" data-nrows="1000" href="#">+ 1000</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="rspamd_history" data-table="rspamd_history" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="rspamd_history" data-table="rspamd_history" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="rspamd_history" data-table="rspamd_history" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="rspamd_history" data-table="rspamd_history" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<table id="rspamd_history" class="table table-striped dt-responsive w-100"></table>
|
||||
</div>
|
||||
@ -506,9 +516,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="autodiscover_log" data-table="autodiscover_log" data-log-url="autodiscover" data-nrows="100" href="#">+ 100</a></li>
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="autodiscover_log" data-table="autodiscover_log" data-log-url="autodiscover" data-nrows="1000" href="#">+ 1000</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="autodiscover_log" data-table="autodiscover_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="autodiscover_log" data-table="autodiscover_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="autodiscover_log" data-table="autodiscover_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="autodiscover_log" data-table="autodiscover_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<table id="autodiscover_log" class="table table-striped dt-responsive w-100"></table>
|
||||
</div>
|
||||
@ -529,9 +539,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="watchdog" data-table="watchdog_log" data-log-url="watchdog" data-nrows="100" href="#">+ 100</a></li>
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="watchdog" data-table="watchdog_log" data-log-url="watchdog" data-nrows="1000" href="#">+ 1000</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="watchdog_log" data-table="watchdog_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="watchdog_log" data-table="watchdog_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="watchdog_log" data-table="watchdog_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="watchdog_log" data-table="watchdog_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<table id="watchdog_log" class="table table-striped dt-responsive w-100"></table>
|
||||
</div>
|
||||
@ -552,9 +562,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="acme_log" data-log-url="acme" data-nrows="100" href="#">+ 100</a></li>
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="general_syslog" data-table="acme_log" data-log-url="acme" data-nrows="1000" href="#">+ 1000</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="acme_log" data-table="acme_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="acme_log" data-table="acme_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="acme_log" data-table="acme_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="acme_log" data-table="acme_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<table id="acme_log" class="table table-striped dt-responsive w-100"></table>
|
||||
</div>
|
||||
@ -575,9 +585,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="apilog" data-table="api_log" data-log-url="api" data-nrows="100" href="#">+ 100</a></li>
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="apilog" data-table="api_log" data-log-url="api" data-nrows="1000" href="#">+ 1000</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="api_log" data-table="api_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="api_log" data-table="api_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="api_log" data-table="api_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="api_log" data-table="api_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<table id="api_log" class="table table-striped dt-responsive w-100"></table>
|
||||
</div>
|
||||
@ -598,9 +608,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="rllog" data-table="rl_log" data-log-url="ratelimited" data-nrows="100" href="#">+ 100</a></li>
|
||||
<li><a class="dropdown-item add_log_lines" data-post-process="rllog" data-table="rl_log" data-log-url="ratelimited" data-nrows="1000" href="#">+ 1000</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="rl_log" data-table="rl_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="rl_log" data-table="rl_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="rl_log" data-table="rl_log" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="rl_log" data-table="rl_log" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<p class="text-muted">{{ lang.admin.hash_remove_info }}</p>
|
||||
<table id="rl_log" class="table table-striped dt-responsive w-100"></table>
|
||||
|
@ -200,8 +200,10 @@
|
||||
{% if sender_acl_handles.external_sender_aliases %}
|
||||
{% set ext_sender_acl = sender_acl_handles.external_sender_aliases|join(', ') %}
|
||||
{% endif %}
|
||||
<input type="text" class="form-control" name="extended_sender_acl" value="{{ ext_sender_acl }}" placeholder="user1@example.com, user2@example.org, @example.com, ...">
|
||||
<small class="text-muted">{{ lang.edit.extended_sender_acl_info|raw }}</small>
|
||||
{% if acl.extend_sender_acl and acl.extend_sender_acl == 1 %}
|
||||
<input type="text" class="form-control" name="extended_sender_acl" value="{{ ext_sender_acl }}" placeholder="user1@example.com, user2@example.org, @example.com, ...">
|
||||
<small class="text-muted">{{ lang.edit.extended_sender_acl_info|raw }}</small>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
|
@ -4,18 +4,18 @@
|
||||
<div id="mail-content" class="responsive-tabs">
|
||||
<ul class="nav nav-tabs" role="tablist">
|
||||
<li class="nav-item dropdown" role="presentation">
|
||||
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.domains }}</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><button class="dropdown-item" aria-selected="false" aria-controls="tab-domains" role="tab" data-bs-toggle="tab" data-bs-target="#tab-domains">{{ lang.mailbox.domains }}</button></li>
|
||||
<li><button class="dropdown-item {% if mailcow_cc_role != 'admin' %} d-none{% endif %}" aria-selected="false" aria-controls="tab-templates-domains" role="tab" data-bs-toggle="tab" data-bs-target="#tab-templates-domains">{{ lang.mailbox.templates }}</button></li>
|
||||
</ul>
|
||||
<a class="nav-link dropdown-toggle active" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.domains }}</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><button class="dropdown-item" aria-selected="false" aria-controls="tab-domains" role="tab" data-bs-toggle="tab" data-bs-target="#tab-domains">{{ lang.mailbox.domains }}</button></li>
|
||||
<li><button class="dropdown-item {% if mailcow_cc_role != 'admin' %} d-none{% endif %}" aria-selected="false" aria-controls="tab-templates-domains" role="tab" data-bs-toggle="tab" data-bs-target="#tab-templates-domains">{{ lang.mailbox.templates }}</button></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="nav-item dropdown" role="presentation">
|
||||
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.mailboxes }}</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><button class="dropdown-item" aria-selected="false" aria-controls="tab-mailboxes" role="tab" data-bs-toggle="tab" data-bs-target="#tab-mailboxes">{{ lang.mailbox.mailboxes }}</button></li>
|
||||
<li><button class="dropdown-item {% if mailcow_cc_role != 'admin' %} d-none{% endif %}" aria-selected="false" aria-controls="tab-templates-mbox" role="tab" data-bs-toggle="tab" data-bs-target="#tab-templates-mbox">{{ lang.mailbox.templates }}</button></li>
|
||||
</ul>
|
||||
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.mailboxes }}</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><button class="dropdown-item" aria-selected="false" aria-controls="tab-mailboxes" role="tab" data-bs-toggle="tab" data-bs-target="#tab-mailboxes">{{ lang.mailbox.mailboxes }}</button></li>
|
||||
<li><button class="dropdown-item {% if mailcow_cc_role != 'admin' %} d-none{% endif %}" aria-selected="false" aria-controls="tab-templates-mbox" role="tab" data-bs-toggle="tab" data-bs-target="#tab-templates-mbox">{{ lang.mailbox.templates }}</button></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="nav-item" role="presentation"><button class="nav-link" aria-controls="tab-resources" role="tab" data-bs-toggle="tab" data-bs-target="#tab-resources">{{ lang.mailbox.resources }}</button></li>
|
||||
<li class="nav-item dropdown">
|
||||
|
@ -23,9 +23,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="bcc" data-api-url='edit/bcc' data-api-attr='{"type":"rcpt"}' href="#">{{ lang.mailbox.bcc_to_rcpt }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="bcc" data-api-url='delete/bcc' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="bcc_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="bcc_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="bcc_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="bcc_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addBCCModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_bcc_entry }}</a>
|
||||
</div>
|
||||
@ -44,9 +44,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="bcc" data-api-url='edit/bcc' data-api-attr='{"type":"rcpt"}' href="#">{{ lang.mailbox.bcc_to_rcpt }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="bcc" data-api-url='delete/bcc' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="bcc_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="bcc_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="bcc_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="bcc_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addBCCModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_bcc_entry }}</a>
|
||||
</div>
|
||||
@ -74,9 +74,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="recipient_map" data-api-url='edit/recipient_map' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="recipient_map" data-api-url='delete/recipient_map' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="recipient_map_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="recipient_map_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="recipient_map_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="recipient_map_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addRecipientMapModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_recipient_map_entry }}</a>
|
||||
</div>
|
||||
@ -92,9 +92,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="recipient_map" data-api-url='edit/recipient_map' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="recipient_map" data-api-url='delete/recipient_map' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="recipient_map_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="recipient_map_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="recipient_map_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="recipient_map_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addRecipientMapModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_recipient_map_entry }}</a>
|
||||
</div>
|
||||
|
@ -1,7 +1,7 @@
|
||||
<div role="tabpanel" class="tab-pane fade" id="tab-domain-aliases" role="tabpanel" aria-labelledby="tab-domain-aliases">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header d-flex fs-5">
|
||||
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-domain-aliases" data-bs-toggle="collapse" aria-controls="ollapse-tab-domain-aliases">
|
||||
<button class="btn d-md-none flex-grow-1 text-start" data-bs-target="#collapse-tab-domain-aliases" data-bs-toggle="collapse" aria-controls="collapse-tab-domain-aliases">
|
||||
{{ lang.mailbox.domain_aliases }} <span class="badge bg-info table-lines"></span>
|
||||
</button>
|
||||
<span class="d-none d-md-block">{{ lang.mailbox.domain_aliases }} <span class="badge bg-info table-lines"></span></span>
|
||||
@ -20,9 +20,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias-domain" data-api-url='edit/alias-domain' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="alias-domain" data-api-url='delete/alias-domain' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="aliasdomain_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="aliasdomain_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="aliasdomain_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="aliasdomain_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-acl="{{ acl.alias_domains }}" data-bs-toggle="modal" data-bs-target="#addAliasDomainModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_domain_alias }}</a>
|
||||
</div>
|
||||
@ -37,9 +37,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias-domain" data-api-url='edit/alias-domain' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="alias-domain" data-api-url='delete/alias-domain' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="aliasdomain_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="aliasdomain_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="aliasdomain_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="aliasdomain_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-acl="{{ acl.alias_domains }}" data-bs-toggle="modal" data-bs-target="#addAliasDomainModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_domain_alias }}</a>
|
||||
</div>
|
||||
|
@ -22,10 +22,10 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="domain" data-api-url='edit/domain' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="domain" data-api-url='delete/domain' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="domain_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="domain_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
{% endif %}
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="domain_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="domain_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
{% if mailcow_cc_role == 'admin' %}
|
||||
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addDomainModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_domain }}</a>
|
||||
@ -43,10 +43,10 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="domain" data-api-url='edit/domain' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="domain" data-api-url='delete/domain' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
{% endif %}
|
||||
<li><a class="dropdown-item" data-datatables-expand="domain_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="domain_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="domain_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="domain_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
{% if mailcow_cc_role == 'admin' %}
|
||||
<button class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addDomainModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_domain }}</button>
|
||||
|
@ -23,9 +23,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="filter_item" data-api-url='edit/filter' data-api-attr='{"filter_type":"postfilter"}' href="#">{{ lang.mailbox.set_postfilter }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-text="{{ lang.user.eas_reset }}?" data-id="filter_item" data-api-url='delete/filter' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="filter_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="filter_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="filter_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="filter_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addFilterModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_filter }}</a>
|
||||
</div>
|
||||
@ -44,9 +44,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="filter_item" data-api-url='edit/filter' data-api-attr='{"filter_type":"postfilter"}' href="#">{{ lang.mailbox.set_postfilter }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-text="{{ lang.user.eas_reset }}?" data-id="filter_item" data-api-url='delete/filter' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="filter_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="filter_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="filter_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="filter_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addFilterModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_filter }}</a>
|
||||
</div>
|
||||
|
@ -16,9 +16,9 @@
|
||||
<a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="mailbox" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
|
||||
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="dropdown-header">{{ lang.mailbox.mailbox }}</li>
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="mailbox" data-api-url='edit/mailbox' data-api-attr='{"active":"1"}' href="#">{{ lang.mailbox.activate }}</a></li>
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="mailbox" data-api-url='edit/mailbox' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
@ -64,8 +64,8 @@
|
||||
<a class="btn btn-sm btn-secondary" id="toggle_multi_select_all" data-id="mailbox" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
|
||||
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<div class="btn-group">
|
||||
<a class="btn btn-sm btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.mailbox }}</a>
|
||||
@ -130,9 +130,9 @@
|
||||
<a class="btn btn-sm btn-xs-half btn-secondary" id="toggle_multi_select_all" data-id="mailbox" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
|
||||
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="dropdown-header">{{ lang.mailbox.mailbox }}</li>
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="mailbox" data-api-url='edit/mailbox' data-api-attr='{"active":"1"}' href="#">{{ lang.mailbox.activate }}</a></li>
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="mailbox" data-api-url='edit/mailbox' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
@ -178,8 +178,8 @@
|
||||
<a class="btn btn-sm btn-secondary" id="toggle_multi_select_all" data-id="mailbox" href="#"><i class="bi bi-check-all"></i> {{ lang.mailbox.toggle_all }}</a>
|
||||
<a class="btn btn-sm btn-xs-half btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.quick_actions }}</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="mailbox_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="mailbox_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<div class="btn-group">
|
||||
<a class="btn btn-sm btn-secondary dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.mailbox.mailbox }}</a>
|
||||
|
@ -20,9 +20,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="alias" data-api-url='delete/alias' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="alias_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="alias_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="alias_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="alias_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
{% if not skip_sogo %}
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"sogo_visible":"1"}' href="#">{{ lang.mailbox.sogo_visible_y }}</a></li>
|
||||
@ -44,9 +44,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="alias" data-api-url='delete/alias' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="alias_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="alias_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="alias_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="alias_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
{% if not skip_sogo %}
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="alias" data-api-url='edit/alias' data-api-attr='{"sogo_visible":"1"}' href="#">{{ lang.mailbox.sogo_visible_y }}</a></li>
|
||||
|
@ -20,9 +20,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="resource" data-api-url='edit/resource' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="resource" data-api-url='delete/resource' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="resource_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="resource_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="resource_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="resource_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addResourceModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_resource }}</a>
|
||||
</div>
|
||||
@ -41,9 +41,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="resource" data-api-url='edit/resource' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="resource" data-api-url='delete/resource' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="resource_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="resource_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="resource_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="resource_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addResourceModal"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_resource }}</a>
|
||||
</div>
|
||||
|
@ -22,9 +22,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="syncjob" data-api-url='edit/syncjob' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="syncjob" data-api-url='delete/syncjob' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="sync_job_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="sync_job_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="sync_job_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="sync_job_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addSyncJobModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.user.create_syncjob }}</a>
|
||||
</div>
|
||||
@ -41,9 +41,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="syncjob" data-api-url='edit/syncjob' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="syncjob" data-api-url='delete/syncjob' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="sync_job_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="sync_job_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="sync_job_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="sync_job_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addSyncJobModalAdmin"><i class="bi bi-plus-lg"></i> {{ lang.user.create_syncjob }}</a>
|
||||
</div>
|
||||
|
@ -18,9 +18,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
{% if mailcow_cc_role == 'admin' %}
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="domain_template" data-api-url='delete/domain/template' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="templates_domain_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="templates_domain_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="templates_domain_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="templates_domain_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
{% if mailcow_cc_role == 'admin' %}
|
||||
@ -36,9 +36,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
{% if mailcow_cc_role == 'admin' %}
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="domain_template" data-api-url='delete/domain/template' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="templates_domain_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="templates_domain_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="templates_domain_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="templates_domain_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
{% if mailcow_cc_role == 'admin' %}
|
||||
|
@ -18,9 +18,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
{% if mailcow_cc_role == 'admin' %}
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="mailbox_template" data-api-url='delete/mailbox/template' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="templates_mbox_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="templates_mbox_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="templates_mbox_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="templates_mbox_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
{% if mailcow_cc_role == 'admin' %}
|
||||
@ -36,9 +36,9 @@
|
||||
<ul class="dropdown-menu">
|
||||
{% if mailcow_cc_role == 'admin' %}
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="mailbox_template" data-api-url='delete/mailbox/template' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="templates_mbox_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="templates_mbox_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="templates_mbox_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="templates_mbox_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
{% if mailcow_cc_role == 'admin' %}
|
||||
|
@ -20,9 +20,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="tls-policy-map" data-api-url='edit/tls-policy-map' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="tls-policy-map" data-api-url='delete/tls-policy-map' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="tls_policy_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="tls_policy_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="tls_policy_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="tls_policy_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addTLSPolicyMapAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_tls_policy_map }}</a>
|
||||
</div>
|
||||
@ -38,9 +38,9 @@
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="tls-policy-map" data-api-url='edit/tls-policy-map' data-api-attr='{"active":"0"}' href="#">{{ lang.mailbox.deactivate }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="delete_selected" data-id="tls-policy-map" data-api-url='delete/tls-policy-map' href="#">{{ lang.mailbox.remove }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-datatables-expand="tls_policy_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="tls_policy_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="tls_policy_table">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="tls_policy_table">{{ lang.datatables.collapse_all }}</a></li>
|
||||
</ul>
|
||||
<a class="btn btn-sm btn-success" href="#" data-bs-toggle="modal" data-bs-target="#addTLSPolicyMapAdmin"><i class="bi bi-plus-lg"></i> {{ lang.mailbox.add_tls_policy_map }}</a>
|
||||
</div>
|
||||
|
@ -16,9 +16,9 @@
|
||||
<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 dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.quarantine.quick_actions }}</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item" data-datatables-expand="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"release"}' href="#">{{ lang.quarantine.deliver_inbox }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"learnspam"}' href="#">{{ lang.quarantine.learn_spam_delete }}</a></li>
|
||||
@ -43,9 +43,9 @@
|
||||
<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 dropdown-toggle" data-bs-toggle="dropdown" href="#">{{ lang.quarantine.quick_actions }}</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item" data-datatables-expand="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li><a class="dropdown-item" data-datatables-collapse="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-expand="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.expand_all }}</a></li>
|
||||
<li class="table_collapse_option"><a class="dropdown-item" data-datatables-collapse="quarantinetable" data-table="quarantinetable" href="#">{{ lang.datatables.collapse_all }}</a></li>
|
||||
<li class="table_collapse_option"><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"release"}' href="#">{{ lang.quarantine.deliver_inbox }}</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" data-action="edit_selected" data-id="qitems" data-api-url='edit/qitem' data-api-attr='{"action":"learnspam"}' href="#">{{ lang.quarantine.learn_spam_delete }}</a></li>
|
||||
|
@ -106,7 +106,7 @@ services:
|
||||
- rspamd
|
||||
|
||||
php-fpm-mailcow:
|
||||
image: mailcow/phpfpm:1.81
|
||||
image: mailcow/phpfpm:1.82
|
||||
command: "php-fpm -d date.timezone=${TZ} -d expose_php=0"
|
||||
depends_on:
|
||||
- redis-mailcow
|
||||
@ -169,7 +169,7 @@ services:
|
||||
- phpfpm
|
||||
|
||||
sogo-mailcow:
|
||||
image: mailcow/sogo:1.113
|
||||
image: mailcow/sogo:1.114
|
||||
environment:
|
||||
- DBNAME=${DBNAME}
|
||||
- DBUSER=${DBUSER}
|
||||
@ -216,7 +216,7 @@ services:
|
||||
- sogo
|
||||
|
||||
dovecot-mailcow:
|
||||
image: mailcow/dovecot:1.21
|
||||
image: mailcow/dovecot:1.22
|
||||
depends_on:
|
||||
- mysql-mailcow
|
||||
dns:
|
||||
|
@ -25,8 +25,9 @@ for bin in openssl curl docker git awk sha1sum; do
|
||||
if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi
|
||||
done
|
||||
|
||||
if docker compose > /dev/null 2>&1; then
|
||||
if docker compose version --short | grep "^2." > /dev/null 2>&1; then
|
||||
if command -v docker compose > /dev/null 2>&1; then
|
||||
version=$(docker compose version --short)
|
||||
if [[ $version =~ ^2\.([0-9]+)\.([0-9]+) ]]; then
|
||||
COMPOSE_VERSION=native
|
||||
echo -e "\e[31mFound Docker Compose Plugin (native).\e[0m"
|
||||
echo -e "\e[31mSetting the DOCKER_COMPOSE_VERSION Variable to native\e[0m"
|
||||
@ -34,12 +35,12 @@ if docker compose > /dev/null 2>&1; then
|
||||
echo -e "\e[33mNotice: You´ll have to update this Compose Version via your Package Manager manually!\e[0m"
|
||||
else
|
||||
echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m"
|
||||
echo -e "\e[31mPlease update/install it manually regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m"
|
||||
echo -e "\e[31mPlease update/install manually regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m"
|
||||
exit 1
|
||||
fi
|
||||
elif docker-compose > /dev/null 2>&1; then
|
||||
if ! [[ $(alias docker-compose 2> /dev/null) ]] ; then
|
||||
if docker-compose version --short | grep "^2." > /dev/null 2>&1; then
|
||||
elif command -v docker-compose > /dev/null 2>&1; then
|
||||
version=$(docker-compose version --short)
|
||||
if [[ $version =~ ^2\.([0-9]+)\.([0-9]+) ]]; then
|
||||
COMPOSE_VERSION=standalone
|
||||
echo -e "\e[31mFound Docker Compose Standalone.\e[0m"
|
||||
echo -e "\e[31mSetting the DOCKER_COMPOSE_VERSION Variable to standalone\e[0m"
|
||||
@ -50,14 +51,18 @@ elif docker-compose > /dev/null 2>&1; then
|
||||
echo -e "\e[31mPlease update/install manually regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
else
|
||||
echo -e "\e[31mCannot find Docker Compose.\e[0m"
|
||||
echo -e "\e[31mPlease install it regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m"
|
||||
echo -e "\e[31mPlease install it manually regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
### If generate_config.sh is started with --dev or -d it will not check out nightly or master branch and will keep on the current branch
|
||||
if [[ ${1} == "--dev" || ${1} == "-d" ]]; then
|
||||
SKIP_BRANCH=y
|
||||
else
|
||||
SKIP_BRANCH=n
|
||||
fi
|
||||
|
||||
if [ -f mailcow.conf ]; then
|
||||
read -r -p "A config file exists and will be overwritten, are you sure you want to continue? [y/N] " response
|
||||
@ -135,32 +140,44 @@ else
|
||||
SKIP_SOLR=n
|
||||
fi
|
||||
|
||||
echo "Which branch of mailcow do you want to use?"
|
||||
echo ""
|
||||
echo "Available Branches:"
|
||||
echo "- master branch (stable updates) | default, recommended [1]"
|
||||
echo "- nightly branch (unstable updates, testing) | not-production ready [2]"
|
||||
sleep 1
|
||||
if [[ ${SKIP_BRANCH} != y ]]; then
|
||||
echo "Which branch of mailcow do you want to use?"
|
||||
echo ""
|
||||
echo "Available Branches:"
|
||||
echo "- master branch (stable updates) | default, recommended [1]"
|
||||
echo "- nightly branch (unstable updates, testing) | not-production ready [2]"
|
||||
sleep 1
|
||||
|
||||
while [ -z "${MAILCOW_BRANCH}" ]; do
|
||||
read -r -p "Choose the Branch with it´s number [1/2] " branch
|
||||
case $branch in
|
||||
[2])
|
||||
MAILCOW_BRANCH="nightly"
|
||||
while [ -z "${MAILCOW_BRANCH}" ]; do
|
||||
read -r -p "Choose the Branch with it´s number [1/2] " branch
|
||||
case $branch in
|
||||
[2])
|
||||
MAILCOW_BRANCH="nightly"
|
||||
;;
|
||||
*)
|
||||
MAILCOW_BRANCH="master"
|
||||
;;
|
||||
*)
|
||||
MAILCOW_BRANCH="master"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
esac
|
||||
done
|
||||
|
||||
git fetch --all
|
||||
git checkout -f $git_branch
|
||||
|
||||
elif [[ ${SKIP_BRANCH} == y ]]; then
|
||||
echo -e "\033[33mEnabled Dev Mode.\033[0m"
|
||||
echo -e "\033[33mNot checking out a different branch!\033[0m"
|
||||
MAILCOW_BRANCH=$(git rev-parse --short $(git rev-parse @{upstream}))
|
||||
|
||||
else
|
||||
echo -e "\033[31mCould not determine branch input..."
|
||||
echo -e "\033[31mExiting."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -z "${MAILCOW_BRANCH}" ]; then
|
||||
git_branch=${MAILCOW_BRANCH}
|
||||
fi
|
||||
|
||||
git fetch --all
|
||||
git checkout -f $git_branch
|
||||
|
||||
[ ! -f ./data/conf/rspamd/override.d/worker-controller-password.inc ] && echo '# Placeholder' > ./data/conf/rspamd/override.d/worker-controller-password.inc
|
||||
|
||||
cat << EOF > mailcow.conf
|
||||
@ -427,18 +444,28 @@ echo "Copying snake-oil certificate..."
|
||||
cp -n -d data/assets/ssl-example/*.pem data/assets/ssl/
|
||||
|
||||
# Set app_info.inc.php
|
||||
if [ ${git_branch} == "master" ]; then
|
||||
mailcow_git_version=$(git describe --tags `git rev-list --tags --max-count=1`)
|
||||
elif [ ${git_branch} == "nightly" ]; then
|
||||
mailcow_git_version=$(git rev-parse --short $(git rev-parse @{upstream}))
|
||||
mailcow_last_git_version=""
|
||||
else
|
||||
mailcow_git_version=$(git rev-parse --short HEAD)
|
||||
mailcow_last_git_version=""
|
||||
fi
|
||||
case ${git_branch} in
|
||||
master)
|
||||
mailcow_git_version=$(git describe --tags `git rev-list --tags --max-count=1`)
|
||||
;;
|
||||
nightly)
|
||||
mailcow_git_version=$(git rev-parse --short $(git rev-parse @{upstream}))
|
||||
mailcow_last_git_version=""
|
||||
;;
|
||||
*)
|
||||
mailcow_git_version=$(git rev-parse --short HEAD)
|
||||
mailcow_last_git_version=""
|
||||
;;
|
||||
esac
|
||||
|
||||
if [[ $SKIP_BRANCH != "y" ]]; then
|
||||
mailcow_git_commit=$(git rev-parse origin/${git_branch})
|
||||
mailcow_git_commit_date=$(git log -1 --format=%ci @{upstream} )
|
||||
else
|
||||
mailcow_git_commit=$(git rev-parse ${git_branch})
|
||||
mailcow_git_commit_date=$(git log -1 --format=%ci @{upstream} )
|
||||
git_branch=$(git rev-parse --abbrev-ref HEAD)
|
||||
fi
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo '<?php' > data/web/inc/app_info.inc.php
|
||||
|
@ -1,5 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
NEXTCLOUD_VER="25"
|
||||
# renovate: datasource=github-releases depName=nextcloud/server versioning=semver extractVersion=^v(?<version>.*)$
|
||||
NEXTCLOUD_VERSION=25.0.2
|
||||
|
||||
for bin in curl dirmngr; do
|
||||
if [[ -z $(which ${bin}) ]]; then echo "Cannot find ${bin}, exiting..."; exit 1; fi
|
||||
@ -8,9 +9,14 @@ done
|
||||
[[ -z ${1} ]] && NC_HELP=y
|
||||
|
||||
while [ "$1" != '' ]; do
|
||||
if [[ $# -ne 1 ]]; then
|
||||
echo -e "\033[31mPlease use only one parameter at the same time!\033[0m" >&2
|
||||
exit 2
|
||||
fi
|
||||
case "${1}" in
|
||||
-p|--purge) NC_PURGE=y && shift;;
|
||||
-i|--install) NC_INSTALL=y && shift;;
|
||||
-u|--update) NC_UPDATE=y && shift;;
|
||||
-r|--resetpw) NC_RESETPW=y && shift;;
|
||||
-h|--help) NC_HELP=y && shift;;
|
||||
*) echo "Unknown parameter: ${1}" && shift;;
|
||||
@ -21,13 +27,11 @@ if [[ ${NC_HELP} == "y" ]]; then
|
||||
printf 'Usage:\n\n'
|
||||
printf ' -p|--purge\n Purge Nextcloud\n'
|
||||
printf ' -i|--install\n Install Nextcloud\n'
|
||||
printf ' -u|--update\n Update Nextcloud\n'
|
||||
printf ' -r|--resetpw\n Reset password\n\n'
|
||||
exit 0
|
||||
fi
|
||||
|
||||
[[ ${NC_PURGE} == "y" ]] && [[ ${NC_INSTALL} == "y" ]] && { echo "Cannot use -p and -i at the same time!"; exit 1; }
|
||||
[[ ${NC_PURGE} == "y" ]] && [[ ${NC_RESETPW} == "y" ]] && { echo "Cannot use -p and -r at the same time!"; exit 1; }
|
||||
|
||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
cd ${SCRIPT_DIR}/../
|
||||
source mailcow.conf
|
||||
@ -40,8 +44,27 @@ if [[ ${NC_PURGE} == "y" ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e \
|
||||
"$(docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "SELECT IFNULL(GROUP_CONCAT('DROP TABLE ', TABLE_SCHEMA, '.', TABLE_NAME SEPARATOR ';'),'SELECT NULL;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'oc_%' AND TABLE_SCHEMA = '${DBNAME}';" -BN)"
|
||||
echo -e "\033[33mDetecting Database information...\033[0m"
|
||||
if [[ $(docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "Show databases" | grep "nextcloud") ]]; then
|
||||
echo -e "\033[32mFound seperate nextcloud Database (newer scheme)!\033[0m"
|
||||
echo -e "\033[31mPurging...\033[0m"
|
||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "DROP DATABASE nextcloud;" > /dev/null
|
||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "DROP USER 'nextcloud'@'%';" > /dev/null
|
||||
elif [[ $(docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} mailcow -e "SHOW TABLES LIKE 'oc_%'") && $? -eq 0 ]]; then
|
||||
echo -e "\033[32mFound nextcloud (oc) tables inside of mailcow Database (old scheme)!\033[0m"
|
||||
echo -e "\033[31mPurging...\033[0m"
|
||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e \
|
||||
"$(docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "SELECT IFNULL(GROUP_CONCAT('DROP TABLE ', TABLE_SCHEMA, '.', TABLE_NAME SEPARATOR ';'),'SELECT NULL;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'oc_%' AND TABLE_SCHEMA = '${DBNAME}';" -BN)" > /dev/null
|
||||
elif [[ $(docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} mailcow -e "SHOW TABLES LIKE 'nc_%'") && $? -eq 0 ]]; then
|
||||
echo -e "\033[32mFound nextcloud (nc) tables inside of mailcow Database (old scheme)!\033[0m"
|
||||
echo -e "\033[31mPurging...\033[0m"
|
||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e \
|
||||
"$(docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "SELECT IFNULL(GROUP_CONCAT('DROP TABLE ', TABLE_SCHEMA, '.', TABLE_NAME SEPARATOR ';'),'SELECT NULL;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'nc_%' AND TABLE_SCHEMA = '${DBNAME}';" -BN)" > /dev/null
|
||||
else
|
||||
echo -e "\033[31mError: No Nextcloud Databases/Tables found!"
|
||||
echo -e "\033[33mNot purging anything...\033[0m"
|
||||
exit 1
|
||||
fi
|
||||
docker exec -it $(docker ps -f name=redis-mailcow -q) /bin/sh -c ' cat <<EOF | redis-cli
|
||||
SELECT 10
|
||||
FLUSHDB
|
||||
@ -57,9 +80,10 @@ EOF
|
||||
|
||||
docker restart $(docker ps -aqf name=nginx-mailcow)
|
||||
|
||||
echo -e "\033[32mNextcloud has been sucessfully uninstalled!\033[0m"
|
||||
|
||||
elif [[ ${NC_UPDATE} == "y" ]]; then
|
||||
exit;
|
||||
read -r -p "Are you sure you want to update Nextcloud? [y/N] " response
|
||||
read -r -p "Are you sure you want to update Nextcloud (with nextclouds own updater)? [y/N] " response
|
||||
response=${response,,}
|
||||
if [[ ! "$response" =~ ^(yes|y)$ ]]; then
|
||||
echo "OK, aborting."
|
||||
@ -67,23 +91,14 @@ elif [[ ${NC_UPDATE} == "y" ]]; then
|
||||
fi
|
||||
|
||||
if [ ! -f data/web/nextcloud/occ ]; then
|
||||
echo "Nextcloud occ not found. Is Nextcloud installed?"
|
||||
echo -e "\033[31mError: Nextcloud occ not found. Is Nextcloud installed?\033[0m"
|
||||
exit 1
|
||||
fi
|
||||
if ! grep -q 'installed: true' <<<$(docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) bash -c "/web/nextcloud/occ --no-warnings status"); then
|
||||
echo "Nextcloud seems not to be installed."
|
||||
exit 1
|
||||
elif ! grep -q 'version: 20\.' <<<$(docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) bash -c "/web/nextcloud/occ --no-warnings status"); then
|
||||
echo "Cannot upgrade to new major version, please update manually."
|
||||
exit 1
|
||||
else
|
||||
curl -L# -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/latest-$NEXTCLOUD_VER.tar.bz2" || { echo "Failed to download Nextcloud archive."; exit 1; } \
|
||||
&& tar -xjf nextcloud.tar.bz2 -C ./data/web/ \
|
||||
&& rm nextcloud.tar.bz2 \
|
||||
&& mkdir -p ./data/web/nextcloud/data \
|
||||
&& chmod +x ./data/web/nextcloud/occ \
|
||||
docker exec -it $(docker ps -f name=php-fpm-mailcow -q) bash -c "chown www-data:www-data -R /web/nextcloud" \
|
||||
docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) bash -c "/web/nextcloud/occ --no-warnings upgrade"
|
||||
docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) bash -c "php /web/nextcloud/updater/updater.phar"
|
||||
fi
|
||||
|
||||
elif [[ ${NC_INSTALL} == "y" ]]; then
|
||||
@ -96,25 +111,48 @@ elif [[ ${NC_INSTALL} == "y" ]]; then
|
||||
[[ ! ${NC_CONT_FAIL,,} =~ ^(yes|y)$ ]] && { echo "Ok, exiting..."; exit 1; }
|
||||
fi
|
||||
|
||||
ADMIN_NC_PASS=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28)
|
||||
|
||||
curl -L# -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/latest-$NEXTCLOUD_VER.tar.bz2" || { echo "Failed to download Nextcloud archive."; exit 1; } \
|
||||
echo -e "\033[33mDownloading \033[34mNextcloud ${NEXTCLOUD_VERSION}\033[33m...\033[0m"
|
||||
curl -L# -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-$NEXTCLOUD_VERSION.tar.bz2" || { echo "Failed to download Nextcloud archive."; exit 1; } \
|
||||
&& tar -xjf nextcloud.tar.bz2 -C ./data/web/ \
|
||||
&& rm nextcloud.tar.bz2 \
|
||||
&& mkdir -p ./data/web/nextcloud/data \
|
||||
&& chmod +x ./data/web/nextcloud/occ
|
||||
|
||||
echo -e "\033[33mCreating Nextcloud Database...\033[0m"
|
||||
NC_DBPASS=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28)
|
||||
NC_DBUSER=nextcloud
|
||||
NC_DBNAME=nextcloud
|
||||
|
||||
echo -ne "[1/3] Creating nextcloud Database"
|
||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "CREATE DATABASE ${NC_DBNAME};"
|
||||
sleep 2
|
||||
echo -ne "\r[2/3] Creating nextcloud Database user"
|
||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "CREATE USER '${NC_DBUSER}'@'%' IDENTIFIED BY '${NC_DBPASS}';"
|
||||
sleep 2
|
||||
echo -ne "\r[3/3] Granting nextcloud user all permissions on database nextcloud"
|
||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "GRANT ALL PRIVILEGES ON ${NC_DBNAME}.* TO '${NC_DBUSER}'@'%';"
|
||||
sleep 2
|
||||
|
||||
echo ""
|
||||
echo -e "\033[33mInstalling Nextcloud...\033[0m"
|
||||
ADMIN_NC_PASS=$(</dev/urandom tr -dc A-Za-z0-9 | head -c 28)
|
||||
|
||||
echo -ne "[1/4] Setting correct permissions for www-data"
|
||||
docker exec -it $(docker ps -f name=php-fpm-mailcow -q) /bin/bash -c "chown -R www-data:www-data /web/nextcloud"
|
||||
sleep 2
|
||||
echo -ne "\r[2/4] Running occ maintenance:install to install nextcloud"
|
||||
docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) /web/nextcloud/occ --no-warnings maintenance:install \
|
||||
--database mysql \
|
||||
--database-host mysql \
|
||||
--database-name ${DBNAME} \
|
||||
--database-user ${DBUSER} \
|
||||
--database-pass ${DBPASS} \
|
||||
--database-name ${NC_DBNAME} \
|
||||
--database-user ${NC_DBUSER} \
|
||||
--database-pass ${NC_DBPASS} \
|
||||
--admin-user admin \
|
||||
--admin-pass ${ADMIN_NC_PASS} \
|
||||
--data-dir /web/nextcloud/data
|
||||
--data-dir /web/nextcloud/data 2>&1 /dev/null
|
||||
|
||||
echo -ne "\r[3/4] Setting custom parameters inside the nextcloud config file"
|
||||
echo ""
|
||||
docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) bash -c "/web/nextcloud/occ --no-warnings config:system:set redis host --value=redis --type=string; \
|
||||
/web/nextcloud/occ --no-warnings config:system:set redis port --value=6379 --type=integer; \
|
||||
/web/nextcloud/occ --no-warnings config:system:set redis timeout --value=0.0 --type=integer; \
|
||||
@ -140,13 +178,28 @@ elif [[ ${NC_INSTALL} == "y" ]]; then
|
||||
#/web/nextcloud/occ --no-warnings config:system:set user_backends 0 arguments 0 --value={dovecot:143/imap/tls/novalidate-cert}; \
|
||||
#/web/nextcloud/occ --no-warnings config:system:set user_backends 0 class --value=OC_User_IMAP; \
|
||||
|
||||
echo -e "\r[4/4] Enabling NGINX Configuration"
|
||||
cp ./data/assets/nextcloud/nextcloud.conf ./data/conf/nginx/
|
||||
sed -i "s/NC_SUBD/${NC_SUBD}/g" ./data/conf/nginx/nextcloud.conf
|
||||
sleep 2
|
||||
|
||||
echo "Restarting Nginx..."
|
||||
echo ""
|
||||
echo -e "\033[33mFinalizing installation...\033[0m"
|
||||
docker restart $(docker ps -aqf name=nginx-mailcow)
|
||||
|
||||
echo "Login as admin with password: ${ADMIN_NC_PASS}"
|
||||
echo ""
|
||||
echo "******************************************"
|
||||
echo "* SAVE THESE CREDENTIALS *"
|
||||
echo "* INSTALL DATE: $(date +%Y-%m-%d_%H-%M-%S) *"
|
||||
echo "******************************************"
|
||||
echo ""
|
||||
echo -e "\033[36mDatabase Name: ${NC_DBNAME}\033[0m"
|
||||
echo -e "\033[36mDatabase User: ${NC_DBUSER}\033[0m"
|
||||
echo -e "\033[36mDatabase Password: ${NC_DBPASS}\033[0m"
|
||||
echo ""
|
||||
echo -e "\033[31mUI Admin Password: ${ADMIN_NC_PASS}\033[0m"
|
||||
echo ""
|
||||
|
||||
|
||||
elif [[ ${NC_RESETPW} == "y" ]]; then
|
||||
printf 'You are about to set a new password for a Nextcloud user.\n\nDo not use this option if your Nextcloud is configured to use mailcow for authentication.\nSet a new password for the corresponding mailbox in mailcow, instead.\n\n'
|
||||
|
27
update.sh
27
update.sh
@ -177,38 +177,35 @@ remove_obsolete_nginx_ports() {
|
||||
|
||||
detect_docker_compose_command(){
|
||||
if ! [ "${DOCKER_COMPOSE_VERSION}" == "native" ] && ! [ "${DOCKER_COMPOSE_VERSION}" == "standalone" ]; then
|
||||
if docker compose > /dev/null 2>&1; then
|
||||
if docker compose version --short | grep "2." > /dev/null 2>&1; then
|
||||
DOCKER_COMPOSE_VERSION=native
|
||||
COMPOSE_COMMAND="docker compose"
|
||||
if command -v docker compose > /dev/null 2>&1; then
|
||||
version=$(docker compose version --short)
|
||||
if [[ $version =~ ^2\.([0-9]+)\.([0-9]+) ]]; then
|
||||
COMPOSE_VERSION=native
|
||||
echo -e "\e[31mFound Docker Compose Plugin (native).\e[0m"
|
||||
echo -e "\e[31mSetting the DOCKER_COMPOSE_VERSION Variable to native\e[0m"
|
||||
sleep 2
|
||||
echo -e "\e[33mNotice: You'll have to update this Compose Version via your Package Manager manually!\e[0m"
|
||||
echo -e "\e[33mNotice: You´ll have to update this Compose Version via your Package Manager manually!\e[0m"
|
||||
else
|
||||
echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m"
|
||||
echo -e "\e[31mPlease update/install it manually regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m"
|
||||
echo -e "\e[31mPlease update/install manually regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m"
|
||||
exit 1
|
||||
fi
|
||||
elif docker-compose > /dev/null 2>&1; then
|
||||
if ! [[ $(alias docker-compose 2> /dev/null) ]] ; then
|
||||
if docker-compose version --short | grep "^2." > /dev/null 2>&1; then
|
||||
DOCKER_COMPOSE_VERSION=standalone
|
||||
COMPOSE_COMMAND="docker-compose"
|
||||
elif command -v docker-compose > /dev/null 2>&1; then
|
||||
version=$(docker-compose version --short)
|
||||
if [[ $version =~ ^2\.([0-9]+)\.([0-9]+) ]]; then
|
||||
COMPOSE_VERSION=standalone
|
||||
echo -e "\e[31mFound Docker Compose Standalone.\e[0m"
|
||||
echo -e "\e[31mSetting the DOCKER_COMPOSE_VERSION Variable to standalone\e[0m"
|
||||
sleep 2
|
||||
echo -e "\e[33mNotice: For an automatic update of docker-compose please use the update_compose.sh scripts located at the helper-scripts folder.\e[0m"
|
||||
else
|
||||
echo -e "\e[31mCannot find Docker Compose with a Version Higher than 2.X.X.\e[0m"
|
||||
echo -e "\e[31mPlease update/install regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m"
|
||||
echo -e "\e[31mPlease update/install manually regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
else
|
||||
echo -e "\e[31mCannot find Docker Compose.\e[0m"
|
||||
echo -e "\e[31mPlease install it regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m"
|
||||
echo -e "\e[31mPlease install it manually regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user